我想举一个例子,但最终创建了一个完整的脚本-见下文。
这个想法是为每个值创建一个跟踪栏(我将其放在单独的窗口中以方便使用)。移动轨迹栏时,会调用一个函数来修改全局颜色范围变量。然后执行阈值处理。
注意:要分离出特定颜色的RGB不是很好。在HSV色彩空间中,这要容易得多。该过程与下面的过程相同,但是首先将图像转换为HSV。
试用this script,它基本上是下面的脚本,但是带有HSV。
结果:
代码:
import numpy as np
import cv2
# Load image
frame = cv2.imread('img.jpg')
# create variables
lowerLimits = np.array([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",lambda x: setLowVal(x,2))
cv2.createTrackbar("highRed",lambda x: setHighVal(x,2))
cv2.createTrackbar("lowGreen",1))
cv2.createTrackbar("highGreen",1))
cv2.createTrackbar("lowBlue",0))
cv2.createTrackbar("highBlue",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",setLowRed)
对每种颜色执行此操作,然后在processImage()
中构建颜色范围数组
本文链接:https://www.f2er.com/3141237.html