Кадры не записываются в выходное видео после использования cv2.inRange

Я пытаюсь выполнить обнаружение объекта (в видео, которое я записал) через пороговое значение в цветовом пространстве 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()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы открыли Видеорайтер в цветном режиме (isColor=True) но результат inRange() имеет только один канал, так что это не будет записано на видео. добавить

cv2.cvtColor(frame,frame,cv2.COLOR_GRAY2BGR)

после inRange(), поэтому кадр, который вы пытаетесь записать, имеет необходимое количество каналов

Другие вопросы по теме