我有一个对帧进行阈值处理的代码。我想添加用于调整检测参数的跟踪栏,但是由于我是OpenCV的新手,所以我不知道该怎么做。前提是我要检测橙色的高尔夫球,但是我做不到,所以我需要使用跟踪栏来调整检测参数,以便检测高尔夫球。之后,我可以添加斑点检测和x&y关键点检测。但是主要的问题是轨迹栏。
我添加了一个跟踪栏,但是它将框架更改为蓝色,并且没有更改任何其他内容,因此我将其删除。
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
# colour detection limits
lB = 125
lG = 125
lR = 125
hB = 255
hG = 255
hR = 255
lowerLimits = np.array([lB, lG, lR])
upperLimits = np.array([hB, hG, hR])
thresholded = cv2.inRange(frame, lowerLimits, upperLimits)
outimage = cv2.bitwise_and(frame, frame, mask = thresholded)
cv2.imshow('Original', frame)
cv2.imshow('Processed', outimage)
我想举一个例子,但是最终创建了一个完整的脚本-见下文。
想法是为每个值创建一个跟踪栏(为了方便使用,我将其放在单独的窗口中)。移动轨迹栏时,会调用一个函数来修改全局颜色范围变量。然后执行阈值化。
结果:
代码:
import numpy as np
import cv2
# Load image
frame = cv2.imread('img.jpg')
# create variables
lowerLimits = np.array([0, 0, 0])
upperLimits = np.array([255, 255, 255])
# functions to modify the color ranges
def setLowVal(val, col):
global lowerLimits
lowerLimits[col] = val
processImage()
def setHighVal(val, col):
global upperLimits
upperLimits[col] = val
processImage()
def processImage():
# treshold and mask image
thresholded = cv2.inRange(frame, lowerLimits, upperLimits)
outimage = cv2.bitwise_and(frame, frame, mask = thresholded)
#show img
cv2.imshow("Frame", outimage)
# create trackbars
cv2.namedWindow("Control")
cv2.createTrackbar("lowRed", "Control", 0,255, lambda x: setLowVal(x,2))
cv2.createTrackbar("highRed", "Control", 255,255, lambda x: setHighVal(x,2))
cv2.createTrackbar("lowGreen", "Control", 0,255, lambda x: setLowVal(x,1))
cv2.createTrackbar("highGreen", "Control", 255,255, lambda x: setHighVal(x,1))
cv2.createTrackbar("lowBlue", "Control", 0,255, lambda x: setLowVal(x,0))
cv2.createTrackbar("highBlue", "Control", 255,255, lambda x: setHighVal(x,0))
#show initial image
cv2.imshow("Frame", frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
请注意,我使用了lambda函数,因此我可以编写更少的代码,但是lambda并不是真正的初学者。如果您不完全了解,请知道您还可以执行以下操作:
def setLowRed(val):
global lowRed
lowRed = val
processImage()
cv2.createTrackbar("lowRed", "Control", 0,255, setLowRed)
对每种颜色执行此操作,然后在processImage()
中建立颜色范围数组