有没有给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()
我看到两个问题
你 运行 两个 imshow('video', ...)
所以它试图在同一个 window 和原始 frame
中显示两个不同的图像可能会快速替换 combined
所以你只能看到 frame
。您应该只使用一个 imshow
并显示 combined
.
tracebar()
仅在您移动跟踪条时执行,并且仅在此处创建一个图像。您应该使用 tracebar()
on 来获取值并分配给全局变量 hue_min
、hue_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()
我想添加一个滤镜(其中除所选颜色外的所有内容都是灰度的),我可以使用轨迹栏进行操作。 轨迹栏出现,但在播放视频时没有显示任何效果。 我应该如何解决这个问题? 请各位有识之士帮忙
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()
我看到两个问题
你 运行 两个
imshow('video', ...)
所以它试图在同一个 window 和原始frame
中显示两个不同的图像可能会快速替换combined
所以你只能看到frame
。您应该只使用一个imshow
并显示combined
.
的所有帧tracebar()
仅在您移动跟踪条时执行,并且仅在此处创建一个图像。您应该使用tracebar()
on 来获取值并分配给全局变量hue_min
、hue_max
- 然后您应该 运行 inwhile 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()