Как получить матрицу пикселей и изменить форму матрицы в openCV - PullRequest
5 голосов
/ 09 марта 2012

Я реализую алгоритм обработки изображений в C ++ с использованием openCV, в котором на 1-м шаге требуется преобразовать изображение в матрицу. Я знаю, что когда изображение загружается в openCV, оно уже сохраняется в виде матрицы. Используемое изображение имеет размер 80 x 60, поэтому я предполагаю, что матрица, в которой оно хранится, имеет размер 80 x 60. Однако я хотел бы сначала увидеть эту матрицу, а затем изменить ее форму. это в матрицу с тем же нет. пикселей, но как один длинный столбец вместо. то есть матрица 80 х 60 теперь стала бы матрицей 4800 х 1. Я пытался исследовать учебники и онлайн, но безрезультатно. Это мой код до сих пор. В любом случае, это не работает, потому что я не могу конвертировать из 'IplImage *' в 'CvMat *, но как еще я должен назначить свои значения пикселей для матрицы после ее создания? Пожалуйста, я был бы очень признателен, если бы кто-нибудь помог мне с этим кодом.

#include "cv.h"
#include "highgui.h"
#include "iostream"

using namespace std;
int main( int argc, char* argv ) {
IplImage* img0 = NULL;
CvMat* img0_mat = NULL ;
img0 = cvLoadImage("C:\\new\\walk mii.jpg");
if (!img0){
    return -1;}
img0_mat = cvCreateMat(80, 60, 1);
img0_mat = img0;
cout <<" matrix " << img0 << endl;

cvWaitKey(0);
return 0;
}

1 Ответ

1 голос
/ 09 марта 2012

Вы можете вызвать Mat::reshape(int cn, int rows=0):

Метод создает новый матричный заголовок для * этих элементов.Новая матрица может иметь разный размер и / или разное количество каналов.Возможна любая комбинация, если:

1) Никакие дополнительные элементы не включены в новую матрицу и никакие элементы не исключены.Следовательно, произведение

2) row * cols * channel () должно оставаться неизменным после преобразования.

Данные не копируются, т.е. это операция O (1).Следовательно, если вы изменяете количество строк или операция меняет индексы строк элементов каким-либо другим способом, матрица должна быть непрерывной.См. Mat :: isContinuous ().

... похоже, вы используете более старую версию библиотеки, хотя вам нужно cvReshape .Примерно так должно работать:

#include "cv.h" 
#include "highgui.h" 
#include "iostream" 
using namespace std; 

int main( int argc, char* argv ) 
{ 
    IplImage* img0 = NULL; 
    CvMat* img0_mat = NULL ; 
    img0 = cvLoadImage("C:\\new\\walk mii.jpg"); 
    img0_mat = cvCreateMat(80, 60, 1); 

    CvMat row_header, *row;
    row = cvReshape( img0_mat, &row_header, 0, 1 );

    cout << " matrix " << row->tostring() << endl; 

    cvWaitKey(0); 
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...