我是使用OpenCV的新手,我在检测图像中的角时遇到问题。假设我有一个像这样的图像网格,那里有多个角落。
我想抓住4个极端角落,用红色突出显示。
使用cv2.cornerHarris()
我已经设法真正准确地突出显示所有可能的角落,但我找不到调整这些值的方法,只留下4个极端。
这是我的代码:
import cv2
import numpy as np
filename = 'start.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,29,0.04)
#result is dilated for marking the corners, not important
dst = cv2.dilate(dst,None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,0,255]
cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
cv2.destroyAllWindows()
我从OpenCV官方网站获得了此代码,并且我调整了一些值。
任何人都可以提供帮助吗?我是在完全错误的方向吗?如果我还不清楚我想要的输出图像是我的问题,而我的代码只是给了我网格中所有可能的角落。
网格不是从坐标x开始,y = 0,0
先谢谢你们
答案 0 :(得分:0)
如果网格处于图像中的通用位置,则没有简单的解决方案。 Harris滤波器甚至可能无法检测到网格极值角,具体取决于图像本身的质量。对于稳健的解决方案,您需要明确地模拟检测到的角的图形的拓扑(即找出哪个角是网格中哪些角的邻居)。 Here是一个如何针对棋盘的情况进行此操作的示例。
对于不太稳健的解决方案,您可以计算检测到的角分布的凸包,然后将4条线拟合到它。这些线的交叉点将产生极端的角落。
答案 1 :(得分:0)
我有另一种使用轮廓的解决方案。
查找外部轮廓
contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
获取此轮廓周围的边界矩形。您将获得此矩形的坐标,这是网格的角落
cnts = contours[0]
x,y,w,h = cv2.boundingRect(cnts)