如何使用opencv在图像中找到近似三角形

时间:2018-06-13 09:16:32

标签: opencv

我有这个图片: Original image

我想找到像这样的等腰直角三角形: Triangle found

我该怎么办?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您可以尝试模糊图像,转换为灰度并对图像应用不同的阈值。下一步是查找和排列您的轮廓,并可能使用限制尺寸过滤它们。

import cv2
import numpy as np

img = cv2.imread('triangle.png')
blur = cv2.GaussianBlur(img,(5,5),0)
values = [30, 40, 50, 60, 70, 80, 90]
gray_image = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
for i in values:
    ret, threshold = cv2.threshold(gray_image,i,255,cv2.THRESH_BINARY)
    im, contours, hierarchy = cv2.findContours(threshold,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
    area = sorted(contours, key=cv2.contourArea, reverse=True)
    for j in range(1, len(area)):
        contour = area[j]
        size = cv2.contourArea(contour)
        if 10 < float(size) < 140000:
            cv2.drawContours(img, [contour], -1, (0,255,0), 2)
cv2.imshow('img', img)

结果:

enter image description here

注意:

转换到不同的色彩空间并应用不同的阈值可以改善重新开始。

答案 1 :(得分:0)

(注意我在继续操作之前手动裁剪图像中的图形部分)

<强>步骤:

  1. 将图像转换为HSV色彩空间并提取色调频道。
  2. enter image description here

    1. 色调频道上执行了Otsu阈值。
    2. enter image description here

      1. 标记的轮廓与三角形的形状非常相似。

        • 首先,找到每个轮廓的周长。
        • 使用周长来近似轮廓周围的闭合曲线,可能有几行。这种技术称为Ramer–Douglas–Peucker algorithm
        • 检查包围轮廓的曲线数是否为3.如果是绘制它。
      2. 我能够获得以下内容:

        enter image description here