0

我有一个阈值框架的代码。我想添加用于调整检测参数的轨迹栏,但因为我是 OpenCV 的新手,所以我不知道如何做到这一点。前提是我有一个橙色的高尔夫球,我想检测,但是我做不到,所以我需要trackbars来调整检测参数,这样我就可以检测到高尔夫球了。之后,我可以添加斑点检测和 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)
4

1 回答 1

0

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

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

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

结果:

在此处输入图像描述

代码:

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

于 2019-11-07T23:33:06.323 回答