tybik 0 Жалоба Опубликовано October 21, 2010 Я написал так: IplImage *img2; img2= cvGetImage(&img, &img2); Теперь ошибка другая [C++ Error] Unit1.cpp(100): E2034 Cannot convert '_IplImage * *' to '_IplImage *' Я опять чтото упустил? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано October 21, 2010 Функция принимает указатели. Это уже указатель: IplImage *img2; Значит в функцию надо передавать только img2 Если ты создаёшь объект на стеке: cv::Mat img; То в функцию надо передавать его указатель &img Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано October 21, 2010 Спасибо, с этим разобрался. Тока вот опять досада при попытке компилироваться выдает кучу ошибок типа [Linker Error] Unresolved external 'cv::CascadeClassifier::~CascadeClassifier()' referenced from C:\USERS\HP\DESKTOP\EMPTY_PROJ\UNIT1.OBJ Проверил все директории в свойствах проекта. все стоит правильно. Не пойму в чем дело. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано October 21, 2010 lib файлы подключить надо Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано October 21, 2010 они подключены Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано October 21, 2010 Текст ошибки говорит об обратном. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано November 20, 2010 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] здесь где то утечка памяти идет ...... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано November 20, 2010 я пробовал перед return написать delete &bmp; но ведь это удаляет только ссылку.. (((( Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано November 20, 2010 Выделяешь через malloc - удаляй через free. Аналогично: new - delete (а для массивов delete []). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано November 20, 2010 дык я же должен возвратить из функции img зачем ее imageData удалять ?? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 20, 2010 дык я же должен возвратить из функции img зачем ее imageData удалять ?? А изображение, полученное через эту функцию освобождаете после использования (cvReleaseImage)? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано November 20, 2010 а такой вопрос.. а функцией 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 .. а вторая копия остается в памяти.. подскажите как мне избавиться от этого.. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 20, 2010 а такой вопрос.. а функцией 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 .. а вторая копия остается в памяти.. подскажите как мне избавиться от этого.. Выделяется память. Надо создавать только заголовок. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tybik 0 Жалоба Опубликовано November 25, 2010 С этим разобрался.. теперь не много другая проблема, вот смотрите: // инициализация 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 отрисуется цветной картинкой.. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 25, 2010 Можно попробовать вместо копирования памяти использовать void cvSetData(CvArr* arr, void* data, int step); arr - заголовок изображения step - длина строки в байтах (arr->widthStep вроде правильно использовать, но точно не помню). data - указатель на данные. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах