Ошибка использования CvMoments для расчета моментов HU - PullRequest
0 голосов
/ 26 июля 2011

Я делаю свой FYP, и я немного новичок в OpenCV и C ++.Я искал информацию относительно CvMoments , и все, что я нашел (в теоретических примерах, которые работают), не решает мою проблему.Я хочу загрузить набор изображений (от «1.png» до «5.png») и записать моменты HU в текстовый файл.Код, как показано:

CvMoments moments;
CvHuMoments hu_moments;
char filename[80] = "";

ofstream myfile;
myfile.open ("HU_moments.txt");

for (int i=0;i<5;i++){
    sprintf(filename,"%u.png",i);
    IplImage* image = cvLoadImage(filename);

    cvMoments(image,&moments);
    cvGetHuMoments(&moments, &hu_moments);

    myfile << "Hu1: " << hu_moments.hu1 <<
              "Hu2: " << hu_moments.hu2 <<
              "Hu3: " << hu_moments.hu3 <<
              "Hu4: " << hu_moments.hu4 <<
              "Hu5: " << hu_moments.hu5 <<
              "Hu6: " << hu_moments.hu6 <<
              "Hu7: " << hu_moments.hu7 << ".\n";
    cvReleaseImage(&image);
}
myfile.close();

Проблема возникает, когда я получаю cvMoments (изображение и моменты) .Я получаю:

Необработанное исключение в 0x759fb9bc в Viewer.exe: исключение Microsoft C ++: cv :: Исключение в ячейке памяти 0x002fce00 ..

Я попытался объявить моменты как указатель (с соответствующим melloc), но все равно я получаю ту же ошибку.Самое смешное, что если я выберу опцию, чтобы продолжить отладку (5 раз, по одному на каждый цикл), я получу результаты, которые напечатаны в моем текстовом файле.Я использую Visual Studio 2008.

Надеюсь, кто-то знает, что здесь происходит и как решить.

1 Ответ

1 голос
/ 26 июля 2011

Вы называете это правильно, но я подозреваю, что ваша проблема в том, что предыдущий вызов не работает:

IplImage* image = cvLoadImage(filename);

Вам необходимо проверить результат cvLoadImage() и убедиться, что вы передаете действительный аргумент cvMoments():

IplImage* image = cvLoadImage(filename);
if (!image)
{
   cout << "cvLoadImage() failed!" << endl;  
   // deal with error! return, exit or whatever
}

cvMoments(image, &moments);

Также неплохо проверить, был ли myfile успешно открыт.

Корень проблемы, согласно моему хрустальному шару, заключается в неправильном представлении о том, куда следует помещать файлы, которые необходимо загрузить приложению при его запуске из Visual Studio, и это будет каталог, в котором находятся файлы исходного кода. ,

Если вы поместите файлы изображений в тот же каталог, что и исходный код, у вас должно быть все в порядке.

С другой стороны, когда вы запускаете приложение вручную (двойным щелчком по исполняемому файлу), файлы изображений должны находиться в том же каталоге, что и исполняемый файл.

EDIT:

Я убежден, что cvMoments() принимает одноканальное изображение на вход. Этот пример не выдает никаких исключений:

CvMoments moments;
CvHuMoments hu_moments;

IplImage* image = cvLoadImage(argv[1]);
if (!image)
{   
    std::cout << "Failed cvLoadImage\n";
    return -1; 
}   

IplImage* gray = cvCreateImage(cvSize(image->width, image->height), image->depth, 1); 
if (!gray)
{   
    std::cout << "Failed cvCreateImage\n";
    return -1; 
}   

cvCvtColor(image, gray, CV_RGB2GRAY);

cvMoments(gray, &moments, 0); 
cvGetHuMoments(&moments, &hu_moments);

cvReleaseImage(&image);
cvReleaseImage(&gray);

Перед преобразованием цветного изображения в серое я получал:

OpenCV Error: Bad argument (Invalid image type) in cvMoments, file OpenCV-2.3.0/modules/imgproc/src/moments.cpp, line 373
terminate called after throwing an instance of 'cv::Exception'
OpenCV-2.3.0/modules/imgproc/src/moments.cpp:373: error: (-5) Invalid image type in function cvMoments
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...