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

cvAddWeighted и линейное сглаживание

Recommended Posts

Есть два перекрывающихся изображения хочется сделать линейное сглаживание(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);

	  }

       }


Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

cvSetImageROI/cvResetImageROI - очень медленная пара операций. Память выделилась, скопировалась, изменилась, скопировалась обратно, освободилась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Nuzhny, точно ли таким образом работают эти функции? Изображение по сути является матрицей Достаточно задать прямоугольник интереса, и не производить все операции с памятью.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пересмотрел исходники и... Знаешь, а ты прав. А я что-то попутал. Действительно, cvSetImageROI не делает ничего страшного - выделяет 20 байт и всё.

Я точно помню, что ещё давно менял связку cvSetImageROI + cvCopyImage + cvResetImageROI на простую memcpy участка изображения и код ускорился в разы. Мне показалось, что проблемы были как раз в cvSetImageROI. Значит, тормоза были в cvCopyImage.

Ввожу тут всех в заблуждение своим невежеством.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Просто тут даже вопрос об общем алгоритме и управлением памятью.

Необходимо выделить область на 1 изображении и скопировать и на 2 и скопировать. разделить все на полоски толщиной 1 пиксель, попихать все это в 2 массива полосок, выполнить преобразование скопировать в 3 массив, соединить в область(или по одной) и скопировать в результирующее изображение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я бы запустил VTune и посмотрел конкретно, что тормозит. Если не хочется покупать, то можно скачать бесплатную месячную версию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×