我正在做自己的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(image,&moments)时,就会发生问题。我得到:

Viewer.exe中0x759fb9bc处未处理的异常:Microsoft C++异常:内存位置0x002fce00处的cv::Exception。

我试过将声明为一个指针(及其相应的melloc)声明为,但仍然出现相同的错误。有趣的是,如果单击选项继续调试(5次,每个循环一次),我将得到打印到文本文件中的结果。我正在使用Visual Studio 2008。

我希望有人知道这里发生了什么以及如何解决。

最佳答案

您的 call 正确,但是我怀疑您的问题是上一个 call 失败:

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执行时应将其加载到的文件的存放位置的误解,这就是源代码文件所在的目录。

如果将图像文件与源代码放在同一目录中,则应该可以。

另一方面,当您手动执行应用程序(通过双击可执行文件)时,图像文件必须与可执行文件位于同一目录中。

编辑:

我确信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

10-08 13:40