Я пытаюсь использовать функцию findContours в OpenCV, но VS 2008 дает ошибку при высказывании:
Ошибка OpenCV: Плохой флаг (параметр или поле структуры) (Нераспознанный или тип массива редактора неподдержки) в неизвестной функции, файл........\ocv\opencv\src\cxcore\cxarr ay.cpp, строка 2476
Это приложение запросило Время выполнения завершить его необычным способом. Свяжитесь со службой поддержки приложения для получения дополнительной информации. Нажмите любую клавишу для продолжения...
Вот код:
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);
Заранее спасибо
FindContours принимает только двоичные изображения. То есть любое изображение, которое выводится cvThreshold cvAdapiveThreshold cvCanny
попробуйте добавить этот оператор перед cv :: findContours
cvThreshold(originalImage,resultingImage,100,100,CV_THRESH_BINARY)
, затем вызовите findcontours с результатом resultImage.
Если это работает, вам следует ввести правильные параметры в cvThreshold (100 - это просто пример). Проверьте ссылку на этот вопрос.
РЕДАКТИРОВАТЬ: resultImage должен быть одноканальным изображением !!
У меня была такая же проблема (или, по крайней мере, аналогичная) с этой функцией. Мне не удалось это исправить, поэтому я использовал вместо нее старую функцию cvFindContours в стиле C. Я включил пример функции, в которой я использовал функцию 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 );
}
}
}