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将每个轮廓写入单独的文件中_C++_Opencv - Fatal编程技术网

C++ OpenCV将每个轮廓写入单独的文件中

C++ OpenCV将每个轮廓写入单独的文件中,c++,opencv,C++,Opencv,是否可以将找到的每个闭合轮廓写入单独的图像文件 我有这样一个代码: //Finding contours vector<vector<Point> > img_contours; vector<Vec4i> hierarchy; findContours( img0, img_contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0,0) ); //Drawing contou

是否可以将找到的每个闭合轮廓写入单独的图像文件

我有这样一个代码:

//Finding contours  
vector<vector<Point> > img_contours;
vector<Vec4i> hierarchy;
findContours( img0, img_contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0,0) );

//Drawing contours  
Mat contours_closed = Mat::zeros( img0.size(), CV_8UC1 );
RNG rng(12345);
int counter_closed_contours = 0;
for (int i = 0; i < img_contours.size(); i++) {
    double area = contourArea( img_contours[i] );
    if (area > 2610 && hierarchy[i][2] < 0){
        counter_closed_contours++;
        //HERE I DON'T KNOW HOW TO CODE AND WHERE TO PUT IMWRITE
        imwrite("Contour_" + std::to_string(counter_closed_contours) + ".jpg", img_contours[i] );
        Scalar color = Scalar( rng.uniform(255, 255), rng.uniform(255, 255),rng.uniform(255, 255));
        drawContours( contours_closed, img_contours, i, color, CV_FILLED );

        }
};
//查找等高线
矢量img_等值线;
向量层次;
findContours(img0、img_等高线、层次、CV_RETR_CCOMP、CV_CHAIN_近似、点(0,0));
//绘制等高线
Mat contours_closed=Mat::zeros(img0.size(),CV_8UC1);
RNG RNG(12345);
int counter_closed_等高线=0;
对于(int i=0;i2610&&层次[i][2]<0){
计数器_闭合_++;
//在这里,我不知道如何编码,也不知道在哪里写
imwrite(“等高线”+std::to_字符串(计数器_闭合等高线)+“.jpg”,img_等高线[i]);
标量颜色=标量(rng.uniform(255,255),rng.uniform(255,255),rng.uniform(255,255));
绘制轮廓线(轮廓线闭合、图像轮廓线、i、颜色、CV填充);
}
};

代码本身运行良好,它可以找到闭合的轮廓并绘制它们。但是,由于我希望每个轮廓都在一个单独的文件中,我不知道在哪里使用imwrite,也不知道是否可以在循环中逐个轮廓地获取轮廓,因为它看起来像drawContours在
for
循环中一次返回轮廓的图像,因此您必须执行两个重要操作:

  • cv::Mat
    重置为
    cv::Scalar(0)
  • 使用
    cv::drawContours()
    绘制等高线
这可以使用以下代码完成:

# Create a single channel image with black color.
cv::Mat contourMat = cv::Mat(img0.size(), CV_8UC1, cv::Scalar(0));

# Iterate over all the contours.
for (int i=0; i<contours.size(); i++) {
    # Draw the given contour, on the black canvas.
    drawContours(contourMat, img_contours, i, cv::Scalar(255), CV_FILLED );
    cv::imwrite("Contour_" + std::to_string(counter_closed_contours) + ".jpg", contourMat);

    # Reset the image again to black.
    contourMat.setTo(cv::Scalar(0));
}
#创建黑色的单通道图像。
cv::Mat contourMat=cv::Mat(img0.size(),cv_8UC1,cv::Scalar(0));
#迭代所有轮廓。
对于(int i=0;i