2012-03-13 34 views
0

的矩陣我有3個圖像,其餘轉換爲維度的矩陣4800×1.我必須建立一個超級矩陣是尺寸4800×3的矩陣由將這些較小的矩陣彼此堆疊在一起。即第一張圖像是超級矩陣中的第一列,第二張圖像是超級矩陣中的第二列,第三張圖像是超級矩陣中的第三列。我的代碼的輸出顯示了正確維度的超級矩陣。然而,我認爲輸出是錯誤的,因爲矩陣中的3個圖像中的2個主要是黑色和白色,因此將具有很多像素值爲0.在輸出中,我看到大的像素值,它們完全不對應於加載的圖像。下面是代碼,我已經上傳了我在代碼中使用的3張圖片,這樣你們都可以看到我的意思。如果有人能幫我解決這個問題,我會很感激。製作尺寸4800×3組成3點矩陣4800 X 1

#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, *img2, *img0_mat, *img1_mat, *img2_mat, *col0, *col1, *col2, *superMat = NULL; 

img0 = cvLoadImageM("C:\\small\\walk mii.jpg", CV_LOAD_IMAGE_UNCHANGED);  
img1 = cvLoadImageM("C:\\small\\wave mii.jpg", CV_LOAD_IMAGE_UNCHANGED); 
img2 = cvLoadImageM("C:\\small\\fantasy.jpg", CV_LOAD_IMAGE_UNCHANGED); 

CvMat img0_header ,img1_header, img2_header; 

col0 = cvReshape(img0, &img0_header, 0, 4800); 
col1 = cvReshape(img1, &img1_header, 0, 4800); 
col2 = cvReshape(img2, &img2_header, 0, 4800); 

superMat = cvCreateMat(4800, 3, CV_8UC1); 
cvSetZero(superMat); 

for(int i=0; i<col0->height; i++) 
    { 
    CV_MAT_ELEM(*superMat, double, i, 0) = CV_MAT_ELEM(*col0, double, i, 0); 
    } 

    for(int j=0; j<col1->height; j++) 
    { 
    CV_MAT_ELEM(*superMat, double, j, 1) = CV_MAT_ELEM(*col1, double, j, 0); 
    } 

for(int k=0; k<col2->height; k++) 
    { 
    CV_MAT_ELEM(*superMat, double, k, 2) = CV_MAT_ELEM(*col2, double, k, 0); 
    } 


cvDoubleMatPrint(superMat); 

cvWaitKey(0); 
return 0; 

wavingcolour walking}

+0

多少個頻道在圖片有哪些?我猜他們是RGB,即每個都有3個通道。 – Robinson 2012-03-13 21:35:44

+0

@Robinson是所有3 RGB即使2似乎是灰度 – 2012-03-13 22:30:40

回答

0

我不熟悉OpenCV的,但發現一些潛在的問題。

  • 當調用cvReshape你應該有「1」,而不是「0」(參見this question例如)一列值。根據documentation如果col/row爲'0',那麼圖像中的行數保持不變。
  • 您還創建在CV_8UC1格式「是指8位單信道矩陣」根據文檔supermat但你正在訪問它爲double。同樣用於訪問輸入圖像。
+0

感謝回答。我希望行數保持不變,因爲這兩個矩陣4800 x 1和4800 x 3都會有4800行。這就是爲什麼我把它作爲0而不是1。我改變了CV_8UC1到CV_8UC3,我現在看到一個列有主要的0,我認爲是對巴爾克的一個和白色圖像,所以謝謝你讓輸出表現的更加準確。但是,我不明白你對我的訪問輸入圖像的含義。我沒有在代碼中聲明他們是8位單通道。 – 2012-03-13 22:39:27

+0

此頁面(http://opencv.willowgarage.com/wiki/faq)說,CV_MAT_ELEM是單信道矩陣,而你的輸入圖像可能是3或4個通道。仔細檢查輸入圖像是否正在使用openCV加載並正確顯示。 – uesp 2012-03-13 22:47:36