Проблема с функцией openCV findContours - PullRequest
8 голосов
/ 21 июня 2010

Я пытаюсь использовать функцию findContours в OpenCV, но VS 2008 выдает ошибку, говорящую:

Ошибка OpenCV: неправильный флаг (поле параметра или структуры) (нераспознанный или неподдерживаемый тип массива ed) в неизвестной функции, файл ........ \ 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);

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 27 июля 2010

У меня была такая же проблема (или, по крайней мере, похожая) с этой функцией.Я не смог это исправить, поэтому вместо этого я использовал старую функцию 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 );
            }
        }
}
3 голосов
/ 22 июня 2010

FindContours принимает только двоичное изображение. То есть любое изображение, которое выводится из cvThreshold cvAdapiveThreshold cvCanny

попробуйте добавить этот оператор до cv :: findContours

cvThreshold(originalImage,resultingImage,100,100,CV_THRESH_BINARY) 

затем вызовите findcontours с результирующим изображением.

если это работает, то вы должны ввести правильные параметры в cvThreshold (100 - только пример). Проверьте ссылку на этот счет.

РЕДАКТИРОВАТЬ: resultImage должно быть одноканальным изображением !!

1 голос
/ 08 июня 2011

Для вашего вектора v вам нужно добавить пробел, например, так:

vector<vector<cv::Point> > v;

Очень тонкий и тупой, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...