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

tybik

Пользователи
  • Количество публикаций

    70
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем tybik


  1. Добрый день! Помогоите пожалуйста. Стоит такая задача. Хочу улучшить картинку перед тем как отдать ее на распознавание. Нашел метод увеличения контрастности. Суть его состоит в том что:

    1. Ищем самый светлый элемент и самый темный. (max и min)

    2. Смотрим на сколько они отличаются от максимально возможных вариантов яркости элементов.

    3. Заменяем наш max на самый яркий элемент, min на минимально яркий.. (тоесть по сути раздвигаем гистограмму)

    Как это лучше реализовать в OpenCV как получить доступ к пикселю в IplImage?

    Может у кого то есть другие предложения как можно улучшить картинку?


  2. Может дело в том что я поигрался сначал с 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 я выхожу из процедуры почемуто..


  3. У меня возникла проблема!Вот код:

    
    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... почему так? Помогите пожалуйста!


  4. С памятью я разобрался!.. Это дело не в этой функции она хорошая.. Там были мои косяки.. тупо про картинку забыл )) На счет после использования достаточно удалить как обычную картинку cvReleaseImage.. HBITMAP я удаляю также


  5. вообще это функция она работала нормально у меня в старом проекте.. что изменилось в новом я не знаю..(( да кст, она оперативку жрет еще (( не много но жрет.. может вы найдете где, и как исправить..


  6. я пишу так:

    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.. если есть идеи.. помогите


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

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

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


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


  9. 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]

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


  10. Написал. может кому понадобиться.

    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++;

    }

    }

    }

    }

    }

    елси у кого появтьися идеи по улучшению.. буду рад советам


  11. я просто хотел обозначить области в которых есть движение... для меня кртитична скорость.. и вполне достаточно програмы шаблона движения.. просто хотенлось этот хвост убрать.. я выставил историю равной 2 кадрам.. а круг изображений равным 10, чтоб объекты закрасились синим.. но.. я так и непонял почему у меня получилось 2 изображения.. если взять круг не 10 а 40 кадров, эти 2 изображения разойдуться.. но ведь историю я ставлю 2 изображения.. почему так получается..??


  12. Добрый день!. вопрос про шаблоны движения. Как мне укоротить хвост который идет за объектом. Я пробовал выставлять такие параметры

    const double MHI_DURATION = 0.1;

    const double MAX_TIME_DELTA = 0.1;

    const double MIN_TIME_DELTA = 0.05;

    const int N = 10;

    в результате получил post-803-1288347724_thumb.jpg

    как видите я получил как бы 2е копии машины.. как мне от этого избавиться ?


  13. я использовал функцию с параметрами 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, но не знаю как.. Помогите советом..


  14. а что такое svn ? Где про это можно почитать? На сколько отличаются алгоритмы Haardetect в OpenCv версии 1.1 и 2.1. ? просто я брал саму эту прогу из папки sample из OpenCV 2.1, почему то исходник не запукается под билдером, я его оживлял. но вот что получилось (см. пред пост). я потом запускал exe готовый - посмотреть на саму прогу, результат отличный.(показал перед камерой свое школьное фото где нас 20 человек, почти всех обвел) Потом поробовал собрал из вашей прграммы facedetect и примера из папки sample для OPenCv 1.1 и результатом остался не доволен. может я конечно не те флаги раскоментировал.(Кст есть ли описание значений флагов на русском?) можно ли собрать на версии 1.1 прогу которая давала бы такие же результаты как sample из OPenCv 2.1? или же это проблема самой библиотеки?

×