opencv识别三角形android,使用OpenCV进行三角检测

我有以下示例图片:

25be6f274161e839d9c222be5798a8d9.png

我想用白色填充角落里的这些三角形。我怎么能用OpenCV检测它们?当然,在这个特定的样本中,我可以只依靠渐变或亮度。然而,在未来的图像将不会如此完美的形状,所以我正在考虑一些形状检测。

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

OpenCV中的轮廓检测没有帮助,因为它找到了太多的候选者。

我尝试使用size = 3的approxPolyDP,但也没有结果(没有找到这样的对象)。

先感谢您。

UPD:这些三角形将始终为三角形,但每次都不需要触摸条形。它们总是处于图像的边缘。它们之间的区域大致相同。

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

轮廓检测中的误差有两个:首先,OpenCV找到图像白色部分的轮廓,因此需要将其反转。 但是,即使您将其反转,另一个阻止您的问题是至少底部的两个三角形连接到条形。 你声明你的图像比这些更难 - 最好先发布你的更难的例子。 例如。 它们总是直角三角形吗? 他们总是处于边缘吗? 这些三角形有哪些属性?

@AlexanderReynolds不幸的是,我还没有更难的图像。 这些三角形将始终为三角形,但每次都不需要触摸条形。 它们总是处于图像的边缘。 它们共享大致相同的区域。

我可以用下面的代码检测三角形。 我发现图像中的所有轮廓然后使用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)

输出图像

033b008d0261e3031528756bbf90a3e0.png

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

谢谢。 但是你能检测到与三角形相对应的点吗? 我的意思是将所有这些点收集到一些容器中。

我修改了答案以获取所有坐标列表。

@newt验证答案是否给出预期结果

是的,它有效,非常感谢!

顺便说一句,如果三角形边界触摸条,OpenCV似乎在正确识别方面存在一些问题。 您是否知道,在这些情况下如何改进此算法以正确检测三角形? 我的意思是,正如您在图片上看到的那样,有三角形的部分未被检测到。

一种方法可以是使用侵蚀。 这样您就可以删除连接边缘。 看这里

你可能感兴趣的:(opencv识别三角形android,使用OpenCV进行三角检测)