Изготовление матрицы размером 4800 х 3, состоящей из 3 матриц 4800 х 1 - PullRequest
0 голосов
/ 14 марта 2012

У меня есть 3 изображения, которые я преобразовал в матрицы размеров 4800 x 1. Я должен создать суперматрицу, которая представляет собой матрицу размеров 4800 x 3, сложив эти меньшие матрицы рядом друг с другом. то есть 1-е изображение будет 1-м столбцом в суперматрице, 2-е изображение будет 2-м столбцом в суперматрице, а 3-е изображение будет 3-м столбцом в суперматрице. Вывод моего кода показывает супер матрицу правильных размеров. Тем не менее, я думаю, что вывод неправильный, потому что 2 из 3 изображений в матрице в основном черно-белые, поэтому у них будет много пикселей со значением 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;

wavingcolour walking}

1 Ответ

0 голосов
/ 14 марта 2012

Я не знаком с openCV, но заметил несколько потенциальных проблем.

  • Когда вы вызываете cvReshape, вы должны иметь значение столбца '1' вместо '0' (см. этот вопрос например).Согласно документации , если столбец / строка равен '0', то количество строк в изображении остается неизменным.
  • Вы также создаете supermat в формате CV_8UC1, который "означает 8-битную одноканальную матрицу "в соответствии с документацией, но вы получаете доступ к ней как двойной.Аналогично для доступа к входным изображениям.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...