@ -87,7 +87,7 @@ void cv::ocl::CannyBuf::create(const Size &image_size, int apperture_size)
filterDY = createDerivFilter_GPU ( CV_8U , CV_32S , 0 , 1 , apperture_size , BORDER_REPLICATE ) ;
}
}
ensureSizeIsEnough ( image_size . height + 2 , image_size . width + 2 , CV_32FC1 , edgeBuf ) ;
ensureSizeIsEnough ( 2 * ( image_size . height + 2 ) , image_size . width + 2 , CV_32FC1 , edgeBuf ) ;
ensureSizeIsEnough ( 1 , image_size . width * image_size . height , CV_16UC2 , trackBuf1 ) ;
ensureSizeIsEnough ( 1 , image_size . width * image_size . height , CV_16UC2 , trackBuf2 ) ;
@ -141,13 +141,16 @@ namespace
void CannyCaller ( CannyBuf & buf , oclMat & dst , float low_thresh , float high_thresh )
{
using namespace : : cv : : ocl : : canny ;
calcMap_gpu ( buf . dx , buf . dy , buf . edgeBuf , buf . edgeBuf , dst . rows , dst . cols , low_thresh , high_thresh ) ;
oclMat magBuf = buf . edgeBuf ( Rect ( 0 , 0 , buf . edgeBuf . cols , buf . edgeBuf . rows / 2 ) ) ;
oclMat mapBuf = buf . edgeBuf ( Rect ( 0 , buf . edgeBuf . rows / 2 , buf . edgeBuf . cols , buf . edgeBuf . rows / 2 ) ) ;
edgesHysteresisLo cal_gpu( buf . edgeBuf , buf . trackBuf1 , buf . counter , dst . rows , dst . cols ) ;
calcMap _gpu ( buf . dx , buf . dy , magBuf , mapBuf , dst . rows , dst . cols , low_thresh , high_thresh ) ;
edgesHysteresisGlobal_gpu ( buf . edge Buf , buf . trackBuf1 , buf . trackBuf2 , buf . counter , dst . rows , dst . cols ) ;
edgesHysteresisLocal_gpu ( map Buf , buf . trackBuf1 , buf . counter , dst . rows , dst . cols ) ;
getEdges_gpu ( buf . edgeBuf , dst , dst . rows , dst . cols ) ;
edgesHysteresisGlobal_gpu ( mapBuf , buf . trackBuf1 , buf . trackBuf2 , buf . counter , dst . rows , dst . cols ) ;
getEdges_gpu ( mapBuf , dst , dst . rows , dst . cols ) ;
}
}
@ -172,18 +175,20 @@ void cv::ocl::Canny(const oclMat &src, CannyBuf &buf, oclMat &dst, double low_th
buf . create ( src . size ( ) , apperture_size ) ;
buf . edgeBuf . setTo ( Scalar : : all ( 0 ) ) ;
oclMat magBuf = buf . edgeBuf ( Rect ( 0 , 0 , buf . edgeBuf . cols , buf . edgeBuf . rows / 2 ) ) ;
if ( apperture_size = = 3 )
{
calcSobelRowPass_gpu ( src , buf . dx_buf , buf . dy_buf , src . rows , src . cols ) ;
calcMagnitude_gpu ( buf . dx_buf , buf . dy_buf , buf . dx , buf . dy , buf . edge Buf, src . rows , src . cols , L2gradient ) ;
calcMagnitude_gpu ( buf . dx_buf , buf . dy_buf , buf . dx , buf . dy , mag Buf, src . rows , src . cols , L2gradient ) ;
}
else
{
buf . filterDX - > apply ( src , buf . dx ) ;
buf . filterDY - > apply ( src , buf . dy ) ;
calcMagnitude_gpu ( buf . dx , buf . dy , buf . edge Buf, src . rows , src . cols , L2gradient ) ;
calcMagnitude_gpu ( buf . dx , buf . dy , mag Buf, src . rows , src . cols , L2gradient ) ;
}
CannyCaller ( buf , dst , static_cast < float > ( low_thresh ) , static_cast < float > ( high_thresh ) ) ;
}
@ -209,7 +214,10 @@ void cv::ocl::Canny(const oclMat &dx, const oclMat &dy, CannyBuf &buf, oclMat &d
buf . dy = dy ;
buf . create ( dx . size ( ) , - 1 ) ;
buf . edgeBuf . setTo ( Scalar : : all ( 0 ) ) ;
calcMagnitude_gpu ( buf . dx , buf . dy , buf . edgeBuf , dx . rows , dx . cols , L2gradient ) ;
oclMat magBuf = buf . edgeBuf ( Rect ( 0 , 0 , buf . edgeBuf . cols , buf . edgeBuf . rows / 2 ) ) ;
calcMagnitude_gpu ( buf . dx , buf . dy , magBuf , dx . rows , dx . cols , L2gradient ) ;
CannyCaller ( buf , dst , static_cast < float > ( low_thresh ) , static_cast < float > ( high_thresh ) ) ;
}
@ -234,7 +242,7 @@ void canny::calcSobelRowPass_gpu(const oclMat &src, oclMat &dx_buf, oclMat &dy_b
size_t globalThreads [ 3 ] = { cols , rows , 1 } ;
size_t localThreads [ 3 ] = { 16 , 16 , 1 } ;
openCLExecuteKernel2 ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 ) ;
openCLExecuteKernel ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 ) ;
}
void canny : : calcMagnitude_gpu ( const oclMat & dx_buf , const oclMat & dy_buf , oclMat & dx , oclMat & dy , oclMat & mag , int rows , int cols , bool L2Grad )
@ -264,12 +272,8 @@ void canny::calcMagnitude_gpu(const oclMat &dx_buf, const oclMat &dy_buf, oclMat
size_t globalThreads [ 3 ] = { cols , rows , 1 } ;
size_t localThreads [ 3 ] = { 16 , 16 , 1 } ;
char build_options [ 15 ] = " " ;
if ( L2Grad )
{
strcat ( build_options , " -D L2GRAD " ) ;
}
openCLExecuteKernel2 ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 , build_options ) ;
const char * build_options = L2Grad ? " -D L2GRAD " : " " ;
openCLExecuteKernel ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 , build_options ) ;
}
void canny : : calcMagnitude_gpu ( const oclMat & dx , const oclMat & dy , oclMat & mag , int rows , int cols , bool L2Grad )
{
@ -292,12 +296,8 @@ void canny::calcMagnitude_gpu(const oclMat &dx, const oclMat &dy, oclMat &mag, i
size_t globalThreads [ 3 ] = { cols , rows , 1 } ;
size_t localThreads [ 3 ] = { 16 , 16 , 1 } ;
char build_options [ 15 ] = " " ;
if ( L2Grad )
{
strcat ( build_options , " -D L2GRAD " ) ;
}
openCLExecuteKernel2 ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 , build_options ) ;
const char * build_options = L2Grad ? " -D L2GRAD " : " " ;
openCLExecuteKernel ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 , build_options ) ;
}
void canny : : calcMap_gpu ( oclMat & dx , oclMat & dy , oclMat & mag , oclMat & map , int rows , int cols , float low_thresh , float high_thresh )
@ -328,7 +328,7 @@ void canny::calcMap_gpu(oclMat &dx, oclMat &dy, oclMat &mag, oclMat &map, int ro
string kernelName = " calcMap " ;
size_t localThreads [ 3 ] = { 16 , 16 , 1 } ;
openCLExecuteKernel2 ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 ) ;
openCLExecuteKernel ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 ) ;
}
void canny : : edgesHysteresisLocal_gpu ( oclMat & map , oclMat & st1 , void * counter , int rows , int cols )
@ -348,7 +348,7 @@ void canny::edgesHysteresisLocal_gpu(oclMat &map, oclMat &st1, void *counter, in
size_t globalThreads [ 3 ] = { cols , rows , 1 } ;
size_t localThreads [ 3 ] = { 16 , 16 , 1 } ;
openCLExecuteKernel2 ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 ) ;
openCLExecuteKernel ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 ) ;
}
void canny : : edgesHysteresisGlobal_gpu ( oclMat & map , oclMat & st1 , oclMat & st2 , void * counter , int rows , int cols )
@ -378,7 +378,7 @@ void canny::edgesHysteresisGlobal_gpu(oclMat &map, oclMat &st1, oclMat &st2, voi
args . push_back ( make_pair ( sizeof ( cl_int ) , ( void * ) & map . step ) ) ;
args . push_back ( make_pair ( sizeof ( cl_int ) , ( void * ) & map . offset ) ) ;
openCLExecuteKernel2 ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 , DISABLE ) ;
openCLExecuteKernel ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 ) ;
openCLSafeCall ( clEnqueueReadBuffer ( * ( cl_command_queue * ) getoclCommandQueue ( ) , ( cl_mem ) counter , 1 , 0 , sizeof ( int ) , & count , 0 , NULL , NULL ) ) ;
std : : swap ( st1 , st2 ) ;
}
@ -403,5 +403,5 @@ void canny::getEdges_gpu(oclMat &map, oclMat &dst, int rows, int cols)
size_t globalThreads [ 3 ] = { cols , rows , 1 } ;
size_t localThreads [ 3 ] = { 16 , 16 , 1 } ;
openCLExecuteKernel2 ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 ) ;
openCLExecuteKernel ( clCxt , & imgproc_canny , kernelName , globalThreads , localThreads , args , - 1 , - 1 ) ;
}