【问题标题】:Detect specific corners in image - OpenCV - Python检测图像中的特定角 - OpenCV - Python
【发布时间】:2017-01-05 16:07:51
【问题描述】:

我是使用 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 开始

提前谢谢大家

【问题讨论】:

  • 可能你可以尝试对图像使用霍夫变换。这将为您提供图像中所有线段的坐标(开始,结束)。然后,如果正方形未在图像中旋转,您可以将它们与角哈里斯中找到的角进行比较。

标签: python opencv image-processing


【解决方案1】:

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

  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)

  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】:

    如果网格位于图像中的通用位置,则没有简单的解决方案。根据图像本身的质量,Harris 过滤器甚至可能无法检测到网格极值角。对于一个健壮的解决方案,您需要显式地对检测到的角图的拓扑进行建模(即找出哪个角是网格中哪个角的邻居)。 Here 是一个示例,说明如何在棋盘格的情况下完成此操作。

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

    【讨论】:

      猜你喜欢
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多