python opencv图像自动分割与矩形透视复原
Posted 怪皮蛇皮怪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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图像自动分割与矩形透视复原的主要内容,如果未能解决你的问题,请参考以下文章