opencv求轮廓中心,opencv判断点在轮廓内
本文主要介绍python计算机视觉来确定opencv矩形轮廓的顶点位置。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
00-1010一、问题介绍二。解决问题的方法一、方法二。一些实现代码
目录
Opencv在图像处理方面有非常强大的功能。当我们需要使用opencv对一些图像进行校正时,通常需要找到原始图像的一些关键点,然后计算变换后图像的坐标,最后通过仿射变换或者透视变换得到我们想要的校正后的图像。比如纠正一张歪歪扭扭的纸,我们的首要任务就是找到原图的一些关键点。通常的做法是找到纸的四个顶点。
一、问题的引入
第一步,我们必须找到相应的纸的矩形轮廓,可以通过二值化或使用一些算子来搜索。本文的重点是如何确定矩形轮廓的具体四个顶点。
二、问题的解决方法
利用线性规划的方法,在opencv的坐标系中用两条直线x y=z1和x y=Z2切割轮廓。z1最大时,(x,y)为右下点,最小为左上点。z2最大时,(x,y)为右上点,最小为左下点,如下图:
从轮廓的角度来说,只要旋转角度不只是45或135,这种方法就没有问题。它得到的是轮廓对应的右下点、左上点、右上点、左下点,而不是原目标对应的点。就像当纸张旋转超过45时,这个方法得到的对于轮廓是正确的,而对于纸张是不正确的,如下图所示。
这时候你再像以前那样改正,就会得到一张横着的纸,这样里面的字就是横着的,这不是我们想要的。所以如果要用这种方法进行校正,就需要计算和判断图像的旋转角度。您可以通过以下代码获得角度:
# cnt3360输入轮廓,角度:返回角度
(x,y),(ma,MA),角度=cv2.fitEllipse(cnt)
方法一:
该方法首先利用轮廓获得其最小面积矩,然后可以观察和研究矩形的性质。根据当前形状,可以给出合适的X和Y判断公式。观察下图:
#求轮廓的最小力矩cnt:轮廓框:4点是不规则的
rect=cv2 . minarerect(CNT)
box=cv2.boxPoints(rect)
对于这样一个长宽比很高的矩形,我们的方法是把四个点按照Y从小到大排序,然后取前两个点按照X从小到大排序,小的是左下,大的是右下;后两个也是按x排序,小一点的是左上,大一点的是右上。如果是长宽比为x的矩形,我们可以先按照x的大小排序。从代码上看,这种实现可能更简洁,适用于特定的轮廓,角度要求会更广,除非旋转到上图右边这种情况,这样修正的概率一般很小。
方法二
1.下面是第一种方法实现的顶点定位。
将numpy作为np导入
导入cv2
def get 4 points(img : NP . ndarray,thed,n):
:param img形状为[高、宽、深]的彩色图像
:返回列表或元组中的4个点位置,例如: [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]
#灰度和二值化
gray=cv2.cvtColor(img,cv2。COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,thed,255,cv2。THRESH_BINARY)
#搜索大纲
contours,hierarchy=cv2.findContours(
二进制,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
#按轮廓长度选取需要轮廓
len_list = []
for i in range(len(contours)):
len_list.append(len(contours[i]))
#选第二长的
sy = np.argsort(np.array(len_list))[-n]
#寻找顶点
sum_list = []
dif_list = []
for i in contours[sy]:
sum = i[0][0]+i[0][1]
sum_list.append(sum)
dif_list.append(i[0][0]-i[0][1])
id_lb = np.argsort(np.array(sum_list))
id_lb2 = np.argsort(np.array(dif_list))
lu_id , rd_id = id_lb[0] , id_lb[-1]
ld_id , ru_id = id_lb2[0] , id_lb2[-1]
points = np.array([contours[sy][lu_id][0],contours[sy][rd_id][0],contours[sy][ld_id][0],contours[sy][ru_id][0]])
return points , contours , sy
2、下面是使用方法2实现的顶点定位
def getpoints(binary: np.ndarray , num: int ):
3、下面是一些展示代码
#展示顶点 def show_points(img , points): point_size = 8 point_color = (0, 0, 255) # BGR thickness = 4 # 可以为 0 、4、8 points_list = [tuple(i) for i in np.int32(points).reshape(-1,2)] for point in points_list: cv2.circle(img, point, point_size, point_color, thickness) img = cv2.resize(img,(808,808)) cv2.imshow(img,img) cv2.waitKey(0) cv2.destroyAllWindows() # cv2.imwrite(dd.jpg,img) #展示轮廓 def show_Contour(img , contours , sy): cv2.drawContours(img, contours , sy , (25, 254, 0), 4) img = cv2.resize(img,(808,808)) cv2.imshow(img,img) cv2.waitKey(0) cv2.destroyAllWindows() # cv2.imwrite(mm.jpg,img)
以上就是python计算机视觉opencv矩形轮廓顶点位置确定的详细内容,更多关于python opencv矩形轮廓顶点定位的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。