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;
}
이미지에는 몇 개의 채널이 있습니까? 나는 그들이 RGB 인 것, 즉 각각 3 개의 채널을 가지고 있다고 생각합니다. – Robinson
@Robinson 예 2가 모두 회색 음영 인 것처럼 보입니다. –