c++ - 无法使用 findcontours 和 opencv 找到所有轮廓

标签 c++ opencv

我正在尝试使用 opencv findcontours 查找轮廓,但相当简单的图像中缺少一些轮廓。图像是在 create_mat() 函数中创建的,并且在 rbt 中使用 findcontours。我尝试使用以下方法更改 findcontours 中的模式:CV_RETR_EXTERNAL、CV_RETR_LIST ...我已经尝试了所有这些,并更改了方法:CV_CHAIN_APPROX_NONE ....

opencv版本为3.3

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc.hpp"
#include <opencv2/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#define SIZE_XX 750
#define SIZE_YY 3000
int im_mat[SIZE_XX][SIZE_YY];
cv::Mat create_mat(){
    for(int i=0;i <SIZE_XX;i++){
        int index=0;
        for(int j=0;j<SIZE_YY;j++){
            im_mat[i][j] = 0;
        }
    }
    Mat circle1 = cv::Mat(SIZE_XX,SIZE_YY,CV_8UC1,im_mat);
    int thickness = -1;
    int lineType = 8;
    circle( circle1,Point(10,60),25,Scalar(255),thickness,lineType );
    circle( circle1,Point(35,10),25,Scalar(255),thickness,lineType );
    rectangle( circle1,Point( 200,400),Point( 500, 600),Scalar( 255 ),-1,8 );
    circle( circle1,Point(350,35),25,Scalar(255),thickness,lineType );
    rectangle( circle1,Point( 1500,500),Point( 2098, 600),Scalar( 255 ),-1,8 );
    circle( circle1,Point(35,160),25,Scalar(255),thickness,lineType );
    circle( circle1,Point(2000,160),25,Scalar(255),thickness,lineType );
    rectangle( circle1,Point( 1000,0),Point( 1100, 200),Scalar( 255 ),-1,8 );
    rectangle( circle1,Point( 1800,25),Point( 1650, 200),Scalar( 255 ),-1,8 );
    rectangle( circle1,Point( 200,200),Point( 300, 300),Scalar( 255 ),-1,8 );
    rectangle( circle1,Point( 625,625),Point( 825, 750),Scalar( 255 ),-1,8 );
    rectangle( circle1,Point( 1300,35),Point( 1450, 400),Scalar( 255 ),-1,8 );
    return circle1;
}
void rbt(){
    Mat src= create_mat();
    Mat oi,oi2,oi3,oi4;
    src.copyTo(oi);
    cv::resize(oi, oi, cv::Size(), 0.5, 0.5);
    cv::imshow("test1",oi);
    cv::waitKey(1000);
    Mat gray;
    threshold(src, gray,0, 255,THRESH_BINARY);
    cv::resize(gray, oi2, cv::Size(), 0.5, 0.5);
    imshow("grays",oi2);
    Rect bounding_rect;
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    Mat cpy;
    gray.copyTo(cpy);

    findContours( cpy, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE  );

    RNG rg(12345);
    Mat destination(gray.rows, gray.cols, CV_8UC3, Scalar(255, 255, 255));
    for( int i = 0; i< contours.size(); i++ )
    {
        Scalar color = Scalar( rg.uniform(75, 175), rg.uniform(75,175), rg.uniform(75,175) );
        drawContours( destination, contours, i, color, -1,8,hierarchy );
        cv::resize(destination, oi3, cv::Size(), 0.5, 0.5);
        cv::imshow("drawing",oi3);
        cv::waitKey(1000);
    }
    waitKey(0);                                         
} 

我也尝试过先使用canny寻找边缘,但结果更糟。

图像是黑色背景,带有白色物体以找到轮廓。

我的轮廓图像丢失:(35,10) 和 (350,35) 处的圆圈以及 (1000,0) 处的矩形。

最佳答案

你的代码对我来说运行得很好!

enter image description here

我建议您提供更多关于输出图片不起作用的详细信息,并检查您是否链接到所有库等。

我所做的只是将您的代码复制并粘贴到我的 Visual Studio OpenCV 3.3.0 测试环境中。

关于c++ - 无法使用 findcontours 和 opencv 找到所有轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49490407/

相关文章:

C++ 通过继承实现的基于组件的架构被认为是好的做法吗?

c++ - 从符号中删除空格

从网络摄像头捕获图像并显示它 - OpenCV - Eclipse - Windows

c++ - 如何 const 映射变量

c++ - Datastax Cassandra C++ 驱动程序中核心连接和 i/o 线程之间的区别

c++ - 如何使用 openCV 检测图像中的字母?

linux - 在 CMake Linux 中包含 OpenCV

c++ - 底片全黑

C++ 段线相交

c - OpenCV 中的差异图像