检测图像中的特定角点 - OpenCV - Python

时间:2017-01-05 16:07:52

标签: python opencv image-processing

我是使用OpenCV的新手,我在检测图像中的角时遇到问题。假设我有一个像这样的图像网格,那里有多个角落。

enter image description here

我想抓住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

先谢谢你们

2 个答案:

答案 0 :(得分:0)

如果网格处于图像中的通用位置,则没有简单的解决方案。 Harris滤波器甚至可能无法检测到网格极值角,具体取决于图像本身的质量。对于稳健的解决方案,您需要明确地模拟检测到的角的图形的拓扑(即找出哪个角是网格中哪些角的邻居)。 Here是一个如何针对棋盘的情况进行此操作的示例。

对于不太稳健的解决方案,您可以计算检测到的角分布的凸包,然后将4条线拟合到它。这些线的交叉点将产生极端的角落。

答案 1 :(得分:0)

我有另一种使用轮廓的解决方案。

  1. 将图像转换为灰度
  2. 获取二进制图像
  3. 执行形态学关闭操作
  4. 查找外部轮廓

    contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

  5. 获取此轮廓周围的边界矩形。您将获得此矩形的坐标,这是网格的角落

    cnts = contours[0] x,y,w,h = cv2.boundingRect(cnts)

  6. enter image description here

    1. 在网格上绘制角落

      cv2.circle(im,(x,y), 3, (0,0,255), -1) cv2.circle(im,(x+w,y), 3, (0,0,255), -1) cv2.circle(im,(x+w,y+h), 3, (0,0,255), -1) cv2.circle(im,(x,y+h), 3, (0,0,255), -1) cv2.imshow("Corners of grid", img)

    2. enter image description here