Проблема функции OpenCV findContours

Я пытаюсь использовать функцию 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);

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

8
задан etarion 6 February 2011 в 13:42
поделиться

2 ответа

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

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

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

, затем вызовите findcontours с результатом resultImage.

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

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

3
ответ дан 5 December 2019 в 21:16
поделиться

У меня была такая же проблема (или, по крайней мере, аналогичная) с этой функцией. Мне не удалось это исправить, поэтому я использовал вместо нее старую функцию 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
ответ дан 5 December 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: