本博客是有关opencv中canny源码解析,下图是根据代码画的示意图(图片自动转向了,不知如何调整,菜鸟一枚没办法,如有解决方法,望告知
),便于理解。另外,后面附加的代码是源于 https://blog.csdn.net/u010429424/article/details/51866361

void cv::Canny(InputArray _src, OutputArray _dst,double low_thresh, double high_thresh, int aperture_size, bool L2gradient)
{
Mat src = _src.getMat(); //输入图像
CV_Assert(src.depth() == CV_8U); // 8位无符号
_dst.create(src.size(), CV_8U); //根据src的大小构造目标矩阵dst
Mat dst = _dst.getMat(); //输出图像,为单通道黑白图
// low_thresh 表示低阈值, high_thresh表示高阈值
// aperture_size 表示算子大小,默认为3
// L2gradient计算梯度幅值的标识,默认为false
// 如果L2gradient为false 并且 apeture_size的值为-1(-1的二进制标识为:1111 1111)
// L2gradient为false 则计算sobel导数时,用G = |Gx|+|Gy|
// L2gradient为true 则计算sobel导数时,用G = Math.sqrt((Gx)^2 + (Gy)^2) 根号下 开平方
if (!L2gradient && (aperture_size & CV_CANNY_L2_GRADIENT) == CV_CANNY_L2_GRADIENT)
{
// CV_CANNY_L2_GRADIENT 宏定义其值为: Value = (1<<31) 1左移31位 即2147483648
//backward compatibility
// ~标识按位取反
aperture_size &= ~CV_CANNY_L2_GRADIENT;//相当于取绝对值
L2gradient = true;
}
// 判别条件1:aperture_size是奇数
// 判别条件2: aperture_size的范围应当是[3,7], 默认值3
if ((aperture_size & 1) == 0 || (aperture_size != -1 && (aperture_size < 3 || aperture_size > 7)))
CV_Error(CV_StsBadFlag, ""); // 报错
if (low_thresh > high_thresh) // 如果低阈值 > 高阈值
std::swap(low_thresh, high_thresh); // 则交换低阈值和高阈值
#ifdef HAVE_TEGRA_OPTIMIZATION
if (tegra::canny(src, dst, low_thresh, high_thresh, aperture_size, L2gradient))
return;
#endif
#ifdef USE_IPP_CANNY
if (aperture_size == 3 && !L2g

这篇博客深入解析了OpenCV库中Canny算法的源码,通过一张示意图辅助理解,虽然图片方向出现问题,作者期待得到解决办法。同时,提供了详细代码链接来源。
最低0.47元/天 解锁文章

549

被折叠的 条评论
为什么被折叠?



