我是 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);
请参阅绘制等值线的文档。