tybik
Пользователи-
Количество публикаций
70 -
Зарегистрирован
-
Посещение
Все публикации пользователя tybik
-
Добрый день! Помогоите пожалуйста. Стоит такая задача. Хочу улучшить картинку перед тем как отдать ее на распознавание. Нашел метод увеличения контрастности. Суть его состоит в том что: 1. Ищем самый светлый элемент и самый темный. (max и min) 2. Смотрим на сколько они отличаются от максимально возможных вариантов яркости элементов. 3. Заменяем наш max на самый яркий элемент, min на минимально яркий.. (тоесть по сути раздвигаем гистограмму) Как это лучше реализовать в OpenCV как получить доступ к пикселю в IplImage? Может у кого то есть другие предложения как можно улучшить картинку?
-
А как же быть с версией 2.2 ??
-
Как скомпилировать OpenCV 2.2 для работы с С++Builder. ??
-
У меня возникла проблема!Вот код: CvRect* r = (CvRect*)cvGetSeqElem( faces, j ); cvSetImageROI(gray,*r); if( !face_img_m ) face_img_m = cvCreateImage( cvSize(92,112), IPL_DEPTH_8U,1); if( !face_img ) face_img = cvCreateImage( cvSize(r->width,r->height), IPL_DEPTH_8U,1); if( !mean_img ) mean_img = cvCreateImage( Form_Vision_Single->size, IPL_DEPTH_32F, 1 ); cvCopyImage(face_img, gray); cvResize( face_img, face_img_m, CV_INTER_CUBIC ); cvEigenDecomposite( face_img_m, Form_Vision_Single->nEigens, Form_Vision_Single->eig_img,CV_EIGOBJ_NO_CALLBACK,0,mean_img,projectedTestFace); Вот cvEigenDecomposite не выполняет почему то происходит выход из процедуры после выполнения cvCopyImage... почему так? Помогите пожалуйста!
-
как скопировать кусок чек картинки iplimage который я например определю в cvRect
-
Не ужели никто не знает как нормально преобразовать Hbitmap в IplImage ??
-
Может дело в том что я поигрался сначал с r: if (a>0) { // расширяем Х r->x-=-a/2; r->width+=a/2; } else { // сужаем Х r->x+=a/2; r->width-=a/2; } У меня задача такая. Я волучаю рект r. Мне его надо изменить в сооотвествии с пропорциями... потом выделенный r кусок изображения смаштабировать до 92 на 112. И после этого подать на распознание.. А тут получается что после cvResize я выхожу из процедуры почемуто..
-
Спаибо исправил! После cvResize( face_img, face_img_m, CV_INTER_CUBIC ); выходит из процедуры! (( Может дело в cvSetImageROI(gray,*r); ??
-
С памятью я разобрался!.. Это дело не в этой функции она хорошая.. Там были мои косяки.. тупо про картинку забыл )) На счет после использования достаточно удалить как обычную картинку cvReleaseImage.. HBITMAP я удаляю также
-
и еще а есть функция чтобы наоборот IplImage -> Hbitmap.. ??
-
вообще это функция она работала нормально у меня в старом проекте.. что изменилось в новом я не знаю..(( да кст, она оперативку жрет еще (( не много но жрет.. может вы найдете где, и как исправить..
-
а как тогда объяснить что при cvsaveimage полученное изображение сохраняется полностью ???
-
я пишу так: IplImage* hBitmap2Ipl(HBITMAP hBmp) { BITMAP bmp; ::GetObject(hBmp,sizeof(BITMAP),&bmp); int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8; int depth = IPL_DEPTH_8U; IplImage* img = cvCreateImageHeader(cvSize(bmp.bmWidth, bmp.bmHeight), depth, nChannels ); cvCreateData(img); memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char)); return img; } HBITMAP hbm = Image2->Picture->Bitmap->Handle; img_load2 = hBitmap2Ipl(hbm); cvFlip(img_load2,img_load2); но.. при его отрисовки через APIDrawIpl отрисовывается черное окно. при этом изображение там есть.. проверял, писал cvsaveimage.. все сохранило.. дело видимо в самом APIDrawIpl.. если есть идеи.. помогите
-
У меня вопрос. Как мне преобразовать формат изображений OpenCV в bmp. В интернете я нашел функции mycvGetImage и mycvShowImage. Но они не работают при вызове вылезает ошибка типа "Scan line index out of range". Может кто то уже сталкивался с этой проблемой??.. и у кого нить есть работающий пример??... Заранее спасибо..
-
С этим разобрался.. теперь не много другая проблема, вот смотрите: // инициализация 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 отрисуется цветной картинкой..
-
а такой вопрос.. а функцией 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 .. а вторая копия остается в памяти.. подскажите как мне избавиться от этого..
-
дык я же должен возвратить из функции img зачем ее imageData удалять ??
-
я пробовал перед return написать delete &bmp; но ведь это удаляет только ссылку.. ((((
-
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] здесь где то утечка памяти идет ......
-
Написал. может кому понадобиться. CvRect rez_rect[1000]; int rez_count=0; - это результаты.. прямоуглоьики и кол-во прямоугольников void big_rect(CvRect rects[1000], int count) { CvRect i_rect; CvRect j_rect; CvRect big_rect; CvRect b; rez_count=0; int log_x=0; int log_y=0; int el=0; // î÷èñòêà for(int i=0;i<count;i++) { rez_rect.x=0; rez_rect.y=0; rez_rect.height=0; rez_rect.width=0; } Form1->Label2->Caption=IntToStr(count); if (count==1){ rez_rect[0]=rects[0]; rez_count++; log_x=0;log_y=0; // continue; } else { for (int i=0;i<count;i++) { log_x=0;log_y=0; big_rect=rects; // ñðàâíèâàåì ñ äðóãèìè for(int j=i+1;j<count;j++) { el=0; if ((big_rect.y<=rects[j].y)&&(big_rect.y+big_rect.height>=rects[j].y)) {log_y=1; big_rect.y<=rects[j].y ? b.y=big_rect.y : b.y=rects[j].y; big_rect.y+big_rect.height>=rects[j].y+rects[j].height ? b.height=big_rect.y+big_rect.height-b.y : b.height=rects[j].y+rects[j].height-b.y;} if ((big_rect.y<=rects[j].y+rects[j].height)&&(big_rect.y+big_rect.height>=rects[j].y+rects[j].height)) {log_y=1; big_rect.y<=rects[j].y ? b.y=big_rect.y : b.y=rects[j].y; big_rect.y+big_rect.height>=rects[j].y+rects[j].height ? b.height=big_rect.y+big_rect.height-b.y : b.height=rects[j].y+rects[j].height-b.y;} if ((big_rect.x<=rects[j].x)&&(big_rect.x+big_rect.width>=rects[j].x)) {log_x=1; big_rect.x<=rects[j].x ? b.x=big_rect.x : b.x=rects[j].x; big_rect.x+big_rect.width>=rects[j].x+rects[j].width ? b.width=big_rect.x+big_rect.width-b.x : b.width=rects[j].x+rects[j].width-b.x;} if ((big_rect.x<=rects[j].x+rects[j].width)&&(big_rect.x+big_rect.width>=rects[j].x+rects[j].width)) {log_x=1; big_rect.x<=rects[j].x ? b.x=big_rect.x : b.x=rects[j].x; big_rect.x+big_rect.width>=rects[j].x+rects[j].width ? b.width=big_rect.x+big_rect.width-b.x : b.width=rects[j].x+rects[j].width-b.x;} // åñëè åñòü ïåðåñå÷åíèÿ ïî x è y òî ñîçäàåì ðåêò if ((log_x==1)&&(log_y==1)) { big_rect=b; log_x=0;log_y=0; el=0; } } if (rez_count==0) { rez_rect[rez_count]=big_rect; rez_count++; log_x=0;log_y=0; } else { el=0; for(int k=0;k<rez_count;k++) { if ((rez_rect[k].y<=big_rect.y)&&(rez_rect[k].y+rez_rect[k].height>=big_rect.y)) {log_y=1;big_rect.y<=rez_rect[k].y ? b.y=big_rect.y : b.y=rez_rect[k].y; big_rect.y+big_rect.height>=rez_rect[k].y+rez_rect[k].height ? b.height=big_rect.y+big_rect.height-b.y : b.height=rez_rect[k].y+rez_rect[k].height-b.y;} if ((rez_rect[k].y<=big_rect.y+big_rect.height)&&(rez_rect[k].y+rez_rect[k].height>=big_rect.y+big_rect.height)) {log_y=1;big_rect.y<=rez_rect[k].y ? b.y=big_rect.y : b.y=rez_rect[k].y; big_rect.y+big_rect.height>=rez_rect[k].y+rez_rect[k].height ? b.height=big_rect.y+big_rect.height-rez_rect[k].y : b.height=rez_rect[k].y+rez_rect[k].height-b.y;} if ((rez_rect[k].x<=big_rect.x)&&(rez_rect[k].x+rez_rect[k].width>=big_rect.x)) {log_x=1;big_rect.x<=rez_rect[k].x ? b.x=big_rect.x : b.x=rez_rect[k].x; big_rect.x+big_rect.width>=rez_rect[k].x+rez_rect[k].width ? b.width=big_rect.x+big_rect.width-b.x : b.width=rez_rect[k].x+rez_rect[k].width-b.x;} if ((rez_rect[k].x<=big_rect.x+big_rect.width)&&(rez_rect[k].x+rez_rect[k].width>=big_rect.x+big_rect.width)) {log_x=1;big_rect.x<=rez_rect[k].x ? b.x=big_rect.x : b.x=rez_rect[k].x; big_rect.x+big_rect.width>=rez_rect[k].x+rez_rect[k].width ? b.width=big_rect.x+big_rect.width-b.x : b.width=rez_rect[k].x+rez_rect[k].width-b.x;} // åñëè åñòü ïåðåñå÷åíèÿ ïî x è y òî ñîçäàåì ðåêò if ((log_x==1)&&(log_y==1)) { rez_rect[k]=b; log_x=0;log_y=0; el=1; } } if (el==0) { rez_rect[rez_count]=big_rect; log_x=0;log_y=0; el=1; rez_count++; } } } } } елси у кого появтьися идеи по улучшению.. буду рад советам
-
я просто хотел обозначить области в которых есть движение... для меня кртитична скорость.. и вполне достаточно програмы шаблона движения.. просто хотенлось этот хвост убрать.. я выставил историю равной 2 кадрам.. а круг изображений равным 10, чтоб объекты закрасились синим.. но.. я так и непонял почему у меня получилось 2 изображения.. если взять круг не 10 а 40 кадров, эти 2 изображения разойдуться.. но ведь историю я ставлю 2 изображения.. почему так получается..??
-
Добрый день!. вопрос про шаблоны движения. Как мне укоротить хвост который идет за объектом. Я пробовал выставлять такие параметры const double MHI_DURATION = 0.1; const double MAX_TIME_DELTA = 0.1; const double MIN_TIME_DELTA = 0.05; const int N = 10; в результате получил как видите я получил как бы 2е копии машины.. как мне от этого избавиться ?
-
Находим в кадре лица, человеческие фигуры, и т.д. и т.п
tybik replied to Smorodov's topic in Обсуждение общих вопросов
я сделал все как написано в посте про svn. Это не дало результатов. Ошибки все теже. :-( :-( Empty_proj2.rar -
Находим в кадре лица, человеческие фигуры, и т.д. и т.п
tybik replied to Smorodov's topic in Обсуждение общих вопросов
я использовал функцию с параметрами CvSeq* faces = cvHaarDetectObjects( gray, cascade, storage, 1.1, 10, 0 //|CV_HAAR_FIND_BIGGEST_OBJECT |CV_HAAR_DO_ROUGH_SEARCH |CV_HAAR_DO_CANNY_PRUNING |CV_HAAR_SCALE_IMAGE , cvSize(30, 30) ); методом проб и ошибок подобрал такие вот парметры. мин группируемые объекты поставил равным 10 хотя в примере он равен 2. Т.К. при не оч хорошей камере дает лишние объекты. И еще, если брать школное фото человек на 20. то время обработки на OpenCV 1.1 = иногда до 4,2сек.(среднее 0.3-0,6(если 1 лицо) и сильно возрастает если находит большее число лиц) а в примере из папки OpenCv 2.1 время обработки = 0,6 (и оно не зависит от кол-ва найденных лиц) очень хочетс я использовать библиотеку версии 2.1, но не знаю как.. Помогите советом..