OpenCV(C):计算轮廓的力矩

这是我的代码:

#include "highgui.h" #include "cv.h" #include  // this code finds contours int main (int argc, char* argv[]) { cvNamedWindow( argv[0], 1 ); IplImage* img_8uc1 = cvLoadImage( argv[1], CV_LOAD_IMAGE_GRAYSCALE ); IplImage* img_edge = cvCreateImage( cvGetSize(img_8uc1), 8, 1); IplImage* img_8uc3 = cvCreateImage( cvGetSize(img_8uc1), 8, 3); cvThreshold( img_8uc1, img_edge, 128, 255, CV_THRESH_BINARY ); CvMemStorage* storage = cvCreateMemStorage(); CvSeq* first_contour = NULL; int Nc = cvFindContours(img_edge, storage, &first_contour, sizeof(CvContour), CV_RETR_LIST ); int n = 0; printf("Total Contours Detected: %d\n", Nc); CvSeq* c=first_contour; for( c; c!=NULL; c=c->h_next ) { cvCvtColor( img_8uc1, img_8uc3, CV_GRAY2BGR ); cvDrawContours(img_8uc3, c, CV_RGB(250,0,0), //red CV_RGB(0,0,250), //blue 0,2,8); printf("Contour #%d\n", n); cvShowImage( argv[0], img_8uc3 ); printf(" %d elements:\n", c->total ); for( int i=0; itotal; ++i) { CvPoint* p = CV_GET_SEQ_ELEM(CvPoint, c, i); printf(" (%d,%d)\n", p->x, p->y); } cvWaitKey(0); n++; } // moments CvMoments* Moments; CvHuMoments *HuMoments; // calculate moments; calculate humoments cvContourMoments(c, Moments); cvGetHuMoments(Moments, HuMoments); //print the hu moments printf("Hu Moment hu1: %.12f", HuMoments->hu1); printf("Hu Moment hu2: %.12f", HuMoments->hu2); printf("Hu Moment hu3: %.12f", HuMoments->hu3); printf("Hu Moment hu4: %.12f", HuMoments->hu4); printf("Hu Moment hu5: %.12f", HuMoments->hu5); printf("Hu Moment hu6: %.12f", HuMoments->hu6); printf("Hu Moment hu7: %.12f", HuMoments->hu7); printf("Finished all contours.\n"); cvCvtColor(img_8uc1, img_8uc3, CV_GRAY2BGR); cvShowImage(argv[0], img_8uc3); cvWaitKey(0); cvDestroyWindow(argv[0]); cvReleaseImage(&img_8uc1); cvReleaseImage(&img_8uc3); cvReleaseImage(&img_edge); return 0; } 

基本上,代码的前半部分和代码的最后几行直接取自“学习OpenCV”一书,因为它已经完成轮廓查找,这就是我想要的(不是抄袭,我正在尝试一些东西),代码的中间部分(如文档所述)专门用于计算Hu Moments。 我想尝试查看当具有轮廓的特定图像的方向不同或者图像的大小改变时是否有任何力矩值变化。

我以为我用正确的方式写了这个,至少算法对我来说似乎是正确的,但我一直收到这个错误信息:

OpenCV错误:cvMoments中的空指针(),文件/build/buildd/opencv-2.1.0/src/cv/cvmoments.cpp,第343行终止在抛出’cv :: Exception’的实例后调用what():/ build / buildd / opencv-2.1.0 / src / cv / cvmoments.cpp:343:错误:( – 27)在函数cvMoments中

中止

是否存在我如何使用CvMoments数据结构的问题,或问题是否与CvContourMoments()函数有关? 我目前使用的OpenCV版本是2.1.0。

我很感激帮助! 我无法在互联网上的任何地方找到这样的解决方案,我想知道是否有人从轮廓的时刻计算有类似的问题。

我认为你应该定义一个结构的瞬间而不是一个指针。

试试这个:

 CvMoments Moments; CvHuMoments HuMoments; // calculate moments; calculate humoments cvContourMoments(c, &Moments); cvGetHuMoments(&Moments, &HuMoments); //print the hu moments printf("Hu Moment hu1: %.12f", HuMoments.hu1); printf("Hu Moment hu2: %.12f", HuMoments.hu2); printf("Hu Moment hu3: %.12f", HuMoments.hu3); printf("Hu Moment hu4: %.12f", HuMoments.hu4); printf("Hu Moment hu5: %.12f", HuMoments.hu5); printf("Hu Moment hu6: %.12f", HuMoments.hu6); printf("Hu Moment hu7: %.12f", HuMoments.hu7); 

顺便说一句,cvContourMoments()似乎与cvMoments()相同。 我只能在http://www.opencv.org.cn/opencvdoc找到cvMoments()。 变量“c”应该是指向IplImage或CvArr的指针。

我是新来的。 希望能提供帮助。

我想你错过了指定要测试的图像。 我仍然是一个新手,但你可以尝试我测试的程序 ,以获得轮廓(它工作:))从那里你可以添加function,以获得轮廓的时刻。 我希望这可以帮助你。

你忘了重置c;

尝试添加

 c=first_contour; 

在你使用之前

 cvContourMoments(c, &Moments);;