int avic_cannyconst AvicMat src AvicMat dst double low_thresh double high_thresh avic_assertsrc != NULL && src-dataptr != NULL src should not be NULLn; avic_assertdst != NULL && dst-dataptr != NULL ds
- 检查输入参数src和dst是否为空,并且src的数据指针也不能为空。
- 定义一个静态数组sec_tab用于存储扇区号。
- 分配空间buffer用于存储中间结果。
- 定义指针变量stack_top和stack_bottom,并将其初始化为0。
- 定义aperture_size为3。
- 定义AvicSize类型的变量size,并将其宽度和高度分别设置为src的列数和行数。
- 定义flags为aperture_size。
- 定义low和high为low_thresh和high_thresh。
- 创建AvicMat类型的变量grad_x和grad_y,并使用avic_sobel函数分别计算src的x和y方向的梯度。
- 创建AvicMat类型的变量dx和dy,并将grad_x和grad_y的数据类型转换为16位有符号整型。
- 将low_thresh和high_thresh的值调整为low和high,使得low小于high。
- 分配空间buffer用于存储梯度幅值和方向的中间结果,将其分别赋值给mag_buf[0]、mag_buf[1]和mag_buf[2]。
- 创建uchar类型的指针map,用于存储边缘检测结果。
- 定义mapstep为size.width + 2,表示map的步长。
- 定义maxsize为size.width * size.height / 10的最大值和1 << 10的最大值。
- 分配大小为maxsize * sizeof(uchar*)的空间给stack_bottom和stack_top,并将stack_top和stack_bottom初始化为相同的值。
- 将mag_buf[0]、mag_buf[1]和mag_buf[2]的值初始化为0,map的值初始化为1。
- 创建AvicMat类型的变量grad_x和grad_y,并使用avic_sobel函数分别计算src的x和y方向的梯度。
- 创建AvicMat类型的变量dx和dy,并将grad_x和grad_y的数据类型转换为16位有符号整型。
- 使用双循环计算梯度幅值和方向,并进行非极大值抑制,将结果存储在map中。
- 使用while循环进行边缘跟踪(滞后阈值处理)。
- 使用双循环将map中的边缘像素转换为输出图像dst。
- 释放分配的内存空间。
- 销毁grad_x、grad_y、dx和dy。
- 返回AVIC_OK表示执行成功
原文地址: http://www.cveoy.top/t/topic/iJYi 著作权归作者所有。请勿转载和采集!