我的形状我想从中提取轮廓(我需要正确的轮廓数量 - 两个),但在层次结构中我得到4个或更多而不是两个轮廓。我只是无法意识到为什么,这是显而易见的,没有噪音,我以前曾使用过困境和侵蚀。
我试图更改所有参数,但没有。我也尝试了白色方块的图像,并没有工作。我有一句话:
echo "Usage: $0 {start|stop|restart|status}"
为什么轮廓如此断开?如何在层次结构中创建2个轮廓?
答案 0 :(得分:6)
在你的图像中有5个轮廓:2个外部轮廓,2个内部轮廓和1个右上角。
您可以丢弃内部和外部轮廓,看它们是CW还是CCW。您可以使用带有标记的contourArea执行此操作:
面向 - 面向区域标志。如果为true,则该函数返回有符号区域值,具体取决于轮廓方向(顺时针或逆时针)。使用此功能,您可以通过拍摄区域的符号来确定轮廓的方向。默认情况下,参数为false,表示返回绝对值。
因此,在红色中绘制外部轮廓,在绿色中绘制内部轮廓,您将得到:
然后,您可以在下面的代码中仅存储外部轮廓(请参阅externalContours
):
#include <opencv2\opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
// Load grayscale image
Mat1b B = imread("path_to_image", IMREAD_GRAYSCALE);
// Find contours
vector<vector<Point>> contours;
findContours(B.clone(), contours, RETR_TREE, CHAIN_APPROX_NONE);
// Create output image
Mat3b out;
cvtColor(B, out, COLOR_GRAY2BGR);
vector<vector<Point>> externalContours;
for (size_t i=0; i<contours.size(); ++i)
{
// Find orientation: CW or CCW
double area = contourArea(contours[i], true);
if (area >= 0)
{
// Internal contours
drawContours(out, contours, i, Scalar(0, 255, 0));
}
else
{
// External contours
drawContours(out, contours, i, Scalar(0, 0, 255));
// Save external contours
externalContours.push_back(contours[i]);
}
}
imshow("Out", out);
waitKey();
return 0;
}
请记住findContours
会破坏输入图像(您显示的第二张图片是垃圾)。只需将图像的克隆传递给findContours
,以避免损坏原始图像。