Вы называете это правильно, но я подозреваю, что ваша проблема в том, что предыдущий вызов не работает:
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