Как мне изменить мой код, чтобы создать трекбары для настройки параметров обнаружения? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть код, который пороговый кадр. Я хочу добавить трекбары для настройки параметров обнаружения, но поскольку я новичок в OpenCV, я не могу понять, как это сделать. Предполагается, что у меня есть и оранжевый мяч для гольфа, который я хочу обнаружить, но я не могу этого сделать, поэтому мне нужны трекбары для настройки параметров обнаружения, чтобы я мог обнаружить мяч для гольфа. После этого я могу добавить обнаружение BLOB-объектов и обнаружение ключевых точек 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)

1 Ответ

0 голосов
/ 08 ноября 2019

Я хотел дать вам пример, но в итоге создал полный скрипт - см. Ниже.

Идея состоит в том, чтобы создать трекбар для каждого значения (я поместил его в отдельное окно для простоты использования). Когда трэкбар перемещается, вызывается функция, изменяющая глобальную переменную цветового диапазона. Затем выполняется пороговое значение.

Примечание: для выделения определенного цвета RGB не очень хорош. Это намного проще в цветовом пространстве HSV. Процесс аналогичен приведенному ниже, но изображение сначала преобразуется в HSV.
Попробуйте этот сценарий , в основном это сценарий ниже, но с 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, 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()

Обратите внимание, что я использовал лямбда-функцию, чтобы я мог писать меньше кода, но лямбда недействительно тема для начинающих. Если вы не совсем понимаете, знайте, что вы также можете сделать следующее:

def setLowRed(val):
    global lowRed
    lowRed = val
    processImage()

cv2.createTrackbar("lowRed", "Control", 0,255, setLowRed)

Сделайте это для каждого цвета и создайте массив цветового диапазона в processImage()

...