Я пытаюсь выполнить обнаружение объекта (в видео, которое я записал) через пороговое значение в цветовом пространстве BGR и сохранить результат в выходном видео.
Предварительный просмотр, который я получаю с помощью cv2.imshow
, правильный, двоичная карта, которую я получаю для местоположения объекта, является правильной.
Однако эти кадры, показывающие бинарную карту (те, которые я обрабатываю с помощью cv2.inRange()
) отсутствуют в выходном видео.
Остальные видеокадры правильно записываются в выходное видео.
Кто-нибудь знает, что может быть причиной этой проблемы?
Спасибо!
Это мой код:
import cv2
# helper function to change what you do based on video seconds
# arguments "lower: int" and "upper: int" are measured in milliseconds
def between(cap, lower: int, upper: int) -> bool:
return lower <= int(cap.get(cv2.CAP_PROP_POS_MSEC)) < upper
cap = cv2.VideoCapture(input_video_file_path)
fps = int(round(cap.get(5)))
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # saving output video as .mp4
out = cv2.VideoWriter(output_video_file_path, fourcc, fps, (frame_width, frame_height)) # to create a VideoWriter object
# while loop where the real work happens
while cap.isOpened():
ret, frame = cap.read()
if ret:
if cv2.waitKey(28) & 0xFF == ord('q'):
break
if between(cap, 1000, 4000):
lower_blue = (82,0,0) #BGR
upper_blue = (255,143,61)
frame = cv2.inRange(frame,lower_blue,upper_blue)
frame = cv2.putText(frame, 'Grab in RBG', (50,50),cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255,255,255), 2, cv2.LINE_AA)
# write frame that you processed to output
out.write(frame)
# (optional) display the resulting frame
cv2.imshow('Frame', frame)
# Press Q on keyboard to exit
if cv2.waitKey(25) & 0xFF == ord('q'):
break
# Break the loop
else:
break
# When everything done, release the video capture and writing object
cap.release()
out.release()
# Closes all the frames
cv2.destroyAllWindows()
вы открыли Видеорайтер в цветном режиме (isColor=True) но результат inRange() имеет только один канал, так что это не будет записано на видео. добавить
cv2.cvtColor(frame,frame,cv2.COLOR_GRAY2BGR)
после inRange(), поэтому кадр, который вы пытаетесь записать, имеет необходимое количество каналов