tybik
-
Количество публикаций
70 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем tybik
-
-
А как же быть с версией 2.2 ??
-
Как скомпилировать OpenCV 2.2 для работы с С++Builder. ??
-
как скопировать кусок чек картинки 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); ??
-
У меня возникла проблема!Вот код:
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... почему так? Помогите пожалуйста!
-
С памятью я разобрался!.. Это дело не в этой функции она хорошая.. Там были мои косяки.. тупо про картинку забыл )) На счет после использования достаточно удалить как обычную картинку 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.. если есть идеи.. помогите
-
С этим разобрался..
теперь не много другая проблема, вот смотрите:
// инициализация
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е копии машины.. как мне от этого избавиться ?
-
-
я сделал все как написано в посте про svn. Это не дало результатов. Ошибки все теже. :-( :-(
-
я использовал функцию с параметрами 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, но не знаю как.. Помогите советом..
-
а что такое svn ? Где про это можно почитать? На сколько отличаются алгоритмы Haardetect в OpenCv версии 1.1 и 2.1. ? просто я брал саму эту прогу из папки sample из OpenCV 2.1, почему то исходник не запукается под билдером, я его оживлял. но вот что получилось (см. пред пост). я потом запускал exe готовый - посмотреть на саму прогу, результат отличный.(показал перед камерой свое школьное фото где нас 20 человек, почти всех обвел) Потом поробовал собрал из вашей прграммы facedetect и примера из папки sample для OPenCv 1.1 и результатом остался не доволен. может я конечно не те флаги раскоментировал.(Кст есть ли описание значений флагов на русском?) можно ли собрать на версии 1.1 прогу которая давала бы такие же результаты как sample из OPenCv 2.1? или же это проблема самой библиотеки?
Увеличение контрастности картинки в OpenCV
в OpenCV
Опубликовано · Report reply
Добрый день! Помогоите пожалуйста. Стоит такая задача. Хочу улучшить картинку перед тем как отдать ее на распознавание. Нашел метод увеличения контрастности. Суть его состоит в том что:
1. Ищем самый светлый элемент и самый темный. (max и min)
2. Смотрим на сколько они отличаются от максимально возможных вариантов яркости элементов.
3. Заменяем наш max на самый яркий элемент, min на минимально яркий.. (тоесть по сути раздвигаем гистограмму)
Как это лучше реализовать в OpenCV как получить доступ к пикселю в IplImage?
Может у кого то есть другие предложения как можно улучшить картинку?