python opencv图像自动分割与矩形透视复原

Posted 怪皮蛇皮怪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python opencv图像自动分割与矩形透视复原相关的知识,希望对你有一定的参考价值。

python opencv图像自动分割与矩形透视复原

序言

之前做了另外一个图像提取和透视复原的算法,但是那个需要手动设置长宽比才能较好的显示出矫正后的矩形,但是很多时候手动设置是偏麻烦的方法
而且我认为一个长方形,首先就默认了长宽固定,垂直等因素,我觉得长宽比是可以计算的
(虽然最后还是没找出来怎么计算就是了)

输入

这篇效果相比之前的提高了一点点,不需要手动设置矩形的长宽,只需要确定矩形在图片中的四个角点就能自动提取并复原矩形

这篇输入的四个点的顺序是 右下,左下,左上,右上

代码

import cv2
import math
import numpy as np



def Perspective_transform(box,original_img):
    # 获取画框宽高(x=orignal_W,y=orignal_H)
    orignal_W = math.ceil(np.sqrt((box[3][1] - box[2][1])**2 + (box[3][0] - box[2][0])**2))
    orignal_H= math.ceil(np.sqrt((box[3][1] - box[0][1])**2 + (box[3][0] - box[0][0])**2))

    # 原图中的四个顶点,与变换矩阵
    pts1 = np.float32([box[0], box[1], box[2], box[3]])
    pts2 = np.float32([[int(orignal_W+1),int(orignal_H+1)], [0, int(orignal_H+1)], [0, 0], [int(orignal_W+1), 0]])

    # 生成透视变换矩阵;进行透视变换
    M = cv2.getPerspectiveTransform(pts1, pts2)
    result_img = cv2.warpPerspective(original_img, M, (int(orignal_W+3),int(orignal_H+1)))

    return result_img

def mouse_click(event, x, y, flags, para):
    global box
    if event == cv2.EVENT_LBUTTONDOWN:  # 左边鼠标点击
        box.append([x, y])
        print('顶点: ({},{})'.format( x, y))

if __name__=="__main__":
    input_dir = './1.jpg_upScalePic.jpg'

    # box=[[718,447],[385,351],[394,725],[713,696]]
    box=[]
    original_img = cv2.imread(input_dir)

    cv2.namedWindow("img")
    cv2.setMouseCallback("img", mouse_click)
    count=0
    while True:
        count+=1
        print(count)
        cv2.imshow('img', original_img)
        if cv2.waitKey() == ord('q'):
            break

    print(box)
    cv2.destroyAllWindows()
    result_img = Perspective_transform(box,original_img)
    # cv2.imshow("original", original_img)
    cv2.imshow("result_img", result_img)

    cv2.waitKey(0)
    cv2.destroyAllWindows()


以上是关于python opencv图像自动分割与矩形透视复原的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中积分图介绍与应用

Python + OpenCV:OCR 图像分割

车牌的Opencv图像分割

openCV进阶之二:自动校准扫描图像生成鸟瞰图

OpenCV-Python系列八:提取图像轮廓

OpenCV+Python 文字识别(重点图像透视变换)