mrgloom
Пользователи-
Количество публикаций
2 302 -
Зарегистрирован
-
Посещение
-
Days Won
142
Все публикации пользователя mrgloom
-
какие поля необходимо\заполнить инициализировать в структуре IPlImage* для нормальной работы? т.е. достаточно ли сделать так IplImage* img=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3); а потом заполнить структуру imageData из масссива своих значений?
-
все таки не все проблемы решил. изображение лежит по указателю 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; } } }
-
Однопикселизирование(скелетизация) монохромного изображения
mrgloom replied to Halloween's topic in OpenCV
вам скорее нужна не просто однопикселезация, а чтобы кривая была гладкая и неразрывная. (в математической правильности фурмулировки не уверен ) я думаю только морфологией тут не обойтись. думаю тут надо присмотрется к сплайнам. http://www.gamedev.ru/code/forum/?id=124256 -
я так понимаю что эти черные линии появляются из-за накопления ошибки при повороте и надо делать интерполяцию. п.с. код выложите.
-
работает, но медленно. 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); } }
-
linear blending самый простой случай, но он становится не таким простым когда склеиваются не 2 изображения, а больше.
-
Наблюдая за тем, как при использовании 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тоит. если у кого есть идеи тестового приложения для проверки можно попробовать скомпилировать.
-
можно попробовать в сорцах по маске *.cpp осуществить поиск внутри файлов parallel_for (хотя не знаю насколько это точно будет) =
-
хотелось бы увидеть список функций которые используют IPP и TBB , а то явно не все используют. но радует хотя бы то, что можно мозгами вообще не думать, а просто перекомпилировать библиотеку и получить какой то прирост на халяву. и еще
-
Mat im = imread("photo.jpg",CV_LOAD_IMAGE_COLOR); экзотика какая то. на матлаб вообще похоже. наверно надо Mat создать сначала.
-
GDI affine transformation
mrgloom replied to mrgloom's topic in Вопросы взаимодействия OpenCV + GDI, GDI+
еще вопрос возможно как то через GDI отрисовывать только часть изображения, что то типа ROI в opencv? -
выглядит интересно, посмотрю. но это модели просто для визуального представления? или их можно еще использовать как эталоны для поиска? еще интересная тема http://en.wikipedia.org/wiki/Face_perception
-
а есть какие то работы с человеческими головами? или только с такими моделями? я так понял, что это близко к задаче восстановления 3Д изображения по нескольким фотографиям. интересно, что будет если этому алгоритму подсунуть шар (хотя, банку он вроде нормально обработал) а еще есть какие то работы где на основе лица пытаются определить национальность? и вообще какая наука этим занимается морфометрия, антропология ?
-
вообщем мне кажется, что это не самый крутой метод, ибо видны полоски. можно поискать по тегам 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
-
ну я имел ввиду одна большая модель развертка от уха до уха строится ,а потом на изображении ищутся ее части, как то так. и еще я не понял, допустим алгоритм сможет построить такую вот цельную модель головы человека автоматически, пока человек вертит головой на видео? и еще чем обусловлено количество точек на котором строятся активные контуры? (чем больше точек тем более гладкие кривые ведь так? так почему не взять как можно больше?)
-
куча всего 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
-
ну я так и делаю, иду по линии которая соединяет левый верхний угол и центр и ищу когда cvGetReal2D возвратит положительное значение, потом из этой точки и зная, что центр отображается в центр (0,0)->(0,0) нахожу все остальные точки.
-
хотя нет, проверил, не работает. но дает похожие результаты при малом отклонении.
-
только (2*w-cx4;2*h-cy4)
-
похоже вы правы а то я начал уже вот так извращатся //для случая если изображение не квардратное // для точки (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; } }
-
на начальном этапе (не преобразованное изображение) показывает ровно те же координаты углов (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);
-
после коррекции я получаю и мне надо как то выделить квадрат помеченный красным, и сделать ресайз этого квадрата на всё изображение.
-
ну так перенос будет абсолютным, все точки переместятся. про координаты углов я понимаю, что вы имеете ввиду и что это удобнее их использовать для реальной жизни, но если нужен только перенос, не изменяются другие члены матрицы и если не будет выхода за пределы, то можно и так смещать. по сути применяя матрицу мы совершаем перенос ровного изображения, а потом двигаем углы..
-
ну с матрицей 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. вообще тут как бы надо различать само смещение и координаты точек углов.
-
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*/); с ремап я погорячился если не изменять размеры изображения, то обрубает, а если изменять надо дополнительно дописывать.