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;
}

基本的に、コードの前半とコードの最後の行は、「Learning OpenCV」ブックから直接取得されます。これは、輪郭の検出が既に行われており、それが私が望んでいることだからです (盗作ではなく、何かを試しています)。コードの中間セクション (文書化されている) は、Hu モーメントの計算専用です。輪郭のある特定の画像の向きが異なる場合、または画像のサイズが変更された場合に、モーメント値が変化するかどうかを確認したいと思います。

私はこれを正しい方法で書いたと思っていました.少なくともアルゴリズムは私には正しいように見えました.しかし、私はこのエラーメッセージを受け取り続けています.

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 です。

助けてくれてありがとう!私はインターネット上のどこにもこのような解決策を見つけることができず、等高線からのモーメント計算で誰かがこれについて同様の問題を抱えているかどうか疑問に思っています。

4

3 に答える 3

0

どの画像をテストするかを指定しなかったと思います。私もまだ初心者ですが、輪郭を取得するためにテストしたプログラムを試すことができます(動作します:))そこから、関数を追加して輪郭の瞬間を取得できます。これがお役に立てば幸いです。

于 2012-01-28T04:36:56.240 に答える