OpenCV将每个轮廓写在一个单独的文件中

时间:2017-05-01 16:09:44

标签: 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 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 );

        }
};

代码本身工作正常,它找到封闭的轮廓并绘制它们。但由于我希望每个轮廓都在一个单独的文件中,我不知道在哪里使用imwrite以及是否可以在循环内获得轮廓轮廓,因为它看起来像drawContours一次返回轮廓图像

1 个答案:

答案 0 :(得分:0)

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));
}