如何修改代码以创建用于调整检测参数的跟踪栏?

我有一个对帧进行阈值处理的代码。我想添加用于调整检测参数的跟踪栏,但是由于我是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)
Jade0769 回答:如何修改代码以创建用于调整检测参数的跟踪栏?

我想举一个例子,但最终创建了一个完整的脚本-见下文。

这个想法是为每个值创建一个跟踪栏(我将其放在单独的窗口中以方便使用)。移动轨迹栏时,会调用一个函数来修改全局颜色范围变量。然后执行阈值处理。

注意:要分离出特定颜色的RGB不是很好。在HSV色彩空间中,这要容易得多。该过程与下面的过程相同,但是首先将图像转换为HSV。
试用this script,它基本上是下面的脚本,但是带有HSV。

结果:

enter image description here

代码:

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

大家都在问