有没有给cv2视频添加trackbar的好方法

Is there a good way to add a trackbar to cv2 Video

我想添加一个滤镜(其中除所选颜色外的所有内容都是灰度的),我可以使用轨迹栏进行操作。 轨迹栏出现,但在播放视频时没有显示任何效果。 我应该如何解决这个问题? 请各位有识之士帮忙

import cv2
import sys
import numpy as np
import os

FILE_PATH = os.path.dirname(os.path.abspath(__file__))

video = cv2.VideoCapture(FILE_PATH +'/city_ex.mp4')
if not video.isOpened():
    print("Video Open Failed")
    sys.exit()
def trackbar(pos):
    global frame

    h, w = frame.shape[:2]
    frame = cv2.resize(frame, (w//2, h//2))
    frame_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    hue_min = cv2.getTrackbarPos('Hue_min', 'video')
    hue_max = cv2.getTrackbarPos('Hue_max', 'video')

    mask = cv2.inRange(frame_hsv, (hue_min, 0, 0), (hue_max, 255, 255))
    mask_inv = cv2.bitwise_not(mask)

    colored_portion = cv2.bitwise_and(frame, frame, mask=mask)

    video_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    gray_portion = cv2.bitwise_or(video_gray, video_gray, mask=mask_inv)
    # gray_portion = np.stack((gray_portion,)*3, axis=-1)

    combined = colored_portion + gray_portion

    cv2.imshow('video', combined)

cv2.namedWindow('video')
cv2.createTrackbar('Hue_min', 'video', 0, 179, trackbar)
cv2.createTrackbar('Hue_max', 'video', 0, 179, trackbar)


while True:
    ret, frame = video.read()

    if not ret:
        break
    
    
    frame = show_change(frame)

    cv2.imshow('video', frame)
    
  

    

    key = cv2.waitKey(1)
    if key == 27:
        break

video.release()
cv2.destroyAllWindows()

我看到两个问题

  1. 你 运行 两个 imshow('video', ...) 所以它试图在同一个 window 和原始 frame 中显示两个不同的图像可能会快速替换 combined 所以你只能看到 frame。您应该只使用一个 imshow 并显示 combined.

  2. tracebar() 仅在您移动跟踪条时执行,并且仅在此处创建一个图像。您应该使用 tracebar() on 来获取值并分配给全局变量 hue_minhue_max - 然后您应该 运行 in while True 以便创建 combined 对于来自 file/webcam.

    的所有帧

我的版本

import cv2
import sys
import numpy as np
import os

# --- functions ---

def trackbar(pos):
    global hue_min
    global hue_max
    
    hue_min = cv2.getTrackbarPos('Hue_min', 'video')
    hue_max = cv2.getTrackbarPos('Hue_max', 'video')

# --- main ---

hue_min = 0
hue_max = 179

#FILE_PATH = os.path.dirname(os.path.abspath(__file__))
#video = cv2.VideoCapture(os.path.join(FILE_PATH, 'city_ex.mp4'))

video = cv2.VideoCapture(0) # webcam

if not video.isOpened():
    print("Video Open Failed")
    sys.exit()

cv2.namedWindow('video')
cv2.createTrackbar('Hue_min', 'video', 0, 179, trackbar)
cv2.createTrackbar('Hue_max', 'video', 0, 179, trackbar)

while True:
    ret, frame = video.read()

    if not ret:
        break
    
    h, w = frame.shape[:2]
    frame = cv2.resize(frame, (w//2, h//2))
    frame_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    mask = cv2.inRange(frame_hsv, (hue_min, 0, 0), (hue_max, 255, 255))
    mask_inv = cv2.bitwise_not(mask)

    colored_portion = cv2.bitwise_and(frame, frame, mask=mask)

    video_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    gray_portion = cv2.bitwise_or(video_gray, video_gray, mask=mask_inv)
    # gray_portion = np.stack((gray_portion,)*3, axis=-1)

    combined = colored_portion + gray_portion

    cv2.imshow('video', combined)
    
    key = cv2.waitKey(1)
    if key == 27:
        break

video.release()
cv2.destroyAllWindows()