1. 检查输入参数src和dst是否为空,并且src的数据指针也不能为空。
  2. 定义一个静态数组sec_tab用于存储扇区号。
  3. 分配空间buffer用于存储中间结果。
  4. 定义指针变量stack_top和stack_bottom,并将其初始化为0。
  5. 定义aperture_size为3。
  6. 定义AvicSize类型的变量size,并将其宽度和高度分别设置为src的列数和行数。
  7. 定义flags为aperture_size。
  8. 定义low和high为low_thresh和high_thresh。
  9. 创建AvicMat类型的变量grad_x和grad_y,并使用avic_sobel函数分别计算src的x和y方向的梯度。
  10. 创建AvicMat类型的变量dx和dy,并将grad_x和grad_y的数据类型转换为16位有符号整型。
  11. 将low_thresh和high_thresh的值调整为low和high,使得low小于high。
  12. 分配空间buffer用于存储梯度幅值和方向的中间结果,将其分别赋值给mag_buf[0]、mag_buf[1]和mag_buf[2]。
  13. 创建uchar类型的指针map,用于存储边缘检测结果。
  14. 定义mapstep为size.width + 2,表示map的步长。
  15. 定义maxsize为size.width * size.height / 10的最大值和1 << 10的最大值。
  16. 分配大小为maxsize * sizeof(uchar*)的空间给stack_bottom和stack_top,并将stack_top和stack_bottom初始化为相同的值。
  17. 将mag_buf[0]、mag_buf[1]和mag_buf[2]的值初始化为0,map的值初始化为1。
  18. 创建AvicMat类型的变量grad_x和grad_y,并使用avic_sobel函数分别计算src的x和y方向的梯度。
  19. 创建AvicMat类型的变量dx和dy,并将grad_x和grad_y的数据类型转换为16位有符号整型。
  20. 使用双循环计算梯度幅值和方向,并进行非极大值抑制,将结果存储在map中。
  21. 使用while循环进行边缘跟踪(滞后阈值处理)。
  22. 使用双循环将map中的边缘像素转换为输出图像dst。
  23. 释放分配的内存空间。
  24. 销毁grad_x、grad_y、dx和dy。
  25. 返回AVIC_OK表示执行成功
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

原文地址: http://www.cveoy.top/t/topic/iJYi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录