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

mrgloom

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

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

  • Посещение

  • Days Won

    142

Все публикации пользователя mrgloom

  1. из RAW data в IPlImage*

    какие поля необходимо\заполнить инициализировать в структуре IPlImage* для нормальной работы? т.е. достаточно ли сделать так IplImage* img=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3); а потом заполнить структуру imageData из масссива своих значений?
  2. из RAW data в IPlImage*

    все таки не все проблемы решил. изображение лежит по указателю dst имеет какой то размер w,h я хочу, удалить его и записать туда img который имеет другой размер. void IplImagetoRGBPIXEL(IplImage* img, RGBPIXEL* dst) { int width= img->width; int height= img->height; int nchannels= img->nChannels; if (dst!=NULL) delete [] dst; //выдает ошибку dst= new RGBPIXEL[width * height]; RGBPIXEL* pd=dst; RGBPIXEL* ps=dst; if(nchannels==3) { for( int y=0; y <height ; ++y ) { uchar* ptr = (uchar*) (img->imageData + y * img->widthStep); for( int x=0; x <width; ++x ) { pd[x].blue= ptr[nchannels*x+0]; pd[x].green= ptr[nchannels*x+1]; pd[x].red= ptr[nchannels*x+2]; pd[x].reserved= 0; } pd += width; } } }
  3. вам скорее нужна не просто однопикселезация, а чтобы кривая была гладкая и неразрывная. (в математической правильности фурмулировки не уверен ) я думаю только морфологией тут не обойтись. думаю тут надо присмотрется к сплайнам. http://www.gamedev.ru/code/forum/?id=124256
  4. Проблемы с ExtractSURF() и CvMemStorage

    я так понимаю что эти черные линии появляются из-за накопления ошибки при повороте и надо делать интерполяцию. п.с. код выложите.
  5. Яркости пары изображений

    работает, но медленно. mat_image[j] массив структур, содержащих указатель на изображении и всякие данные. смысл такой, что ищем прямоугольную область перекрытия и используя cvAddWeighted смешиваем изображения в разных пропорциях. а если область сложная(как на картинке наклонная) то по хорошему надо найти направление прекрытия. int dx=mat_image[i][j+1].x-mat_image[i][j].x; int dy=mat_image[i][j+1].y-mat_image[i][j].y; int wc=mat_image[i][j].src->width-abs(dx); //ширина области перекрытия int hc=mat_image[i][j+1].src->height-abs(dy); //высота области перекрытия double L=0.5*(wc); for (int k=0;k<L+1;k++) { // левый шов на 2 изображении //mat_image[i][j].src и mat_image[i][j+1].src соседние изображения cvSetImageROI(mat_image[i][j].src,cvRect(MIN(dx+wc/2+k,mat_image[i][j].src->width-1),MAX(0,dy),1,hc)); cvSetImageROI(mat_image[i][j+1].src,cvRect(MIN(wc/2+k,mat_image[i][j].src->width-1),abs(MIN(0,dy)),1,hc)); double beta = 0.5*(1+k/L); double alpha = 1-beta; IplImage* dst = cvCloneImage(mat_image[i][j+1].src); cvAddWeighted(mat_image[i][j].src, alpha, mat_image[i][j+1].src, beta, 0.0, dst); cvCopy(dst, mat_image[i][j+1].src); cvResetImageROI(mat_image[i][j+1].src); cvResetImageROI(mat_image[i][j].src); cvReleaseImage(&dst); // освобождение памяти if (k!=0) { //правый шов на 1 изображении cvSetImageROI(mat_image[i][j].src,cvRect(MAX(0,dx+wc/2-k),MAX(0,dy),1,hc)); cvSetImageROI(mat_image[i][j+1].src,cvRect(MAX(0,wc/2-k),abs(MIN(0,dy)),1,hc)); dst = cvCloneImage(mat_image[i][j+1].src); cvAddWeighted(mat_image[i][j+1].src, alpha, mat_image[i][j].src, beta, 0.0, dst); cvCopy(dst, mat_image[i][j+1].src); cvResetImageROI(mat_image[i][j+1].src); cvResetImageROI(mat_image[i][j].src); cvReleaseImage(&dst); } }
  6. Яркости пары изображений

    linear blending самый простой случай, но он становится не таким простым когда склеиваются не 2 изображения, а больше.
  7. Opencv2.1 + IPP +TBB

    Наблюдая за тем, как при использовании opencv работает всего одно ядро, я начал задумываться об многопоточности. но не все так гладко. ставил на VS2008 под вин7 х64 запутался, пока отложил. далее ставил на вин7 х32. тут еще нужно отметить что у intel теперь все в какие то пакеты объединено и хрен их поймешь. итак скачал Parallel Studio 2011 (Intel c++ компилятор+IPP+TBB) IPP не завелось, скачал отдельно IPP(ComposerXE-2011)- завелось, но только если компилировать opencv в VS compiler, а в intel compiler пишет, что ошибка в cv3dtracker.cpp (как решить не понял пока) + учитывая что я поправил все проекты http://software.intel.com/en-us/articles/new-directory-structure-and-library-naming-in-ipp/ протестировать производительность не получилось cxcoretest и т.д. у меня работает только на чистой сборке. на моем приложении и core2 duo E8500 чистая сборка 42 сек с IPP 41 сек с TBB и IPP 32 сек но можно отметить что взяв свое приложение где что то от opencv, что то стороннее(и скорее всего не параллелится) нагрузка была теперь 100% на 2 ядра, и скорее всего время исполнения тоже уменьшилось.(причем само приложение компилируется как VS compiler,так и Intel compiler(на пару сек выигрывает вроде)) еще я видимо не учитывал флаги компиляции по умолчанию вроде O2 cтоит. если у кого есть идеи тестового приложения для проверки можно попробовать скомпилировать.
  8. Opencv2.1 + IPP +TBB

    можно попробовать в сорцах по маске *.cpp осуществить поиск внутри файлов parallel_for (хотя не знаю насколько это точно будет) =
  9. Opencv2.1 + IPP +TBB

    хотелось бы увидеть список функций которые используют IPP и TBB , а то явно не все используют. но радует хотя бы то, что можно мозгами вообще не думать, а просто перекомпилировать библиотеку и получить какой то прирост на халяву. и еще
  10. opencv и Microsoft Visual Studio

    Mat im = imread("photo.jpg",CV_LOAD_IMAGE_COLOR); экзотика какая то. на матлаб вообще похоже. наверно надо Mat создать сначала.
  11. еще вопрос возможно как то через GDI отрисовывать только часть изображения, что то типа ROI в opencv?
  12. Распознавание лиц

    выглядит интересно, посмотрю. но это модели просто для визуального представления? или их можно еще использовать как эталоны для поиска? еще интересная тема http://en.wikipedia.org/wiki/Face_perception
  13. Распознавание лиц

    а есть какие то работы с человеческими головами? или только с такими моделями? я так понял, что это близко к задаче восстановления 3Д изображения по нескольким фотографиям. интересно, что будет если этому алгоритму подсунуть шар (хотя, банку он вроде нормально обработал) а еще есть какие то работы где на основе лица пытаются определить национальность? и вообще какая наука этим занимается морфометрия, антропология ?
  14. вообщем мне кажется, что это не самый крутой метод, ибо видны полоски. можно поискать по тегам motion blur, motion debluring, Wiener deconvolution http://www.owlnet.rice.edu/~elec539/Projects99/BACH/proj2/blind/bd.html http://www.cse.cuhk.edu.hk/~leojia/projects/motion_deblurring/index.html http://cs.nyu.edu/~fergus/research/deblur.html
  15. Распознавание лиц

    ну я имел ввиду одна большая модель развертка от уха до уха строится ,а потом на изображении ищутся ее части, как то так. и еще я не понял, допустим алгоритм сможет построить такую вот цельную модель головы человека автоматически, пока человек вертит головой на видео? и еще чем обусловлено количество точек на котором строятся активные контуры? (чем больше точек тем более гладкие кривые ведь так? так почему не взять как можно больше?)
  16. Распознавание лиц

    куча всего http://www.consortium.ri.cmu.edu/index.php#projects http://www.ri.cmu.edu/research_project_view.html?category_id=2&type=alphabet&list_type=current&menu_id=261&selected_letter=D-F я так понимаю это позволяет сопровождать лицо в независимости от его положения? http://personalpages.manchester.ac.uk/staff/timothy.f.cootes/Models/view_track.html
  17. Дисторсии(подушка,бочка)

    ну я так и делаю, иду по линии которая соединяет левый верхний угол и центр и ищу когда cvGetReal2D возвратит положительное значение, потом из этой точки и зная, что центр отображается в центр (0,0)->(0,0) нахожу все остальные точки.
  18. Дисторсии(подушка,бочка)

    хотя нет, проверил, не работает. но дает похожие результаты при малом отклонении.
  19. Дисторсии(подушка,бочка)

    только (2*w-cx4;2*h-cy4)
  20. Дисторсии(подушка,бочка)

    похоже вы правы а то я начал уже вот так извращатся //для случая если изображение не квардратное // для точки (0,0) int px0=0; int py0=0; double Scy= (double)h/w; for(int x=0;x<w/2;x++) { double y= Scy*x; int t= cvGetReal2D(mapx, floor(y), x); if (t>=0) { px0=x; py0=y; break; } }
  21. Дисторсии(подушка,бочка)

    на начальном этапе (не преобразованное изображение) показывает ровно те же координаты углов (0,0) (w,0) (0,h) (w,h) как начинаю сжимать (в бочку) то выдает там где были 0 отрицательные значения, там где были w,h больше их. как это интерпретировать? использую код: int h= img->height; int w= img->width; int cx1= cvGetReal2D(mapx, 0, 0); int cy1= cvGetReal2D(mapy, 0, 0); int cx2= cvGetReal2D(mapx, w-1, 0); int cy2= cvGetReal2D(mapy, w-1, 0); int cx3= cvGetReal2D(mapx, 0, h-1); int cy3= cvGetReal2D(mapy, 0, h-1); int cx4= cvGetReal2D(mapx, w-1, h-1); int cy4= cvGetReal2D(mapy, w-1, h-1);
  22. Дисторсии(подушка,бочка)

    после коррекции я получаю и мне надо как то выделить квадрат помеченный красным, и сделать ресайз этого квадрата на всё изображение.
  23. ну так перенос будет абсолютным, все точки переместятся. про координаты углов я понимаю, что вы имеете ввиду и что это удобнее их использовать для реальной жизни, но если нужен только перенос, не изменяются другие члены матрицы и если не будет выхода за пределы, то можно и так смещать. по сути применяя матрицу мы совершаем перенос ровного изображения, а потом двигаем углы..
  24. ну с матрицей matrix[0] = 0.8198920262340416; matrix[1] = -0.0464624885991283; matrix[2] = 139.7937963290747800; matrix[3] = -0.0843852113893465; matrix[4] = 0.9651779736070743; matrix[5] = 6.7298523737051692; matrix[6] = -0.0008243186600599; matrix[7] = 0.0000350886555917; matrix[8] = 1.0; верхний край выходит за края изображения. но если я изменю matrix[2] = 119.7937963290747800; то так же будет смещение по X на -20. вообще тут как бы надо различать само смещение и координаты точек углов.
  25. double m11= cvmGet(homo, 0, 0); double m12= cvmGet(homo, 0, 1); double m13= cvmGet(homo, 0, 2); double m21= cvmGet(homo, 1, 0); double m22= cvmGet(homo, 1, 1); double m23= cvmGet(homo, 1, 2); double m31= cvmGet(homo, 2, 0); double m32= cvmGet(homo, 2, 1); double m33= cvmGet(homo, 2, 2); //через ремап IplImage* mapx = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 ); IplImage* mapy = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 ); for (int x = 0; x < mapx->width; x++) { for (int y = 0; y < mapx->height; y++) { double u= (m11*x + m12*y + m13)/(m31*x + m32*y + m33); cvSetReal2D(mapx, y, x, u); } } for (int x = 0; x < mapy->width; x++) { for (int y = 0;y < mapy->height; y++) { double v= (m21*x + m22*y + m23)/(m31*x + m32*y + m33); cvSetReal2D(mapy, y, x, v); } } IplImage* temp = cvCloneImage(img); /*IplImage* temp_des = cvCloneImage(des); cvSetImageROI(temp_des, cvRect(0, 0, temp->width, temp->height)); cvCopy(temp,temp_des); cvResetImageROI(temp_des);*/ cvRemap( temp/*temp_des*/, img/*des*/, mapx, mapy ); // нужны одинаковые размеры cvSaveImage("remap.png",img/*des*/); с ремап я погорячился если не изменять размеры изображения, то обрубает, а если изменять надо дополнительно дописывать.
×