@ -70,6 +70,7 @@ namespace cv
{
float * btvWeights_ = NULL ;
size_t btvWeights_size = 0 ;
oclMat c_btvRegWeights ;
}
}
@ -82,10 +83,6 @@ namespace btv_l1_device_ocl
void upscale ( const oclMat & src , oclMat & dst , int scale ) ;
float diffSign ( float a , float b ) ;
Point3f diffSign ( Point3f a , Point3f b ) ;
void diffSign ( const oclMat & src1 , const oclMat & src2 , oclMat & dst ) ;
void calcBtvRegularization ( const oclMat & src , oclMat & dst , int ksize ) ;
@ -165,20 +162,6 @@ void btv_l1_device_ocl::upscale(const oclMat& src, oclMat& dst, int scale)
}
float btv_l1_device_ocl : : diffSign ( float a , float b )
{
return a > b ? 1.0f : a < b ? - 1.0f : 0.0f ;
}
Point3f btv_l1_device_ocl : : diffSign ( Point3f a , Point3f b )
{
return Point3f (
a . x > b . x ? 1.0f : a . x < b . x ? - 1.0f : 0.0f ,
a . y > b . y ? 1.0f : a . y < b . y ? - 1.0f : 0.0f ,
a . z > b . z ? 1.0f : a . z < b . z ? - 1.0f : 0.0f
) ;
}
void btv_l1_device_ocl : : diffSign ( const oclMat & src1 , const oclMat & src2 , oclMat & dst )
{
Context * clCxt = Context : : getContext ( ) ;
@ -228,12 +211,6 @@ void btv_l1_device_ocl::calcBtvRegularization(const oclMat& src, oclMat& dst, in
int cn = src . oclchannels ( ) ;
cl_mem c_btvRegWeights ;
size_t count = btvWeights_size * sizeof ( float ) ;
c_btvRegWeights = openCLCreateBuffer ( clCxt , CL_MEM_READ_ONLY , count ) ;
int cl_safe_check = clEnqueueWriteBuffer ( getClCommandQueue ( clCxt ) , c_btvRegWeights , 1 , 0 , count , btvWeights_ , 0 , NULL , NULL ) ;
CV_Assert ( cl_safe_check = = CL_SUCCESS ) ;
args . push_back ( make_pair ( sizeof ( cl_mem ) , ( void * ) & src_ . data ) ) ;
args . push_back ( make_pair ( sizeof ( cl_mem ) , ( void * ) & dst_ . data ) ) ;
args . push_back ( make_pair ( sizeof ( cl_int ) , ( void * ) & src_step ) ) ;
@ -242,11 +219,9 @@ void btv_l1_device_ocl::calcBtvRegularization(const oclMat& src, oclMat& dst, in
args . push_back ( make_pair ( sizeof ( cl_int ) , ( void * ) & src . cols ) ) ;
args . push_back ( make_pair ( sizeof ( cl_int ) , ( void * ) & ksize ) ) ;
args . push_back ( make_pair ( sizeof ( cl_int ) , ( void * ) & cn ) ) ;
args . push_back ( make_pair ( sizeof ( cl_mem ) , ( void * ) & c_btvRegWeights ) ) ;
args . push_back ( make_pair ( sizeof ( cl_mem ) , ( void * ) & c_btvRegWeights . data ) ) ;
openCLExecuteKernel ( clCxt , & superres_btvl1 , kernel_name , global_thread , local_thread , args , - 1 , - 1 ) ;
cl_safe_check = clReleaseMemObject ( c_btvRegWeights ) ;
CV_Assert ( cl_safe_check = = CL_SUCCESS ) ;
}
namespace
@ -321,9 +296,6 @@ namespace
{
CV_Assert ( src . channels ( ) = = 1 | | src . channels ( ) = = 3 | | src . channels ( ) = = 4 ) ;
dst . create ( src . rows * scale , src . cols * scale , src . type ( ) ) ;
dst . setTo ( Scalar : : all ( 0 ) ) ;
btv_l1_device_ocl : : upscale ( src , dst , scale ) ;
}
@ -351,12 +323,13 @@ namespace
btvWeights_ = & btvWeights [ 0 ] ;
btvWeights_size = size ;
Mat btvWeights_mheader ( 1 , static_cast < int > ( size ) , CV_32FC1 , btvWeights_ ) ;
c_btvRegWeights = btvWeights_mheader ;
}
void calcBtvRegularization ( const oclMat & src , oclMat & dst , int btvKernelSize )
{
dst . create ( src . size ( ) , src . type ( ) ) ;
dst . setTo ( Scalar : : all ( 0 ) ) ;
const int ksize = ( btvKernelSize - 1 ) / 2 ;
@ -407,7 +380,7 @@ namespace
oclMat highRes_ ;
vector < oclMat > diffTerms_ ;
vector < oclMat > a_ , b_ , c_ ;
oclMat a_ , b_ , c_ , d _ ;
oclMat regTerm_ ;
} ;
@ -421,7 +394,7 @@ namespace
btvKernelSize_ = 7 ;
blurKernelSize_ = 5 ;
blurSigma_ = 0.0 ;
opticalFlow_ = createOptFlow_DualTVL1 _OCL ( ) ;
opticalFlow_ = createOptFlow_Farneback _OCL ( ) ;
curBlurKernelSize_ = - 1 ;
curBlurSigma_ = - 1.0 ;
@ -487,34 +460,36 @@ namespace
// iterations
diffTerms_ . resize ( src . size ( ) ) ;
a_ . resize ( src . size ( ) ) ;
b_ . resize ( src . size ( ) ) ;
c_ . resize ( src . size ( ) ) ;
bool d_inited = false ;
a_ . create ( highRes_ . size ( ) , highRes_ . type ( ) ) ;
b_ . create ( highRes_ . size ( ) , highRes_ . type ( ) ) ;
c_ . create ( lowResSize , highRes_ . type ( ) ) ;
d_ . create ( highRes_ . rows , highRes_ . cols , highRes_ . type ( ) ) ;
for ( int i = 0 ; i < iterations_ ; + + i )
{
if ( ! d_inited )
{
d_ . setTo ( 0 ) ;
d_inited = true ;
}
for ( size_t k = 0 ; k < src . size ( ) ; + + k )
{
diffTerms_ [ k ] . create ( highRes_ . size ( ) , highRes_ . type ( ) ) ;
a_ [ k ] . create ( highRes_ . size ( ) , highRes_ . type ( ) ) ;
b_ [ k ] . create ( highRes_ . size ( ) , highRes_ . type ( ) ) ;
c_ [ k ] . create ( lowResSize , highRes_ . type ( ) ) ;
// a = M * Ih
ocl : : remap ( highRes_ , a_ [ k ] , backwardMaps_ [ k ] . first , backwardMaps_ [ k ] . second , INTER_NEAREST , BORDER_CONSTANT , Scalar ( ) ) ;
ocl : : remap ( highRes_ , a_ , backwardMaps_ [ k ] . first , backwardMaps_ [ k ] . second , INTER_NEAREST , BORDER_CONSTANT , Scalar ( ) ) ;
// b = HM * Ih
filters_ [ k ] - > apply ( a_ [ k ] , b_ [ k ] , Rect ( 0 , 0 , - 1 , - 1 ) ) ;
filters_ [ k ] - > apply ( a_ , b_ , Rect ( 0 , 0 , - 1 , - 1 ) ) ;
// c = DHF * Ih
ocl : : resize ( b_ [ k ] , c_ [ k ] , lowResSize , 0 , 0 , INTER_NEAREST ) ;
ocl : : resize ( b_ , c_ , lowResSize , 0 , 0 , INTER_NEAREST ) ;
diffSign ( src [ k ] , c_ [ k ] , c_ [ k ] ) ;
diffSign ( src [ k ] , c_ , c_ ) ;
// a = Dt * diff
upscale ( c_ [ k ] , a_ [ k ] , scale_ ) ;
upscale ( c_ , d_ , scale_ ) ;
// b = HtDt * diff
filters_ [ k ] - > apply ( a_ [ k ] , b_ [ k ] , Rect ( 0 , 0 , - 1 , - 1 ) ) ;
filters_ [ k ] - > apply ( d_ , b_ , Rect ( 0 , 0 , - 1 , - 1 ) ) ;
// diffTerm = MtHtDt * diff
ocl : : remap ( b_ [ k ] , diffTerms_ [ k ] , forwardMaps_ [ k ] . first , forwardMaps_ [ k ] . second , INTER_NEAREST , BORDER_CONSTANT , Scalar ( ) ) ;
ocl : : remap ( b_ , diffTerms_ [ k ] , forwardMaps_ [ k ] . first , forwardMaps_ [ k ] . second , INTER_NEAREST , BORDER_CONSTANT , Scalar ( ) ) ;
}
if ( lambda_ > 0 )
@ -549,10 +524,11 @@ namespace
highRes_ . release ( ) ;
diffTerms_ . clear ( ) ;
a_ . clear ( ) ;
b_ . clear ( ) ;
c_ . clear ( ) ;
a_ . release ( ) ;
b_ . release ( ) ;
c_ . release ( ) ;
regTerm_ . release ( ) ;
c_btvRegWeights . release ( ) ;
}
////////////////////////////////////////////////////////////