使用 OpenCV 进行三角形检测

Posted

技术标签:

【中文标题】使用 OpenCV 进行三角形检测【英文标题】:Triangle detection using OpenCV 【发布时间】:2018-02-28 05:27:32 【问题描述】:

我有以下示例图片:

我想用白色填充这些角的三角形。我如何使用 OpenCV 检测到它们?当然,在这个特定的示例中,我可以只依靠渐变或亮度。不过,未来图像的形状不会那么完美,所以我正在考虑一些形状检测。

我听说形状通常可以通过例如霍夫变换来检测。但我不知道我应该从什么开始。

OpenCV 中的轮廓检测没有帮助,因为它找到了太多候选对象。 我尝试使用 size = 3 的 approxPolyDP,但也没有结果(没有找到此类对象)。

这些三角形将永远是三角形,但它们不需要每次都接触条形。它们总是位于图像的边缘。它们共享大致相同的区域。

我希望能够检测三角形并在某个容器中收集与这些三角形对应的点。

【问题讨论】:

轮廓检测中的错误是双重的:首先,OpenCV 会找到图像 白色 部分的轮廓,因此您需要将其反转。但是,即使您确实反转了它,另一个阻止您的问题是至少底部的两个三角形连接到条形。你说你会有比这些更难的图像——最好先发布你更难的例子。例如。它们总是直角三角形吗?他们会一直处于边缘吗?这些三角形有什么属性? @AlexanderReynolds 不幸的是,我还没有更硬的图像。这些三角形将永远是三角形,但它们不需要每次都接触条形。它们总是在图像的边缘。它们共享大致相同的区域。 【参考方案1】:

我可以使用以下代码检测三角形。我正在查找图像中的所有轮廓,然后使用 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 验证答案是否给出预期结果 顺便说一句,在三角形边界触摸条的情况下,OpenCV 在正确识别方面似乎存在一些问题。您是否知道,在这些情况下,如何改进该算法以正确检测三角形?我的意思是,正如您在图片中看到的那样,有部分三角形未被检测到。 一种方法是使用腐蚀。这样,您可以删除连接边缘。见here

以上是关于使用 OpenCV 进行三角形检测的主要内容,如果未能解决你的问题,请参考以下文章

[OpenCV实战]31 使用OpenCV将一个三角形仿射变换到另一个三角形

OpenCV探索之路(十五):角点检测

OpenCV-几何形状颜色识别 #导入MD文档图片#

带有opencv的三角形蒙版

Java中OpenCV和OpenGL与俄罗斯方块游戏的连接

从捕获的帧中裁剪三角形 - OpenCV 和 C++