AHK调用opencv(十二)更改颜色空间 – ahk_v2_beta3

改变颜色空间

在 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()

AHK调用opencv(十二)更改颜色空间 - ahk_v2_beta3

目标追踪

现在我们知道了如何将 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
}

AHK调用opencv(十二)更改颜色空间 - ahk_v2_beta3

天黑版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。

给TA捐赠
共{{data.count}}人
人已捐赠
其他

新人报道

2022-3-24 20:44:01

其他教程

AHK调用opencv(十一)性能测量和改进技术 - ahk_v2_beta3

2022-3-24 20:45:44

3 条回复 A文章作者 M管理员
  1. ahker
    ahker给您打赏了¥2
  2. dbgba
    dbgba给您打赏了¥2
  3. AHK中文社区
    1河许人给您打赏了¥2
个人中心
购物车
优惠劵
有新私信 私信列表
搜索