如何识别另一个轮廓内的轮廓?我试图通过许多 OpenCV 教程,但我无法识别它。请一些专家提供简单的代码来解释它吗?
这是我的输入文件
这个黑暗的部分是我需要识别的轮廓。
请善待与我分享您的经验。
如何识别另一个轮廓内的轮廓?我试图通过许多 OpenCV 教程,但我无法识别它。请一些专家提供简单的代码来解释它吗?
这是我的输入文件
这个黑暗的部分是我需要识别的轮廓。
请善待与我分享您的经验。
对 JavaCV 不太满意,所以这就是我在 OpenCV 和 C(古老的东西)中解决这个问题的方法:
cvFindContours()
h_next
或 JavaCV 中的任何内容)。对于外循环中的每个轮廓,将其与基于 检测到的每个其他轮廓匹配。. .CvRect
结构。CvRects
给计算两个矩形之间相交(重叠)面积的函数。如果这个面积等于两个矩形中较小一个的面积,则较小矩形对应的轮廓完全被较大的矩形包围。
这是查找相交区域的代码。它一定是在某个地方漂浮在网络上。
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;
}
这是 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()
结果 :