这是我的代码:
#include "highgui.h"
#include "cv.h"
#include <stdio.h>
// 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; i<c->total; ++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”一书中获取的,因为这样就完成了轮廓查找,这就是我想要的(不是抄袭,我正在尝试一些东西) out),代码的中间部分(如文档所述)专门用于计算Hu Moments。我想试着看一下具有轮廓的特定图像,不同方向或图像尺寸变化时是否有任何力矩值变化。
我以为我用正确的方式写了这个,至少算法对我来说似乎是正确的,但我一直收到这个错误信息:
OpenCV错误:cvMoments中的空指针(),文件/build/buildd/opencv-2.1.0/src/cv/cvmoments.cpp,第343行 在抛出'cv :: Exception'的实例后终止调用 what():/ build / buildd / opencv-2.10 / src / cv / cvmoments.cpp:343:错误:( - 27)函数cvMoments
中止
我是如何使用CvMoments数据结构的问题,还是问题与CvContourMoments()函数有关?我目前使用的OpenCV版本是2.1.0。
我很感激帮助!我无法在互联网上的任何地方找到这样的解决方案,我想知道是否有人在轮廓的时刻计算中有类似的问题。
答案 0 :(得分:1)
我认为你应该定义一个struct而不是一个指针。
尝试这个:
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的指针。
我是新人。希望能提供帮助。
答案 1 :(得分:0)
我想你错过了指定要测试的图像。我还是一个新手,但是你可以尝试Program我已经测试过以获得轮廓(它可以工作:))并且从那里你可以添加功能来获得轮廓的瞬间。我希望这会对你有所帮助。
答案 2 :(得分:0)
你忘了重置c;
尝试添加
c=first_contour;
在中使用它之前
cvContourMoments(c, &Moments);;