2012-03-13 8 views
0

3 개의 이미지가 4800 x 1 크기의 행렬로 변환되었습니다. 4800 x 3 크기의 행렬 인 슈퍼 행렬을 만들어야합니다. 이 작은 매트릭스들을 서로 옆에 쌓아 놓습니다. 즉, 제 1 이미지는 슈퍼 매트릭스의 제 1 칼럼이고, 제 2 이미지는 슈퍼 매트릭스의 제 2 칼럼이고, 제 3 이미지는 슈퍼 매트릭스의 제 3 칼럼이 될 것이다. 내 코드의 결과는 올바른 차원의 수퍼 매트릭스를 보여줍니다. 그러나 매트릭스의 3 개 이미지 중 2 개가 주로 흑백이기 때문에 출력이 잘못되었다고 생각합니다. 따라서 값 0의 픽셀을 많이 포함하게됩니다. 결과에서 출력에 큰 픽셀 값이 전혀 표시되지 않습니다. 로드 된 이미지. 아래 코드는 내가 코드에서 사용한 3 개의 이미지를 업로드 했으므로 모두가 의미하는 바를 볼 수 있습니다. 누군가 제발 나를 도울 수 있다면 정말 고마워.크기가 4800 x 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

+0

@Robinson 예 2가 모두 회색 음영 인 것처럼 보입니다. –

답변

0

나는 OpenCV의 익숙하지 않다하지만 몇 가지 잠재적 인 문제를 발견했습니다.

  • 당신이 전화

    cvReshape 당신은 '1'대신에 '0'(예를 들어 this question 참조) 열 값을 가져야한다. documentation에 따르면 col/row가 '0'이면 이미지의 행 수가 변경되지 않습니다.
  • 설명서에 따라 "8 비트 단일 채널 매트릭스를 의미하는"CV_8UC1 형식의 supermat을 만들지 만 이중으로 액세스하고 있습니다. 입력 이미지에 액세스하는 경우에도 마찬가지입니다.
+0

답장을 보내 주셔서 감사합니다. 두 행렬 4800 x 1과 4800 x 3 둘 다 4800 행을 가지므로 행 수가 변경되지 않았 으면합니다. 그래서 저는 1 대신에 0을 남겨 두었습니다. 저는 CV_8UC1을 CV_8UC3으로 변경했습니다. 그리고 balck 및 white 이미지 중 하나를위한 것으로 생각되는 대부분이 0 인 열을 보게되었습니다. 출력을보다 정확하게 나타 내기 위해 고마워했습니다. . 그러나, 나는 입력 이미지에 액세스하기 위해 당신이 나에게 의미하는 바를 이해하지 못한다. 코드에 8 비트 단일 채널이라고 명시하지 않았습니다. –

+0

이 페이지 (http://opencv.willowgarage.com/wiki/faq)는 CV_MAT_ELEM이 단일 채널 매트릭스 용이고 입력 이미지가 아마 3 또는 4 채널이라고 말합니다. openCV를 사용하여 입력 이미지가 올바르게로드되고 표시되는지 다시 확인하십시오. – uesp