将 CvSeq 转换为 vector<cv::P oint>?



我是 openCV 的新手。 我正在为图像处理应用程序工作。 我需要将CvSeq转换为vector<cv::Point>.

void find_squares( IplImage* img , cv::vector<cv::vector<cv::Point>>&squares){
    IplImage* newimg = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    IplImage* cannyimg = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    IplImage* greyimg = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    IplImage* testimg = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    // convert the loaded image to a canny image
    cvCvtColor(img, greyimg, CV_BGR2GRAY);
    cvCanny(greyimg, cannyimg, 50, 150, 3);
    // necessary to convert loaded image to an image with channel depth of 1
    cvConvertImage(cannyimg, newimg);
    cvConvertImage(img, testimg);
    // allocate necessary memory to store the contours
    CvMemStorage* storage = cvCreateMemStorage(0);
    CvMemStorage* canny_storage = cvCreateMemStorage(0);
    // find the contours in both the loaded image and the canny filtered image
    cvFindContours(testimg, storage, &contours, sizeof(CvContour),
                   CV_RETR_EXTERNAL, CV_CHAIN_CODE);
    cvFindContours(newimg, canny_storage, &canny_contours, sizeof(CvContour),
                   CV_RETR_EXTERNAL, CV_CHAIN_CODE);
    // draw the contours on both the loaded image and the canny filtered image
    cvDrawContours(testimg, contours, cvScalar(255,255,255), cvScalarAll(255), 100);
     cvDrawContours( newimg, canny_contours, cvScalar(255,255,255), cvScalarAll(255),100);
}

我想将contours转换为cv::vector<cv::vector<cv::Point>>。 我不知道接下来想做什么。

请给我任何想法。

你的问题的答案太长了,不能写在这里。在一本书中用了整整一章来描述CvSeq是如何工作的以及为什么(Gary Bradski和Adrian Kaehler的"Learning OpenCV",第8章)。

更重要的是,你现在不应该学习这个。C 接口已被弃用,当 OpenCV 3.0(目前正在开发中)发布时,此接口将被完全删除。这意味着使用Mat而不是IplImage*,并使用名称中没有"cv"前缀的函数。请参阅 findContours 的文档。您的代码将如下所示:

vector<vector<cv::Point>> contours;
cv::findContours(testimg, contours, CV_RETR_EXTERNAL, CV_CHAIN_CODE);

编辑(回答评论):

您的绘图功能将是:

drawContours(testimg, contours, -1, 255, CV_FILLED);

请参阅绘制等值线的文档。

相关内容

  • 没有找到相关文章

最新更新