2012-03-12 7 views
0

私は4800 x 5のスーパーマトリックスを作成する必要があります。この行列は、サイズが80 x 60の5つのイメージから構成され、これはすでにcvReshapeを使用して4800 x 1の行列に再構成されています。したがって、これらのイメージを別のイメージの隣に配置して、4800 x 5次元のスーパーマトリックスを取得したいと考えています。openCVを使用してこれを行うにはどうすればいいですか?私はこれまでずっとずっと試してきましたが、これはすぐに予定されていますが、私はこのマトリックスの作成には近づいていません。誰かが私を助けてくれたら本当に感謝しています。これはこれまでの私のコードです。しかし、それは動作していない、私が望む出力を与えるためにはるかに少ない。openCVを使ったスーパーマトリックスの作成

#include "cv.h" 
#include "highgui.h" 
#include "iostream" 

using namespace std; 

void cvDoubleMatPrint (const CvMat* mat) 
{ 
int i, j; 
for (i = 0; i < mat->rows; i++) 
{ 
    for (j = 0 ; j < mat->cols; j++) 
    { 
     printf ("%f ", cvGet2D (mat, i , j)); 
    } 
    printf ("\n"); 
} 
} 


int main(int argc, char* argv) 
{ 
CvMat *img0, *img1, *img0_mat, *img1_mat, *col0, *col1, *superMat, *col0_mat, *col1_mat, *superMat_mat = NULL; 

img0 = cvLoadImageM("C:\\small\\walk mii.jpg", CV_LOAD_IMAGE_UNCHANGED);  
img1 = cvLoadImageM("C:\\small\\wave mii.jpg", CV_LOAD_IMAGE_UNCHANGED);  
img0_mat = img0; 
img1_mat = img1;//what does this do!!! 

CvMat col0_header, col1_header, superMat_header, img0_header, img1_header; 

col0 = cvReshape(img0_mat, &img0_header, 0, 4800); 
col1 = cvReshape(img1_mat, &img1_header, 0, 4800); 
col0_mat = col0; 
col1_mat = col1; 

superMat = cvCreateMat(4800, 2, CV_8UC1); 
superMat_mat = superMat; 

for(int i = 0; i < 2; i++) 
{ 
    cvGetCol(col0_mat, &col0_header, 1); 
    cvGetCol(superMat_mat, &superMat_header, 1); 
    cvCopy(col0_mat, superMat_mat); 
} 

cvDoubleMatPrint(superMat_mat); 

cvWaitKey(0); 
return 0; 
} 
+0

を、私はお互いの隣に2枚の画像を積層しようとしています。私がこれを行うことができたら、私は3つのイメージを追加するつもりです。したがって、今のところ、私は4800 x 2行列を作成しようとしています –

答えて

1

ちょうど行ずつ画像マトリックスの行をコピーします。私は現在持っているコードで

cv::Mat superMat; 
cv::Mat rowImg1, rowImg2, .. 

superMat.create(5,rowImg.cols,rowImg1.type()); 

for (int i=0;i<5;i++){ 
    rowImg1.copyTo(superMat.row(i)); 
} 
+0

Ericに返信いただきありがとうございます。以前のバージョンのopenCVをC++で使用しているので、コードを変更して使用する必要がありました。しかし、私は今、エラーを取得しています:用語は1つの引数を取る関数に評価されません。あなたは私のコード(上の質問で編集)を見て、それを修正する方法を教えていただけますか? –

+0

Cスタイルのopencvでは、 'CvMat-> rows()'は引数を取らず、あなたの行列の行数を与えます。行行列を得るには、あなたがアドバイスした通りに 'CvGetRow'関数 – Eric

+0

を使う必要があります。上記の編集版をご覧ください。ハウバー、今私は: 'scatchpad.exeの0x768cb9bcで処理されない例外:Microsoft C++の例外:メモリ位置0x003af338でのcv ::例外'を取得しています。これを解決するためのアドバイスはありますか?また、私のために何かを明確にしてください。ループでは、最初のイメージをスーパーマトリックスの第1列にコピーした後、第2のイメージをスーパーマトリックスの第2列にコピーするはずです。私はこのループが私のコードで不正確に表現されていると思います。 –

0

cvCreateMatとサイズ4800x5の同じデータ型の新しいマトリックスを作成し、この「スーパーマトリックス」行ごとに5枚の画像を読み込みます。以下のコードに示すように

+0

ありがとう、返信ありがとうございます。私はあなたのアドバイスを試みたが、私はエラーが発生している。いずれにせよ、私は自分が試してみたいと思っていたものを正確にやっているとは思わない。私が元の質問で上記で編集した私のコードを見ていただければ大変ありがとうと思います。どうすればいいのか教えてください。 –

関連する問題