使用OpenCV在Python中检测不完整形状的角落

4

我正在开发一个程序,用于检测页面上形状的边缘,然后裁剪和包装图像以放大形状。但问题是我的形状只由每个角上的标记限定。以下是我尝试处理的示例图像:

Example

我该如何确定图像的角落?我尝试过轮廓分析和特征匹配算法,但它们都不能给我所需的可靠性。

由于我对计算机视觉比较陌生,是否有一个方便的函数能够解决我的问题?

谢谢!

编辑:由于光照变量,我添加了一个示例图像来说明我要处理的内容:

Image Raw


你有没有看过cv2.goodFeaturesToTrack()这个函数? - mark jay
2个回答

0

我建议尝试使用cv2.goodFeaturesToTrack()。你可以直接从openCV文档LINK中复制/粘贴代码。

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

img = cv2.imread('test.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
blur = cv2.bilateralFilter(gray, 16, 50, 50)

corners = cv2.goodFeaturesToTrack(blur, 40, 0.1, 10)
corners = np.int0(corners)

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

plt.circle(img, (x, y), 3, 255, -1)
plt.show()

我得到的是results

你可能想要尝试一下双边滤波器和goodFeaturesToTrack参数。

另一种选择是使用角点的匹配过滤器(这样你就不会在单词上得到所有的命中)。


我尝试使用好的特征进行跟踪,但是一旦我拍摄了来自手机或类似设备的真实世界照片,光照中的渐变就会让goodFeaturesToTrack难以应对。 - agupta231
我明白了。良好的照明可以使处理变得更加容易,但双边滤波器可以稍微帮助一下。你能分享一张这样的真实世界图像吗? - mark jay
我修改了原始帖子并包含了一个示例图像。 - agupta231

0
你需要做的是使用cv2.findContours()找到给定图像中的所有轮廓,然后找到每个轮廓的边界矩形,并在所有轮廓矩形中找到最小X、最小Y、最大X、最大Y,这将给你一个外部边界矩形,覆盖所有较小的轮廓,从而得到你想要的结果。
import cv2
import numpy as np

img = cv2.imread("/Users/anmoluppal/Downloads/mjut8.png", 0)

# Threshold and Invert the image to find the contours
ret, thresh = cv2.threshold(img, 10, 255, cv2.THRESH_BINARY_INV)

# Find the contours
im, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

x, y, r, b = [img.shape[1]/2, img.shape[0]/2, 0, 0]
# Iterate over all the contours, and keep updating the bounding rect

for cnt in contours:
    rect = cv2.boundingRect(cnt)
    if rect[0] < x:
        x = rect[0]
    if rect[1] < y:
        y = rect[1]
    if rect[0] + rect[2] > r:
        r = rect[0] + rect[2]
    if rect[1] + rect[3] > b:
        b = rect[1] + rect[3]

bounding_rect = [x, y, r-x, b-y]

# Debugging Purpose.
cv2.rectangle(img, (x, y), (r, b), np.array([0, 255, 0]), 3)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接