6

如何识别另一个轮廓内的轮廓?我试图通过许多 OpenCV 教程,但我无法识别它。请一些专家提供简单的代码来解释它吗?

这是我的输入文件

在此处输入图像描述

这个黑暗的部分是我需要识别的轮廓。

在此处输入图像描述

请善待与我分享您的经验。

4

2 回答 2

3

对 JavaCV 不太满意,所以这就是我在 OpenCV 和 C(古老的东西)中解决这个问题的方法:

  1. 使用cvFindContours()
  2. 在这些轮廓上运行两个循环(迭代指针h_next或 JavaCV 中的任何内容)。对于外循环中的每个轮廓,将其与基于 检测到的每个其他轮廓匹配。. .
  3. 计算每个轮廓的边界框。这将是一个CvRect结构。
  4. 将两者传递CvRects给计算两个矩形之间相交(重叠)面积的函数。
  5. 如果这个面积等于两个矩形中较小一个的面积,则较小矩形对应的轮廓完全被较大的矩形包围。

    这是查找相交区域的代码。它一定是在某个地方漂浮在网络上。

    CvRect intersect(CvRect r1, CvRect r2) { CvRect intersection;

    // find overlapping region
    intersection.x = (r1.x < r2.x) ? r2.x : r1.x;
    intersection.y = (r1.y < r2.y) ? r2.y : r1.y;
    intersection.width = (r1.x + r1.width < r2.x + r2.width) ?
        r1.x + r1.width : r2.x + r2.width;
    intersection.width -= intersection.x;
    intersection.height = (r1.y + r1.height < r2.y + r2.height) ?
        r1.y + r1.height : r2.y + r2.height;
    intersection.height -= intersection.y;    
    
    // check for non-overlapping regions
    if ((intersection.width <= 0) || (intersection.height <= 0)) {
        intersection = cvRect(0, 0, 0, 0);
    }
    
    return intersection;
    

    }

于 2012-07-13T04:23:13.237 回答
2

这是 Python 代码中的一个简单方法。( But as I stated in my comment below, It is not an universal answer applicable everywhere, It is just to show finding contour inside a contour can be done. And if your images are different, then you have to come with some different constraints other than i mentioned below)

找到 Contours 后你要做的是,检查每个轮廓的面积是否小于指定值(我给了 10000,只是一个猜测),如果不是,它是更大的轮廓,避免它。如果小于指定值,它可能是我们旁边的正方形或矩形。

所以我们找到它的宽度和高度并检查纵横比是否接近1。如果是,它就是我们的正方形。

import cv2
import numpy as np

img = cv2.imread('sofcnt.jpg')
gray = cv2.imread('sofcnt.jpg',0)

ret,thresh = cv2.threshold(gray,127,255,1)

cont,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

for cnt in cont:
    approx = cv2.approxPolyDP(cnt,0.02*cv2.arcLength(cnt,True),True)
    if cv2.contourArea(cnt) < 10000:
        x,y,w,h = cv2.boundingRect(cnt)
        if w/float(h) < 2:
            cv2.drawContours(img,[cnt],0,255,-1)


cv2.imshow('a',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果 :

在此处输入图像描述

于 2012-07-12T14:40:49.250 回答