opencv识别三角形android,使用OpenCV进行三角检测
我有以下示例图片:

我希望通过填充白色来突出这些位于画面角落中的三角形。为了实现这一目标,请问如何利用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)
输出图像

您可以在坐标列表中获取轮廓。
好的!感谢您的回应!请问您是否能够识别出与三角形对应的点?我的意思是说,请您将所有的这些点组织起来存储在一个容器中。
我修改了答案以获取所有坐标列表。
@newt验证答案是否给出预期结果
是的,它有效,非常感谢!
顺便提一句,在使用OpenCV处理带有边界触控条的三角形识别时,请注意该算法在准确性方面确实存在一些局限性。 您是否有相关建议? 从图中可以看到,在某些情况下检测结果未能涵盖所有三角形区域。
一种方法可以是使用侵蚀。 这样您就可以删除连接边缘。 看这里
