2012-03-12 65 views
0

我必須創建一個4800 x 5超級矩陣。該矩陣將包含5個大小爲80 x 60的圖像,我已使用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矩陣 – 2012-03-12 21:46:22

回答

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的回覆。我必須修改你的代碼才能使用它,因爲我正在使用C++的舊版openCV。但是,我現在得到一個錯誤:術語不計算一個函數帶1個參數。你能否看看我的代碼(在上面的問題中編輯)並告訴我如何解決它? – 2012-03-12 21:28:58

+0

在C風格的opencv中,'CvMat-> rows()'不帶參數並給你矩陣的行數。要獲得行矩陣,您需要使用'CvGetRow'函數 – Eric 2012-03-13 08:53:03

+0

我照你的建議做了。請參閱上面的編輯版本。不管怎麼樣,現在我得到了:'scatchpad.exe中的0x768cb9bc處未處理的異常:Microsoft C++異常:內存位置0x003af338處的cv :: Exception。任何建議來解決這個問題?另外,請爲我澄清一些事情。在循環中,在將第一個圖像複製到超級矩陣的第一列之後,如何將代碼知道它現在應該將第二個圖像複製到超級矩陣的第二列?我認爲循環在我的代碼中不準確地表達了這種情況。 – 2012-03-13 18:27:54

0

創建cvCreateMat大小4800x5的相同數據類型的一個新的矩陣,並通過排行的5個圖像加載到這種「超級矩陣」。

+0

非常感謝您的回覆。我嘗試了你的建議,但我得到一個錯誤。無論如何,我不認爲我正在做你想讓我嘗試的東西。如果你能看看我在上面的原始問題中編輯的代碼,請告訴我如何修復它,我將不勝感激。 – 2012-03-12 21:31:10