错误使用CvMoments计算HU力矩

Error Using CvMoments to calculate the HU moments

本文关键字:HU 力矩 计算 CvMoments 错误      更新时间:2023-10-16

我正在做我的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(图像,&moments)。我得到:

在Viewer.exe中0x759fb9bc未处理的异常:Microsoft c++ exception: cv:: exception at memory location 0x002fce00.

我已经尝试声明瞬间作为一个指针(与其相应的melloc),但我仍然得到同样的错误。有趣的是,如果我单击选项继续调试(5次,每次循环一次),我将得到打印到我的文本文件的结果。我用的是visual studio 2008。

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

您的呼叫是正确的,但我怀疑您的问题是之前的呼叫失败:

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 cvLoadImagen";
    return -1; 
}   
IplImage* gray = cvCreateImage(cvSize(image->width, image->height), image->depth, 1); 
if (!gray)
{   
    std::cout << "Failed cvCreateImagen";
    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