Как мне изменить свой код для создания трекбаров для настройки параметров обнаружения?
У меня есть код, который ограничивает кадр. Я хочу добавить трекбары для настройки параметров обнаружения, но поскольку я новичок в 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 ответ
Я хотел привести вам пример, но в итоге создал законченный сценарий - см. Ниже.
Идея состоит в том, чтобы создать трекбар для каждого значения (я поместил его в отдельное окно для удобства использования). Когда трекбар перемещается, вызывается функция, изменяющая глобальную переменную цветового диапазона. Затем выполняется пороговая обработка.
Примечание: для выделения определенного цвета 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()
Обратите внимание, что я использовал лямбда-функцию, чтобы писать меньше кода, но лямбда-функция - это не тема для начинающих. Если вы не совсем понимаете, знайте, что вы также можете сделать следующее:
def setLowRed(val):
global lowRed
lowRed = val
processImage()
cv2.createTrackbar("lowRed", "Control", 0,255, setLowRed)
Сделайте это для каждого цвета и создайте массив цветовых диапазонов в processImage()