C++ 制作一个4800 x 3的矩阵,由3个4800 x 1的矩阵组成

C++ 制作一个4800 x 3的矩阵,由3个4800 x 1的矩阵组成,c++,image-processing,opencv,matrix,C++,Image Processing,Opencv,Matrix,我有3张图片,我把它们转换成4800 x 1的矩阵。我必须创建一个超级矩阵,它是一个尺寸为4800x3的矩阵,通过将这些较小的矩阵堆叠在一起。i、 e.第一张图像是超级矩阵中的第一列,第二张图像是超级矩阵中的第二列,第三张图像是超级矩阵中的第三列。我的代码的输出显示了正确维度的超级矩阵。但是,我认为输出是错误的,因为矩阵中的3个图像中有2个主要是黑白的,因此会有很多值为0的像素。在输出中,我看到与加载的图像完全不对应的大像素值。下面是代码,我上传了我在代码中使用的3幅图片,所以你们都能明白我的意

我有3张图片,我把它们转换成4800 x 1的矩阵。我必须创建一个超级矩阵,它是一个尺寸为4800x3的矩阵,通过将这些较小的矩阵堆叠在一起。i、 e.第一张图像是超级矩阵中的第一列,第二张图像是超级矩阵中的第二列,第三张图像是超级矩阵中的第三列。我的代码的输出显示了正确维度的超级矩阵。但是,我认为输出是错误的,因为矩阵中的3个图像中有2个主要是黑白的,因此会有很多值为0的像素。在输出中,我看到与加载的图像完全不对应的大像素值。下面是代码,我上传了我在代码中使用的3幅图片,所以你们都能明白我的意思。如果有人能帮我解决这个问题,我将不胜感激

#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;
#包括“cv.h”
#包括“highgui.h”
#包括“iostream”
使用名称空间std;
无效cvDoubleMatPrint(常数CvMat*mat)
{
int i,j;
对于(i=0;irows;i++)
{
对于(j=0;jcols;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\u LOAD\u IMAGE\u未更改);
img1=cvLoadImageM(“C:\\small\\wave mii.jpg”,CV\u LOAD\u IMAGE\u未更改);
img2=cvLoadImageM(“C:\\small\\fantasy.jpg”,CV\u LOAD\u IMAGE\u未更改);
CvMat img0_头、img1_头、img2_头;
col0=CVREFORMATE(img0和img0_头,04800);
col1=CVREFORMATE(img1和img1_头,04800);
col2=CVREFORMATE(img2和img2_标题,0,4800);
superMat=cvCreateMat(4800,3,CV_8UC1);
cvSetZero(超级卫星);
for(int i=0;iheight;i++)
{
CV_MAT_ELEM(*超星,双圈,i,0)=CV_MAT_ELEM(*col0,双圈,i,0);
}
for(int j=0;jheight;j++)
{
CV_MAT_ELEM(*超星,双圈,j,1)=CV_MAT_ELEM(*col1,双圈,j,0);
}
for(int k=0;kheight;k++)
{
CV_MAT_ELEM(*超星,双圈,k,2)=CV_MAT_ELEM(*col2,双圈,k,0);
}
cvDoubleMatPrint(superMat);
cvWaitKey(0);
返回0;

}

我不熟悉openCV,但注意到一些潜在问题

  • 调用
    cvreformate
    时,列值应为“1”而不是“0”(参见示例)。根据设置,如果列/行为“0”,则图像中的行数保持不变
  • 您还正在创建CV_8UC1格式的
    supermat
    ,根据文档,该格式“表示8位单通道矩阵”,但您将其作为双通道矩阵访问。类似地,用于访问输入图像

图像有多少通道?我猜它们是RGB,即每个通道有3个。@Robinson是的,所有3个通道都是RGB,尽管2个通道看起来是灰度色的,以便回答。我希望行数保持不变,因为矩阵4800x1和4800x3都有4800行。这就是为什么我将它保留为0而不是1。我将CV_8UC1更改为CV_8UC3,现在我看到一个列,其中大部分为0,我认为这是一个黑色和白色图像,因此感谢您让输出看起来更准确。然而,我不明白你所说的我访问输入图像的意思。我没有在代码中声明它们是8位单通道。本页()说CV_MAT_ELEM用于单通道矩阵,而您的输入图像可能是3或4通道。使用openCV仔细检查输入图像是否已正确加载和显示。