我正在尝试在OpenCV中使用findContours函数,但是VS 2008会出错:
OpenCV错误:错误标志(参数或结构字段)(无法识别或不支持 ed array type)在未知函数中,文件........ \ ocv \ opencv \ src \ cxcore \ cxarr ay.cpp,第2476行
此应用程序已请求Runtime以不寻常的方式终止它。 有关更多信息,请联系应用程序的支持团队。 按任意键继续 。 。
以下是代码:
Mat_<Vec<float,3>> originalimage;
Mat_<Vec<float,3>> resultingimage;
vector<vector<cv::Point>> v;
originalimage = cv::imread("Original.ppm");
cv::findContours(originalimage,v,CV_RETR_LIST,CV_CHAIN_APPROX_NONE);
提前致谢
答案 0 :(得分:3)
FindContours只接受二进制图像。也就是说,输出的任何图像 cvThreshold cvAdapiveThreshold cvCanny
尝试在cv :: findContours
之前添加此语句cvThreshold(originalImage,resultingImage,100,100,CV_THRESH_BINARY)
然后使用resulImage调用findcontours。
如果它有效,那么你应该输入正确的参数到cvThreshold(100只是一个例子)。检查这个问题的参考。
编辑:resulImage应该是单个频道图像!!
答案 1 :(得分:3)
我遇到了与该功能相同的问题(或者至少是类似问题)。我无法解决它,所以我使用了旧的C风格的cvFindContours函数。我已经包含了一个示例函数,我使用了cvFindContours函数来清理blob图像。这可能不是最快的解决方案,但是它很有效。
void filtBproject(Mat& Bproject){
Scalar color = CV_RGB(255,255,255); // text color
IplImage* BprojectIpl = &IplImage(Bproject);
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours = 0;
int numCont = 0;
int contAthresh = 45;
numCont= cvFindContours( BprojectIpl, storage, &contours, sizeof(CvContour),
CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );
cvSet(BprojectIpl, cvScalar(0,0,0));
for( ; contours != 0; contours = contours->h_next )
{
if ( (cvContourArea(contours, CV_WHOLE_SEQ) > contAthresh) ){
cvDrawContours( BprojectIpl, contours, color, color, -1, CV_FILLED, 8 );
}
}
}
答案 2 :(得分:1)
对于v矢量,您需要添加如下空格:
vector<vector<cv::Point> > v;
非常微妙和愚蠢,但它有效。