OpenCV系列 - 作者:cc   原链接:https://www.cnblogs.com/ff888/p/16783564.html

改变颜色空间

在 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
}

 

 

dbgba优化整理OpenCV系列示例打包下载20240513:

 

天黑版opencv_ahk.dll使用(改变了调用方式,优化速度…)

相关文件:https://wwz.lanzouw.com/iAkK803eaaud

cv2.ahk和log.ahk来自社区群友zzZ…

可以用文件中的天黑版的v2h版ahk运行。

 

v2H版示例:更改颜色空间

#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。

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。