Smorodov 579 Жалоба Опубликовано September 3, 2012 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] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано September 19, 2012 http://www.informatik.uni-ulm.de/ni/staff/PBayerl/homepage/logmap/logmap.html только тут в обратную сторону похоже Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах