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

motion blur

Recommended Posts

OpenMP - можно включить (и чуть-чуть подправить код).

Еще почти все что может Mat может и GpuMat, но намного быстрее если CUDA поддерживается (видяхой и opencv должна быть построена с поддержкой CUDA).

Кусок кода (не скажу что это :) ) с использованием GPU-шных операций

	// размер ядра фильтра (заметно влияет на детект)
int gauss_kernel_size=9;
// дисперсия для фильтра Гаусса
double sigma=5;

Mat Img32F(img.rows,img.cols,CV_32FC1);
// Переводим изображение в серое одноканальное с элементами типа float
img.convertTo(Img32F,CV_32FC1);

GpuMat Img32F_d(Img32F);

GpuMat Lx1(img.rows,img.cols,CV_32FC1);
GpuMat Ly1(img.rows,img.cols,CV_32FC1);
GpuMat Lx2(img.rows,img.cols,CV_32FC1);
GpuMat Ly2(img.rows,img.cols,CV_32FC1);
GpuMat Lxy(img.rows,img.cols,CV_32FC1);
GpuMat Lx1sq(img.rows,img.cols,CV_32FC1);
GpuMat Ly1sq(img.rows,img.cols,CV_32FC1);

Mat Dx(img.rows,img.cols,CV_32FC1);
Mat Dy(img.rows,img.cols,CV_32FC1);

// Находим производные
Sobel(Img32F_d,Lx1,CV_32FC1,1,0,9);
Sobel(Img32F_d,Ly1,CV_32FC1,0,1,9);
Sobel(Img32F_d,Lx2,CV_32FC1,2,0,9);
Sobel(Img32F_d,Ly2,CV_32FC1,0,2,9);
Sobel(Img32F_d,Lxy,CV_32FC1,1,1,9);

cv::gpu::sqr(Lx1,Lx1sq);
cv::gpu::sqr(Ly1,Ly1sq);

// Вынесем общую часть
GpuMat K(img.rows,img.cols,CV_32FC1);

GpuMat T1(img.rows,img.cols,CV_32FC1);
GpuMat T2(img.rows,img.cols,CV_32FC1);
GpuMat T3(img.rows,img.cols,CV_32FC1);
GpuMat T4(img.rows,img.cols,CV_32FC1);

cv::gpu::add(Lx1sq,Ly1sq,T1,cv::gpu::GpuMat(),CV_32FC1);
cv::gpu::multiply(T1,-1,T1,1.0,CV_32FC1);

cv::gpu::multiply(Ly1sq,Lx2,T2,1.0,CV_32FC1);

cv::gpu::multiply(Lx1,2,T3,1.0,CV_32FC1);
cv::gpu::multiply(T3,Lxy,T3,1.0,CV_32FC1);
cv::gpu::multiply(T3,Ly1,T3,1.0,CV_32FC1);

cv::gpu::multiply(Lx1sq,Ly2,T4,1.0,CV_32FC1);

cv::gpu::add(T2,T3,T2,cv::gpu::GpuMat(),CV_32FC1);
cv::gpu::add(T2,T4,T2,cv::gpu::GpuMat(),CV_32FC1);

cv::gpu::divide(T1,T2,K,1.0,CV_32FC1);

// Ищем смещения
cv::gpu::multiply(Lx1,K,T1,1.0,CV_32FC1);
cv::gpu::multiply(Ly1,K,T2,1.0,CV_32FC1);

// Вычислим радиусы
cv::gpu::sqr(T1,T3);
cv::gpu::sqr(T2,T4);
cv::gpu::add(T3,T4,T3,cv::gpu::GpuMat(),CV_32FC1);
cv::gpu::sqrt(T3,T4);

// cv::gpu::GaussianBlur(T4,T4,Size(gauss_kernel_size,gauss_kernel_size),sigma);
T4.download(Rad);

Mat Rad_c(img.rows,img.cols,CV_16UC1);

// Сделаем дискретизацию с шагом D
float D=10;
Rad.convertTo(Rad_c,CV_16UC1,1.0/D);
Mat Rad_k(img.rows,img.cols,CV_32FC1);
Rad_c.convertTo(Rad_k,CV_32FC1,D);
Rad_k=Rad_k/Rad;
//---------------------------------

T1.download(Dx);
T2.download(Dy);

Dx=Dx/Rad_k;
Dy=Dy/Rad_k;
// Голосование

//-----------------------------------------------------------------------------
// Курватура
//-----------------------------------------------------------------------------
Mat Curv(img.rows,img.cols,CV_32FC1);
cv::gpu::sqr(Lx2,T1);
cv::gpu::sqr(Ly2,T2);
cv::gpu::multiply(Lxy,Lxy,T3);
cv::gpu::multiply(T3,2,T3);
cv::gpu::add(T1,T2,T1);
cv::gpu::add(T1,T3,T1);
cv::gpu::sqrt(T1,T1);

// размер ядра фильтра (заметно влияет на детект)
gauss_kernel_size=9;
// дисперсия для фильтра Гаусса
sigma=9;

cv::gpu::GaussianBlur(T1,T1,Size(gauss_kernel_size,gauss_kernel_size),sigma);

T1.download(Curv);
// -------------------------------------------------[/code]

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×