Jump to content
Compvision.ru
Sign in to follow this  
tybik

IplImage to Bmp и обратно

Recommended Posts

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

IplImage *img2;

img2= cvGetImage(&img, &img2);

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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]

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
дык я же должен возвратить из функции img зачем ее imageData удалять ??

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

Share this post


Link to post
Share on other sites

а такой вопрос.. а функцией 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 .. а вторая копия остается в памяти.. подскажите как мне избавиться от этого..

Share this post


Link to post
Share on other sites
а такой вопрос.. а функцией 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 .. а вторая копия остается в памяти.. подскажите как мне избавиться от этого..

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

Share this post


Link to post
Share on other sites

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

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

	
// инициализация
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 отрисуется цветной картинкой..

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×