【问题标题】:Opencv Corner DetectionOpencv角点检测
【发布时间】:2016-11-06 10:49:50
【问题描述】:

我有这样的图像:

当我尝试使用任何角检测算法时,我会得到这样的角:

但是我想要矩形的角。

我怎样才能摆脱那些我不想要的角落。

这是我的代码

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("/home/mkmeral/Desktop/opencv/cropped.png")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,4,0.01,10)
corners = np.int0(corners)

for i in corners:
    x,y = i.ravel()
    cv2.circle(img,(x,y),3,255,-1)

plt.subplot(121),plt.imshow(img)
plt.title('2'), plt.xticks([]), plt.yticks([])
plt.suptitle("CORNERS")

cv2.imwrite("/home/mkmeral/Desktop/opencv/corners.png", img)

plt.show()

这是整个图像,我将图像裁剪以使其更小。

这是我需要角落的地方:

【问题讨论】:

  • 你的形象不是已经有缺陷了吗?对象与图像边缘重叠?
  • 是的,但这不是整个图像。我在发布之前裁剪了它。我的坏:/
  • 如果可以的话,请把整张图贴出来,这样会更容易解决问题。
  • 也许您可以发布另一张图片,显示您认为角落的位置。
  • "我想要矩形的角" -- 什么矩形?

标签: python opencv corner-detection


【解决方案1】:

由于您的图像的分辨率相当差并且与矩形相似,因此任何解决方案都会在某种程度上在旁观者的眼中。

您可以使用 OpenCV 执行此操作,但我只是在命令行中解释使用 ImageMagick 的方法。因此,将图像阈值设为 50% 的黑白,然后进行 “斑点分析” 或 “连通分量分析”。

convert rect.png -threshold 50%              \
   -define connected-components:verbose=true \
   -connected-components 8 result.png

输出

Objects (id: bounding-box centroid area mean-color):
  0: 160x120+0+0 78.0,58.7 18551 srgb(0,0,0)
  1: 52x50+97+58 121.8,82.6 649 srgb(255,255,255)

所以,如果我们看最后一行,我们有一个 52x50 像素的对象,面积为 649 像素,颜色为白色——这就是你的形状——或者我认为的燃烧香烟!让我们把它画进去:

convert rect.png -stroke red -fill none -draw "rectangle 97,58 148,107" y.png

现在,如果它是你所说的矩形,它的长度大约等于封闭框的对角线,所以

L = sqrt(52*52 + 50*50) = 72

它的面积是 649,所以它的宽度大约是 9 像素,从左上角开始 +97+58。或者它的质心在 121.8,82.6。所以,所需要的只是一个小学生几何来获得你的角点。

【讨论】:

    【解决方案2】:

    我发现通过调整传递给cv2.cornerHarris() 的参数,我可以正确识别角。

    例如给定这个输入图像:

    我们可以使用以下方法捕获角点(注意传递给cornerHarris()的参数:

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img_file = 'a.jpg'
    
    img = cv2.imread(img_file, 0)
    img = np.float32(img)
    
    '''args:
    img - Input image, it should be grayscale and float32 type.
    blockSize - It is the size of neighbourhood considered for corner detection
    ksize - Aperture parameter of Sobel derivative used.
    k - Harris detector free parameter in the equation.
    '''
    corners = cv2.cornerHarris(img, 4, 3, 0.04)
    corners2 = cv2.dilate(corners, None, iterations=3)
    
    img2 = cv2.imread(img_file)
    img2[corners2>0.01*corners2.max()] = [255,0,0]
    
    plt.subplot(2, 1, 2)
    plt.imshow(img2, cmap = 'gray')
    plt.title('Canny Edge Detection')
    plt.xticks([])
    plt.yticks([])
    plt.show()
    

    输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 2015-09-02
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多