2011-12-17 4 views
0

私はOpenCVを使ってC++で最初のプログラムを書いています。私はプロジェクトのセットを表現したいと思います(私のプロジェクトには保存されています。 Lは、X(Y)方向の画素数である長さLXLのベクトルとして ここに私のコードです:。複数の画像をロード、表示、変換する

#include "stdafx.h" 
#include "cv.h" 
#include "highgui.h" 
using namespace std; 

int main() 
    { 
     //load images 
     for(int i=1; i<=25; i++) 
      { 
       char filename[50]; 
       sprintf(filename, "brain_mri_%d.jpg", i); 
       IplImage *img=cvLoadImage(filename, CV_LOAD_IMAGE_GRAYSCALE); 
       if (!img) 
        { 
         printf("Error: Image not found.\n"); 
         return 2; //error : not found image 
        } 

       cvNamedWindow("Projet Image", CV_WINDOW_AUTOSIZE);// create a window 
       IplImage *img2=cvCloneImage(img); //clone img 
       cvShowImage("Projet Image", img2); // display the image in a window 

       cvWaitKey(0); //attendre touche 
       cvDestroyWindow("Projet Image"); // destroy the window 
       cvReleaseImage(&img); // memory 

       return 0; //finish with success 

       //convert IplImage -> Matrix 
       int height = img->height; 
       int width = img->width; 
       CvMat *mat = cvCreateMat(height,width,CV_32FC3); 

       //convert Matrix -> Vector 
       //CvMat row_header, *row; 
       //row = cvReshape(mat, &row_header, 0, 1); 
       CvMat vector_header; 
       cvReshape(img, &vector_header, 0, 1); 

       //check the height and width of vector_header 
       if(vector_header.height != 1) 
        { 
         fprintf(stderr, "vector_header's height is %d\n", vector_header.height); 
        } 
       if(vector_header.width != width*height) 
        { 
         fprintf(stderr, "vector_header's width is %d\n", vector_header.width); 
        } 
      } 
    } 

私はミスを犯しているはずですが、私はどこ:( I知りません PS私の悪い英語を間違えて...

+1

私は恐ろしいと思うかもしれませんが、[C++ API](http://opencv.itseez.com/modules/refman.html)を使用してみませんか?使用可能なチュートリアルのほとんどはC APIをベースにしていますが、多くのポインタを使用しています。間違いを見つけにくい場所がたくさんあります。もしあなたがC++で書いているのであれば、完全なC++を手に入れてください:) – morynicz

+0

@Link +1 C++プログラムでCインタフェースを使用する理由はほとんどありませんが、 'iostream'で' cstdio'を使うことはありません。 –

+0

@ Ivoa70エラーはどういう意味ですか?例えば、画像を 'cvReleaseImage'していないことがわかりますが、それがあなたのエラーの原因になっているかどうかわかりません。 @Link、私はあなた自身の疑問に答えると思います。ほとんどのチュートリアルはC APIをベースにしていますが、これはすでに新しいユーザーにとっては大変なことです。 C++ APIを使用する本当に良いチュートリアルを教えてください。 – dantswain

答えて

0

私はあなたがする必要があると思います。cvReleaseImageあなたのイメージをあなたは彼らと一緒に行われているとき、および2)あなたのリシェイプコードはcvReshapeがそうvector_headercvCreateMatに割り当てる必要がないため、データをコピーしないことを、この

CvMat vector_header; 
cvReshape(img2, &vector_header, 0, 1); /* same # of channels, 1 row */ 

ノートのようなものでなければなりません。非常に小さな画像をロードしてその値をstdoutにプロットすることを除いて、これをテストする方法はわかりません。健全性チェックとして、あなたは、私が高さと幅の面で後方ことがあるかもしれません

if(vector_header.height != 1) 
{ 
    fprintf(stderr, "vector_header's height is %d\n", vector_header.height); 
} 
if(vector_header.width != width*height) 
{ 
    fprintf(stderr, "vector_header's width is %d\n", vector_header.width); 
} 

のようなものをvector_headerのheightwidthをチェックすることができます。私はまた、あなたのイメージが[1 2; 3 4]、結果のベクトルは[1 2 3 4]または[1 3 2 4]? PCAのようなもの(例えば、固有値アルゴリズム)を実行している場合、一貫性がある限り重要ではありません。

+0

あなたの答えをありがとう!実際には、脳のMRI画像を分類するためにPCAを使用するプログラムの最初の部分です。そうすればOKです。私の質問は、どのようにして、それら(画像)がすべて読み込まれ、マトリックスに変換されてからベクターに変換されることを確認してください。 投稿した最初のメッセージで自分のコードを更新しました。 – Ivoa70

関連する問題