roboforum.ru

Технический форум по робототехнике.

преобразовать CvMat* в IplImage* и обратно

преобразовать CvMat* в IplImage* и обратно

Сообщение vital » 20 мар 2010, 15:56

Добрый день :)


Функция cvWriteFrame принимает только IplImage* ,а у меня есть CvMat* , значит , нужно преобразовывать.
Знаю, что для таких целей есть GetImage и GetMat, которые возвращают соответсвующие хидеры.

Преобразовываю так:
CvMat* image;
... // инициализация image
IplImage* im = cvCreateImageHeader(size,8,3);
IplImage* im = cvGetImage(image,im);
cvWriteFrame(writer,im);

при вызове cvWriteFrame OpenCV генерит исключение. Если допустим "im" запихнуть в ShowImage, то никаких исключений не возникает и все работает нормально.

Подскажите как лучше преобразовывать CvMat* в IplImage* и обратно, чтобы не возникало подобного рода ситуаций. Может быть есть какие-нибудь макросы.. или способы более приемлимые.

Спасибо :)
vital
 
Сообщения: 9
Зарегистрирован: 05 фев 2010, 22:13
Откуда: Таганрог

Re: преобразовать CvMat* в IplImage* и обратно

Сообщение MiBBiM » 21 мар 2010, 11:07

проверьте writer на немодифицированных (напр, загруженных из файла) пикчах, вполне возможна неправильная инициализация.
для записи изображения на диск есть также ф-я cvsaveimage.
преобразовать можно вручную:
Код: Выделить всёРазвернуть
IplImage *bgra;
...
bgra = cvCreateImageHeader(cvSize(xsize, ysize), IPL_DEPTH_8U,  4);
...
dataPtr = (ARUint8*)arVideoGetImage()  // получение изображения
bgra->imageData = (char*) dataPtr;
cvFlip(bgra);

где ARUint8* - указатель на схожую с cvmat структуру. фактически, натравливаете указатель imagedata на смещение данных из cvmat. разумеется, нужно инициализировать заголовок изображения схожим с cvmat образом.
P.S> как вы вообще смогли такое написать? здесь же определение переменной два раза.
Код: Выделить всёРазвернуть
IplImage* im = cvCreateImageHeader(size,8,3); 
IplImage* im = cvGetImage(image,im);
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: преобразовать CvMat* в IplImage* и обратно

Сообщение vital » 22 мар 2010, 23:21

writer хорошо работает, проверял, только у него видимо есть ограничения на размерность изображения.. на вскидку: 1300x500 не захочет писать, может быть это связано с кодеками, я использовал mjpg.

"Натравливал" указатель данных CvMat (data.ptr) ImageData :) Все вроде бы хорошо..

Код: Выделить всёРазвернуть
ofstream out("out.txt",ios::out);

   IplImage* im = cvCreateImage(cvSize(5,5),8,1);
   cvSet(im,cvScalarAll(3));
   CvMat* mat = cvCreateMatHeader(5,5,CV_8UC1);
   
   mat->data.ptr = (uchar*)im->imageData;

   for(int i=0;i<5;i++)
   {
      for(int j=0;j<5;j++)
      {
         out << cvGetReal2D(mat,i,j) << " ";
      }
      out << endl;
   }
   out.close();


..но если вывести на экран CvMat матрицу то:

3 3 3 3 3
240 173 186 3 3
3 3 3 240 173
186 3 3 3 3
3 240 173 186 3


если же:

Код: Выделить всёРазвернуть
for(int i=0;i<5;i++)
   {
      for(int j=0;j<5;j++)
      {
         out << (int)mat->data.ptr[i*im->widthStep + j] << " "; // !!!!!!!!!!!!
      }
      out << endl;
   }


тогда все номально :)

3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3


нужно инициализировать заголовок изображения схожим с cvmat образом.


инициализировать с тем же размером? или как по другому?

Код: Выделить всёРазвернуть
IplImage* im = cvCreateImageHeader(size,8,3); 
IplImage* im = cvGetImage(image,im);


с горяча залепил :)
vital
 
Сообщения: 9
Зарегистрирован: 05 фев 2010, 22:13
Откуда: Таганрог


Вернуться в Компьютерное зрение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4