改变颜色空间
在 OpenCV 中有超过 150 种颜色空间转换的方法(https://docs.opencv.org/4.x/d8/d01/group__imgproc__color__conversions.html#gga4e0972be5de079fed4e3a10e24ef5ef0a353a4b8db9040165db4dacb5bcefb6ea)。
但我们仅需要研究两个最常使用的方法,他们是 BGR 到 Gray,BGR 到 HSV。
我们使用 cv.cvtColor(input_image, flag)函数进行颜色转换,其中 flag 决定了转换的类型。
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")
img_gray := cv.cvtColor(img, 6) ;cv::COLOR_BGR2GRAY = 6
img_hsv := cv.cvtColor(img, 40) ;cv::COLOR_BGR2HSV = 40
cv.imshow("Image_gray", img_gray)
cv.imshow("Image_hsv", img_hsv)
cv.waitKey()
cv.destroyAllWindows()
目标追踪
现在我们知道了如何将 BGR 图片转化为 HSV 图片,我们可以使用它去提取彩色对象。HSV 比 BGR 在颜色空间上更容易表示颜色。在我们的应用中,我们会尝试提取一个蓝色的彩色对象,方法为:
- 提取每一视频帧。
- 将 BGR 转化为 HSV 颜色空间。
- 我们用蓝色像素的范围对该 HSV 图片做阈值。
- 现在提取出了蓝色对象,我们可以随意处理图片了 。
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")
cap := ComObject("OpenCV.cv.VideoCapture")
frame := ComObject("OpenCV.cv.MAT")
cap.open(0)
While True{
ret := cap.read(frame)
img_hsv := cv.cvtColor(frame, 40)
lower_blue := ComArrayMake([110, 50, 50])
upper_blue := ComArrayMake([130, 255, 255])
mask := cv.inrange(img_hsv, lower_blue, upper_blue)
res := cv.bitwise_and(frame, frame, mask := mask)
cv.imshow("frame", frame)
cv.imshow("mask", mask)
cv.imshow("res", res)
}
cv.waitKey()
cv.destroyAllWindows()
ComArrayMake(inputArray)
{
arr := ComObjArray(VT_VARIANT:=12, inputArray.Length)
Loop inputArray.Length
{
arr[A_Index-1] := inputArray[A_Index]
}
return arr
}
天黑版opencv_ahk.dll使用(改变了调用方式,优化速度…)
相关文件:https://wwz.lanzouw.com/iAkK803eaaud
cv2.ahk和log.ahk来自社区群友zzZ…
可以用文件中的天黑版的v2h版ahk运行。
示例:更改颜色空间
#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")
cv.imshow("image", img)
;更改颜色空间
img_gray := cv.MAT()
cv.cvtColor(img, img_gray, cv2.CV_COLOR_BGR2GRAY)
img_hsv := cv.MAT()
cv.cvtColor(img, img_hsv, cv2.CV_COLOR_BGR2HSV)
cv.imshow("Image_gray", img_gray)
cv.imshow("Image_hsv", img_hsv)
;目标追踪
cap := cv.VideoCapture()
frame := cv.Mat()
cap.open(0)
while true{
ret := cap.read(frame)
cv.cvtColor(frame, img_hsv := cv.MAT(), cv2.CV_COLOR_BGR2HSV)
cv.inrange(img_hsv, cv.Vector_int([110, 50, 50]), cv.Vector_int([130, 255, 255]), mask := cv.MAT())
cv.bitwise_and(frame, frame, res := cv.MAT(), mask := mask)
cv.imshow("frame", frame)
cv.imshow("mask", mask)
cv.imshow("res", res)
}
cv.waitKey()
cv.destroyAllWindows()
有错误请联系我改正!
本系列所有贡献者(AutoHotKey中文社区群友)不分先后:天黑请闭眼,zzZ…,演好自己,僵尸,城西,Tebayaki。