首页 文章

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

提问于
浏览
0

这是我的代码:

#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中的空指针(),文件/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 .

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

3 回答

  • 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的指针 .

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

  • 1

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

  • 0

    你忘了重置c;

    尝试添加

    c=first_contour;
    

    在你使用它之前

    cvContourMoments(c, &Moments);;
    

相关问题