2011-07-26 4 views
0

私はFYPをやっていますが、私はOpenCVとC++の両方を少し新しくしています。 CvMomentsに関する情報を探しましたが、私が見つけたもの(理論的な例では問題ありません)は私の問題を解決しません。私は一連のイメージ( "1.png"から "5.png")を読み込み、HUモーメントをテキストファイルに書きたいと思います。コードのようである:エラーCvMomentsを使用してHUモーメントを計算する

CvMoments moments; 
CvHuMoments hu_moments; 
char filename[80] = ""; 

ofstream myfile; 
myfile.open ("HU_moments.txt"); 

for (int i=0;i<5;i++){ 
    sprintf(filename,"%u.png",i); 
    IplImage* image = cvLoadImage(filename); 

    cvMoments(image,&moments); 
    cvGetHuMoments(&moments, &hu_moments); 

    myfile << "Hu1: " << hu_moments.hu1 << 
       "Hu2: " << hu_moments.hu2 << 
       "Hu3: " << hu_moments.hu3 << 
       "Hu4: " << hu_moments.hu4 << 
       "Hu5: " << hu_moments.hu5 << 
       "Hu6: " << hu_moments.hu6 << 
       "Hu7: " << hu_moments.hu7 << ".\n"; 
    cvReleaseImage(&image); 
} 
myfile.close(); 

私はcvMoments(画像、&瞬間)を取得するときに問題が発生します。私が取得:

VIEWER.EXEで0x759fb9bcで未処理の例外:マイクロソフトC++の例外:メモリ位置0x002fce00でCV ::例外は..

私はその対応に(ポインタとして瞬間を宣言しようとしていますmelloc)でも、同じエラーが出ます。面白いのは、デバッグを続けるオプションをクリックすると(5回、各ループごとに1つ)、テキストファイルに結果が表示されます。私はビジュアルスタジオ2008を使用しています。

私は誰かがここで何が起こっているのか、解決する方法を知って欲しいです。

答えて

1

あなたは右のそれを呼び出しているが、私はあなたの問題は、以前の呼び出しが失敗していることであると思われる:

IplImage* image = cvLoadImage(filename); 

あなたはcvLoadImage()の結果をチェックし、あなたに有効な引数を渡していることを確認する必要がありますcvMoments()

IplImage* image = cvLoadImage(filename); 
if (!image) 
{ 
    cout << "cvLoadImage() failed!" << endl; 
    // deal with error! return, exit or whatever 
} 

cvMoments(image, &moments); 

それはmyfileが正常に開かれたかどうかを確認することもお勧めします。

問題の根本は、私の水晶玉によると、あなたは、アプリケーションがそのは、Visual Studioから実行時にロードするために必要なファイルを置くべき場所の誤解であり、それはあなたのソースコードファイルのディレクトリになりますあります。

イメージファイルをソースコードと同じディレクトリに置く場合は、OKである必要があります。

一方、実行可能ファイルをダブルクリックしてアプリケーションを手動で実行する場合、イメージファイルは実行可能ファイルと同じディレクトリにある必要があります。

EDIT:

私はcvMoments()は、入力として、シングルチャンネル画像を撮影することを確信しています。この例では、すべての例外をスローしません:

CvMoments moments; 
CvHuMoments hu_moments; 

IplImage* image = cvLoadImage(argv[1]); 
if (!image) 
{ 
    std::cout << "Failed cvLoadImage\n"; 
    return -1; 
} 

IplImage* gray = cvCreateImage(cvSize(image->width, image->height), image->depth, 1); 
if (!gray) 
{ 
    std::cout << "Failed cvCreateImage\n"; 
    return -1; 
} 

cvCvtColor(image, gray, CV_RGB2GRAY); 

cvMoments(gray, &moments, 0); 
cvGetHuMoments(&moments, &hu_moments); 

cvReleaseImage(&image); 
cvReleaseImage(&gray); 

カラー画像をグレーに変換する前に、私はなっていた:速い応答のための

OpenCV Error: Bad argument (Invalid image type) in cvMoments, file OpenCV-2.3.0/modules/imgproc/src/moments.cpp, line 373 
terminate called after throwing an instance of 'cv::Exception' 
OpenCV-2.3.0/modules/imgproc/src/moments.cpp:373: error: (-5) Invalid image type in function cvMoments 
+0

感謝を! – carlos

+0

イメージを正しくロードするかどうかをチェックしており、完全に開いています。また、画像はソースコードと同じディレクトリにあります。私はすべてのことを正しくやっていると思ったが、そのエラーメッセージが出る。 – carlos

+0

更新された回答。この例は機能します。 – karlphillip

関連する問題