因此,我目前正在从事一个项目(与学校无关的任何项目),并且其中一部分涉及能够检测图片中的网格并将其投影到正方形图像上,这样我们就可以消除图像的任何倾斜可能有和类似的东西。现在的问题是我无法确定图像中的哪些点是网格的角。我已经尝试过使用霍夫变换,但是这样做的问题是会生成许多线,包括网格线,因此很难确定哪些检测到的线自动是网格的边缘。我还尝试使用轮廓检测器,该轮廓检测器虽然可以更准确地描绘出网格的边缘,但也会带来类似的问题。我无法找出哪些轮廓属于网格边缘,哪些轮廓表示网格线或只是杂项
霍夫变换结果的屏幕截图:
和轮廓检测结果的屏幕截图:
。
感谢您的任何帮助或建议。
答案 0 :(得分:0)
您可能需要浏览轮廓并找到最大的4面轮廓,以抓住网格的外部。
您将使用类似此帮助器功能(已处理为我的预处理图像)的
def largest_4_sided_contour(processed, show_contours=False):
_, contours, _ = cv2.findContours(
processed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
按区域对轮廓进行排序
contours = sorted(contours, key=cv2.contourArea, reverse=True)
查看最大的5个(如果超过5个,否则请全部查看)
for cnt in contours[:min(5, len(contours))]:
如果边数大约为4,那就是我们要寻找的那边,因此我们可以停止寻找并返回那边。
if len(approx(cnt)) == 4:
return cnt
return None
您的网格有一些不规则性,因此您可能需要进行一些预处理或寻找一定数量的边数,但是通常,通过查看轮廓区域并按边数缩小范围,您应该能够找出一些东西。
您提到过弯路,所以就是这一步:
def get_rectangle_corners(cnt):
''' gets corners from a contour '''
pts = cnt.reshape(cnt.shape[0], 2)
rect = np.zeros((4, 2), dtype="float32")
# the top-left point has the smallest sum whereas the
# bottom-right has the largest sum
s = pts.sum(axis=1)
rect[0] = pts[np.argmin(s)]
rect[2] = pts[np.argmax(s)]
# compute the difference between the points -- the top-right
# will have the minumum difference and the bottom-left will
# have the maximum difference
diff = np.diff(pts, axis=1)
rect[1] = pts[np.argmin(diff)]
rect[3] = pts[np.argmax(diff)]
return rect