Перейти к содержимому
Compvision.ru
tybik

IplImage to Bmp и обратно

Recommended Posts

Я написал так:

IplImage *img2;

img2= cvGetImage(&img, &img2);

Теперь ошибка другая [C++ Error] Unit1.cpp(100): E2034 Cannot convert '_IplImage * *' to '_IplImage *'

Я опять чтото упустил?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Функция принимает указатели.

Это уже указатель: IplImage *img2;

Значит в функцию надо передавать только img2

Если ты создаёшь объект на стеке: cv::Mat img;

То в функцию надо передавать его указатель &img

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо, с этим разобрался.

Тока вот опять досада при попытке компилироваться выдает кучу ошибок типа

[Linker Error] Unresolved external 'cv::CascadeClassifier::~CascadeClassifier()' referenced from C:\USERS\HP\DESKTOP\EMPTY_PROJ\UNIT1.OBJ

Проверил все директории в свойствах проекта. все стоит правильно. Не пойму в чем дело. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

lib файлы подключить надо

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Текст ошибки говорит об обратном.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

IplImage* hBitmap2Ipl(HBITMAP hBmp)
{
BITMAP bmp;
::GetObject(hBmp,sizeof(BITMAP),&bmp);
int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8;
int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;
IplImage* img = cvCreateImageHeader( cvSize(bmp.bmWidth, bmp.bmHeight)
, depth, nChannels );
img->imageData =
(char*)malloc(bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char));
memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels);
return img;
}
[/codebox]

здесь где то утечка памяти идет ...... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я пробовал перед return написать delete &bmp; но ведь это удаляет только ссылку.. ((((

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выделяешь через malloc - удаляй через free. Аналогично: new - delete (а для массивов delete []).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

дык я же должен возвратить из функции img зачем ее imageData удалять ??

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
дык я же должен возвратить из функции img зачем ее imageData удалять ??

А изображение, полученное через эту функцию освобождаете после использования (cvReleaseImage)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а такой вопрос.. а функцией IplImage * img=cvCreateImage( cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U, 1 ); - выделяется память под изображение или только создается указатель?

просто я пишу так

HBITMAP hbm = Image1->Picture->Bitmap->Handle;

img_load = cvCreateImage(cvSize(Image1->Picture->Bitmap->Width,Image1->Picture->Bitmap->Height),IPL_DEPTH_8U,1 );

img_load=hBitmap2Ipl(hbm);

мне кажется что cvCreateImage выделяте память под изображение, а потом в hBitmap2Ipl(hbm); еще раз оно выделяется , а в конце я удаляю только img_load .. а вторая копия остается в памяти.. подскажите как мне избавиться от этого..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
а такой вопрос.. а функцией IplImage * img=cvCreateImage( cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),IPL_DEPTH_8U, 1 ); - выделяется память под изображение или только создается указатель?

просто я пишу так

HBITMAP hbm = Image1->Picture->Bitmap->Handle;

img_load = cvCreateImage(cvSize(Image1->Picture->Bitmap->Width,Image1->Picture->Bitmap->Height),IPL_DEPTH_8U,1 );

img_load=hBitmap2Ipl(hbm);

мне кажется что cvCreateImage выделяте память под изображение, а потом в hBitmap2Ipl(hbm); еще раз оно выделяется , а в конце я удаляю только img_load .. а вторая копия остается в памяти.. подскажите как мне избавиться от этого..

Выделяется память. Надо создавать только заголовок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С этим разобрался..

теперь не много другая проблема, вот смотрите:

	
// инициализация
IplImage* img_load;
IplImage* test_img;
CvSize size;
//---------------------------------------
Graphics::TBitmap *Frame_Bitmap;
Frame_Bitmap = (Graphics::TBitmap*) FrameBitmap;
// переводим в формат
HBITMAP hbm =Frame_Bitmap->Handle;
BITMAP bmp;
::GetObject(hbm,sizeof(BITMAP),&bmp);
int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8;
int depth = IPL_DEPTH_8U;
img_load = cvCreateImageHeader( cvSize(bmp.bmWidth, bmp.bmHeight), depth, nChannels );
img_load->imageData =(char*)malloc(bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char));
memcpy(img_load->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels);
cvFlip(img_load,img_load);
// делаем серым
test_img = cvCreateImage(cvSize(img_load->width,img_load->height),IPL_DEPTH_8U,1 );
cvCvtColor( img_load,test_img,CV_BGR2GRAY);
APIDrawIpl(400,100,test_img,this->Handle);
APIDrawIpl(400,300,img_load,this->Handle);
[/codebox]

в результате test_img отрисовывается, а вот на мместе img_load просто черный прямоугольник.. почему так?

если сделать как в пролом посте то img_load отрисуется цветной картинкой..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно попробовать вместо копирования памяти использовать

void cvSetData(CvArr* arr, void* data, int step);

arr - заголовок изображения

step - длина строки в байтах (arr->widthStep вроде правильно использовать, но точно не помню).

data - указатель на данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×