本文主要是介绍随手记 part2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#ifdef只能判断单一的宏是否定义,而#if defined()可以组成复杂的判别条件;
对于单一的宏AAA来说,#ifdef AAA和#if defined(AAA)是完全相同的。
而要组成复杂的判别条件,用#if defined()就灵活方便了,比如:#if defined(AAA) && (BBB >= 10)
如果改用#ifdef则没法表示条件BBB>=10了。
#ifdef HAVE_TEGRA_OPTIMIZATIONif (scale == 1.0 && delta == 0){if (ksize == 3 && tegra::sobel3x3(src, dst, dx, dy, borderType))return;if (ksize == -1 && tegra::scharr(src, dst, dx, dy, borderType))return;}
#endif#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7)if(dx < 3 && dy < 3 && src.channels() == 1 && borderType == 1){if(IPPDeriv(src, dst, ddepth, dx, dy, ksize,scale))return;}
#endif
sepFilter2D( src, dst, ddepth, kx, ky, Point(-1,-1), delta, borderType );
sepFilter2D( );用分解的核函数对图像做卷积,然后,运算结果的每一列与一维的核kernelY做卷积。
ksize
表示卷积核的大小,之前理论分析中取的是3x3的模板,对应到if( ksize == 3 )
,order
变量确定对x梯度方向的卷积模板进行赋值还是y梯度方向的卷积进行赋值,因此,当且仅当Sobel函数的输入实参中dx=1时才计算Gx方向的梯度,dy=1时才计算dy方向的梯度。OpenCV没有给出Prewiit算子的源码,但可以自己通过修改替换getDerivKernels
函数实现Prewiit的功能。
int order = k == 0 ? dx : dy;int ksize = k == 0 ? ksizeX : ksizeY;CV_Assert( ksize > order );if( ksize == 1 )kerI[0] = 1;else if( ksize == 3 ){if( order == 0 )kerI[0] = 1, kerI[1] = 2, kerI[2] = 1;else if( order == 1 )kerI[0] = -1, kerI[1] = 0, kerI[2] = 1;elsekerI[0] = 1, kerI[1] = -2, kerI[2] = 1;}
这篇关于随手记 part2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!