2011-12-30 113 views
0

这里是我的代码:OpenCV的(C):计算时刻从轮廓

#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的”书采取直接,因为那已经是轮廓搜索,而且是我想要的(不是抄袭,我正在尝试一些东西),并且代码的中间部分(如文档所述)专用于计算Hu Moments。我想尝试查看具有轮廓的特定图像是否具有不同的方向或图像的大小发生变化时是否存在任何矩值。

我想我这个写的正确的方式,至少算法似乎正确的我,但我不断收到此错误信息:

OpenCV的错误:空指针()在cvMoments,文件/建设/ 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。

我很感激帮助!我无法在互联网上的任何地方找到这样的解决方案,我想知道是否有人有类似的问题关于这一点从等值线的矩计算。

回答

1

我想你应该定义一个结构而不是指针的时刻。

试试这个:

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的指针。

我是新来的。希望帮助。

+0

感谢您的答复使用它之前!虽然我认为cvCOntourMoments()和cvMOments之间的区别是它所需要的参数。第一个函数将实际轮廓作为参数,而第二个函数拍摄图像。 我刚刚使用了上面的建议,其他一切都是一样的,除了我尝试了一种不同的方法:不是从轮廓c中计算时刻,而是使用图像img_8uc3调用cvMoments()函数,因为轮廓是绘制在该图像上的。但是这次我得到一个错误(我将在下一篇文章中输入错误)。 其他建议? – 2011-12-30 23:20:53

+0

OpenCV错误:cvGetMat中的坏标志(参数或结构字段)(无法识别或不支持的数组类型),file /build/buildd/opencv-2.1.0/src/cxcore/cxarray.cpp,第2476行 在抛出'cv :: Exception'的实例 what():/build/buildd/opencv-2.1.0/src/cxcore/cxarray.cpp:2476:error:(-206)无法识别或不支持的函数cvGetMat中的数组类型 中止 – 2011-12-30 23:21:10

0

我想你错过了指定要测试的图像。我还是一个新手,但你可以尝试我已经测试的Program以获得轮廓(它的工作:)),并从那里你可以添加函数来获得轮廓的时刻。我希望这可以帮助你。

0

你忘了复位℃;

尝试增加

c=first_contour; 

cvContourMoments(c, &Moments);;