mrgloom 242 Жалоба Опубликовано February 24, 2011 Есть два перекрывающихся изображения хочется сделать линейное сглаживание(linear blending) там где они перекрываются. Использую функцию cvAddWeighted но все работает очень медленно наверно потому что беру по 1 полоске толщиной в пиксель и постоянно копирую. Может можно как то оптимизировать? или использовать другие функции? 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); } } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано February 24, 2011 cvSetImageROI/cvResetImageROI - очень медленная пара операций. Память выделилась, скопировалась, изменилась, скопировалась обратно, освободилась. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Виталий 6 Жалоба Опубликовано February 28, 2011 Nuzhny, точно ли таким образом работают эти функции? Изображение по сути является матрицей Достаточно задать прямоугольник интереса, и не производить все операции с памятью. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано March 1, 2011 Пересмотрел исходники и... Знаешь, а ты прав. А я что-то попутал. Действительно, cvSetImageROI не делает ничего страшного - выделяет 20 байт и всё. Я точно помню, что ещё давно менял связку cvSetImageROI + cvCopyImage + cvResetImageROI на простую memcpy участка изображения и код ускорился в разы. Мне показалось, что проблемы были как раз в cvSetImageROI. Значит, тормоза были в cvCopyImage. Ввожу тут всех в заблуждение своим невежеством. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано March 3, 2011 Просто тут даже вопрос об общем алгоритме и управлением памятью. Необходимо выделить область на 1 изображении и скопировать и на 2 и скопировать. разделить все на полоски толщиной 1 пиксель, попихать все это в 2 массива полосок, выполнить преобразование скопировать в 3 массив, соединить в область(или по одной) и скопировать в результирующее изображение. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано March 3, 2011 Я бы запустил VTune и посмотрел конкретно, что тормозит. Если не хочется покупать, то можно скачать бесплатную месячную версию. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах