Jump to content
Compvision.ru
Sign in to follow this  
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]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×