我正在做我的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(图片,及时)时会出现问题。我明白了:
Viewer.exe中0x759fb9bc处的未处理异常:Microsoft C ++异常:cv ::内存位置0x002fce00的异常..
我已经尝试将时刻声明为指针(带有相应的melloc),但我仍然得到同样的错误。有趣的是,如果我单击选项继续调试(5次,每次循环一次),我将获得打印到我的文本文件中的结果。我正在使用visual studio 2008。
我希望有人知道这里发生了什么以及如何解决。
答案 0 :(得分:1)
您正在调用它,但我怀疑您的问题是之前的调用失败了:
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
是否成功打开也是个好主意。
如果您将图像文件放在与源代码相同的目录中,那么您应该没问题。
另一方面,当您手动执行应用程序时(通过双击可执行文件),图像文件需要与可执行文件位于同一目录中。
修改强>
我确信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