使用OpenCV进行三角形检测

7

我有以下示例图像:

enter image description here

我想用白色填充这些三角形角落。如何使用OpenCV检测它们?当然,在这个特定的样本中,我可以依靠梯度或亮度。但是,未来的图像不会有这么完美的形状,所以我正在考虑一些形状检测。
我听说,例如,霍夫变换通常可以检测到形状。但是我不知道该从哪里开始。
在OpenCV中进行轮廓检测并没有帮助,因为它找到了太多的候选者。我尝试使用size = 3的approxPolyDP,但也没有结果(没有发现这样的对象)。
这些三角形将始终是三角形,但它们不需要每次都接触棒子。它们总是在图像的边缘。它们之间大致共享相同的面积。
我想能够检测三角形并将对应于这些三角形的点收集到某个容器中。

3
你轮廓检测的错误有两个方面:首先,OpenCV会找到图像中白色部分的轮廓,所以你需要反转它。但即使你反转了它,仍会遇到另一个问题,至少底部的两个三角形连接到了条形码。你说你会有比这更难的图像,最好先发布更难的例子。例如,它们是否总是直角三角形?它们是否总在边缘?这些三角形具有什么属性? - alkasm
@AlexanderReynolds 很抱歉,我还没有更难的图像。这些三角形始终是三角形,但它们不需要每次都接触到栏杆。它们始终位于图像的边缘。它们大致共享相同的区域。 - newt
1个回答

10
我能够使用下面的代码检测三角形。我在图像中找到所有轮廓,然后使用approxPolyDP函数找到了三角形。
import cv2
import numpy as np
image_obj = cv2.imread('image.jpg')

gray = cv2.cvtColor(image_obj, cv2.COLOR_BGR2GRAY)

kernel = np.ones((4, 4), np.uint8)
dilation = cv2.dilate(gray, kernel, iterations=1)

blur = cv2.GaussianBlur(dilation, (5, 5), 0)


thresh = cv2.adaptiveThreshold(blur, 255, 1, 1, 11, 2)

# Now finding Contours         ###################
_, contours, _ = cv2.findContours(
    thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
coordinates = []
for cnt in contours:
        # [point_x, point_y, width, height] = cv2.boundingRect(cnt)
    approx = cv2.approxPolyDP(
        cnt, 0.07 * cv2.arcLength(cnt, True), True)
    if len(approx) == 3:
        coordinates.append([cnt])
        cv2.drawContours(image_obj, [cnt], 0, (0, 0, 255), 3)

cv2.imwrite("result.png", image_obj)

输出图像 在此输入图像描述

您可以获取轮廓的坐标列表。


谢谢。但是你能检测出对应于三角形的点吗?我的意思是将所有这些点收集到某个容器中。 - newt
我已经修改了答案,以获取所有坐标列表。 - Amarpreet Singh
@newt 验证答案是否符合预期结果 - Amarpreet Singh
顺便说一下,似乎OpenCV在三角形边界与条形相接触的情况下存在一些识别问题。你知道怎么改进这个算法以正确检测这些情况下的三角形吗?我的意思是,正如你在图片上看到的那样,有些三角形的部分没有被检测到。 - newt
1
一种方法是使用腐蚀。这样可以去除连接边缘。请参见此处 - Amarpreet Singh

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