- 以低的错误率检测边缘,也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。
- 检测到的边缘应精确定位在真实边缘的中心。
- 图像中给定的边缘应只被标记一次,并且在可能的情况下,图像的噪声不应产生假的边缘。
- 使用高斯滤波器,以平滑图像,滤除噪声。
- 计算图像中每个像素点的梯度强度和方向。
- 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
- 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
- 通过抑制孤立的弱边缘最终完成边缘检测。
相关链接:https://www.cnblogs.com/techyan1990/p/7291771.html
https://opencv.apachecn.org/#/docs/4.0.0/4.7-tutorial_py_canny
SetWorkingDir A_ScriptDir
hOpencv := DllCall("LoadLibrary", "str", "opencv_world455.dll", "ptr")
hOpencvCom := DllCall("LoadLibrary", "str", "autoit_opencv_com455.dll", "ptr")
DllCall("autoit_opencv_com455.dll\DllInstall", "int", 1, "wstr", A_IsAdmin = 0 ? "user" : "", "cdecl")
cv := ComObject("OpenCV.cv")
img := cv.imread("2.png", 0)
edges := cv.Canny(img, 100, 100)
cv.imshow("Image", img)
cv.imshow("edges_Image", edges)
cv.waitKey()
cv.destroyAllWindows()
效果图:
天黑版opencv_ahk.dll使用(改变了调用方式,优化速度…)
相关文件:https://wwz.lanzouw.com/iAkK803eaaud
cv2.ahk和log.ahk来自社区群友zzZ…
可以用文件中的天黑版的v2h版ahk运行。
示例:Canny边缘检测
#Dllload lib
#DllLoad opencv_ahk.dll
#include <cv2>
#include <log>
SetWorkingDir A_ScriptDir
;初始化opencv模块
cv := ObjFromPtr(DllCall('opencv_ahk.dll\opencv_init', 'ptr', DllCall(A_AhkPath '\ahkGetApi', 'ptr'), 'cdecl ptr'))
img := cv.imread("image/lena.png", 0)
;先降噪
cv.GaussianBlur(img, GaussianBlur := cv.MAT(), [5, 5], 0)
cv.Canny(img, edges := cv.MAT(), 100.0, 100.0)
cv.imshow("image", img)
cv.imshow("edges", edges)
cv.waitKey()
cv.destroyAllWindows()
细节
canny边缘检测之后的轮廓可能会出现断开的情况,影响到后续的操作,这时可以使用膨胀来连接断开的部分。
膨胀之后再进行操作
有错误请联系我改正!
本系列所有贡献者(AutoHotKey中文社区群友)不分先后:天黑请闭眼,zzZ…,演好自己,僵尸,城西,Tebayaki。