Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV 2.3:如何将每个轮廓的所有孔放入子向量?_C++_Opencv_Vector - Fatal编程技术网

C++ OpenCV 2.3:如何将每个轮廓的所有孔放入子向量?

C++ OpenCV 2.3:如何将每个轮廓的所有孔放入子向量?,c++,opencv,vector,C++,Opencv,Vector,对于每个轮廓,我想将其孔放入单独的向量。默认情况下,在OpenCV 2.*中,我们有两个选项-使用OpenCV 1.*树结构,并在其中进行迭代,当然,我们可以从findContours中获取vector,这有点简化,但与OpenCV 1.0类似,它依赖于std::vector。当你需要知道继承时,树就是一个栅栏——“什么被放在什么里面”。但通常你真的只需要一组区域和它的洞。(用于矢量化和类似任务) 目前我有这样的代码: #include <opencv2/opencv.hpp> u

对于每个轮廓,我想将其孔放入单独的向量。默认情况下,在OpenCV 2.*中,我们有两个选项-使用OpenCV 1.*树结构,并在其中进行迭代,当然,我们可以从
findContours
中获取
vector
,这有点简化,但与OpenCV 1.0类似,它依赖于
std::vector
。当你需要知道继承时,树就是一个栅栏——“什么被放在什么里面”。但通常你真的只需要一组区域和它的洞。(用于矢量化和类似任务)

目前我有这样的代码:

#include <opencv2/opencv.hpp>

using namespace cv;
int main(  )
{
    Mat black = Mat::zeros(Size(100, 100), CV_8UC1);
    for(int i = 0; i <= 35; ++i)
    {
        for (int k = 0; k <=35; ++k)
        {
            black.row(i).col(k) = 255;
        }
    }

    for(int i = 10; i <= 15; ++i)
    {
        for (int k = 10; k <=15; ++k)
        {
            black.row(i).col(k) = 0;
        }
    }

    for(int i = 25; i <= 30; ++i)
    {
        for (int k = 25; k <=30; ++k)
        {
            black.row(i).col(k) = 0;
        }
    }

    for(int i = 45; i <= 75; ++i)
    {
        for (int k = 45; k <= 75; ++k)
        {
            black.row(i).col(k) = 255;
        }
    }

    for(int i = 55; i <= 65; ++i)
    {
        for (int k = 55; k <=65; ++k)
        {
            black.row(i).col(k) = 0;
        }
    }

    for(int i = 57; i <= 62; ++i)
    {
        for (int k = 57; k <=62; ++k)
        {
            black.row(i).col(k) = 255;
        }
    }

    namedWindow("Display Image", CV_WINDOW_AUTOSIZE);
    imshow("Display Image", black);

    std::vector< std::vector<Point> > contours;
vector<Vec4i> hierarchy;
if(sum(black).val[0] > 0.0)
{
    findContours(black, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
}
else
{
    std::cout << "It's a black image, so I'm not going to do anything..." << std::endl;
}

for(int i = 0; i < contours.size(); ++i)
{
    std::cout << "counter " << i << ":" << std::endl;
    std::cout <<  hierarchy[i][0]  << " "  << hierarchy[i][1] << " " <<  hierarchy[i][2]  << hierarchy[i][3]  << std::endl;

    for (int k = 0; k < contours[i].size(); ++k)
    {
        std::cout << "\t point " << k << " x: " << contours[i][k].x << "; y: " <<  contours[i][k].y << std::endl;
    }
}

    waitKey(0);
    std::cin.get();
    return 0;
}

关于如何使其更健壮和更符合C++标准,您有没有尝试将其提取为等高线树?在findContours上使用CV_RETR_树标志,它应该会给你想要的东西。

你的意思是拥有
std::map>等高线调用
查找轮廓(黑色、等高线、等高线树、等高线链近似简单)?这将不会编译(
error C2665:'cv::findContours':两个重载都不能转换所有参数类型
),而这
std::vector>是等高线+
查找轮廓(黑色、等高线、等高线树、等高线链近似简单)将编译并在运行时终止,OpenCV错误:断言失败(type==type0 | | |)(CV_MAT_CN(type)==CV_MAT_CN(type0)&&((1
struct vector_object
{
    std::vector<Point> border;
    std::vector< std::vector<Point> > holes;
};

std::vector<vector_object> container;

void store_vector_hole(std::vector< std::vector<Point> > &holes, std::vector< std::vector<Point> > & contours, std::vector<Vec4i> & hierarchy, const int & cid);
void store_vectror_countors(std::vector< std::vector<Point> > & contours, std::vector<Vec4i> & hierarchy, const int & cid);


void store_vector_hole(std::vector< std::vector<Point> > &holes, std::vector< std::vector<Point> > & contours, std::vector<Vec4i> & hierarchy, const int & cid)
{
    holes.push_back(contours[cid]);
    if (hierarchy[cid][2] >= 0) // holes in holes == real poligons
    {
        store_vectror_countors( contours, hierarchy, hierarchy[cid][2]);
    }
    if (hierarchy[cid][0] >= 0) // holes on same level of depth == another holes of this poligon
    {
        store_vector_hole(holes, contours, hierarchy, hierarchy[cid][0]);
    }
    return;

}
void store_vectror_countors(std::vector< std::vector<Point> > & contours, std::vector<Vec4i> & hierarchy, const int & cid)
{
    if (hierarchy[cid][0]>= 0)
        store_vectror_countors(contours, hierarchy, hierarchy[cid][0]);

    vector_object current;
    current.border = contours[cid];

    if ((hierarchy[cid][0]<= 0) && (hierarchy[cid][2] <= 0))
    {
            container.push_back(current);
            return;
    }

    if(hierarchy[cid][2] >= 0) // h
    {
        store_vector_hole(current.holes, contours, hierarchy, hierarchy[cid][2]);
    }

    container.push_back(current);
    return;

}
//...
findContours(black, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
store_vectror_countors(contours, hierarchy, 0);