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

目标追踪

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

posted @ 2022-10-12 10:11  c/  阅读(92)  评论(0编辑  收藏  举报