#python #opencv #video
#python #opencv #Видео
Вопрос:
Я новичок в OpenCV и, похоже, не могу найти способ сделать это (вероятно, это связано с тем, что я не знаю какого-либо конкретного жаргона).
Я перебираю кадры видео и извлекаю маску из видео, где она отображается зеленым цветом с помощью inRange. Я ищу способ затем вставить изображение в это место в исходном кадре. Код, который я использую для извлечения кадров / маски, приведен ниже.
import numpy as np
import cv2
cap = cv2.VideoCapture('vid.mov')
image = cv2.imread('photo.jpg')
# green digitally added not much variance
lower = np.array([0, 250, 0])
upper = np.array([10, 260, 10])
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
cv2.imshow('frame', frame)
# get mask of green area
mask = cv2.inRange(frame, lower, upper)
cv2.imshow('mask', mask)
if cv2.waitKey(1) amp; 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Комментарии:
1. Привет, вы можете загрузить образец видео и фотографию.
2. синтаксис c имеет mat.CopyTo(назначение, маска) вероятно, синтаксис python имеет нечто подобное. Но оба изображения должны быть одинакового размера
Ответ №1:
Используйте побитовые операции для маскирования и связанных с ними двоичных операций. Пожалуйста, проверьте приведенный ниже код, чтобы увидеть, как выполняются побитовые операции.
Код
import numpy as np
import cv2
cap = cv2.VideoCapture('../video.mp4')
image = cv2.imread('photo.jpg')
# green digitally added not much variance
lower = np.array([0, 250, 0])
upper = np.array([10, 260, 10])
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
cv2.imshow('frame', frame)
# get mask of green area
mask = cv2.inRange(frame, lower, upper)
notMask = cv2.bitwise_not(mask)
imagePart=cv2.bitwise_and(image, image, mask = mask)
videoPart=cv2.bitwise_and(frame, frame, mask = notMask)
output = cv2.bitwise_or(imagePart, videoPart)
cv2.imshow('output', output)
if cv2.waitKey(1) amp; 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Плохое цветовое пространство RGB
Поскольку вы выполняете обработку цвета, я бы посоветовал вам использовать соответствующее цветовое пространство. HSV был бы хорошим началом для вас. Чтобы найти хороший диапазон значений HSV, попробуйте этот скрипт.
Генерация видеовыхода Вам нужна для создания видеозаписывающего устройства, и как только вся обработка изображения будет выполнена, запишите обработанный кадр в новое видео. Я почти уверен, что вы не можете читать и записывать в один и тот же видеофайл.
Далее смотрите Официальные документы здесь.
В нем есть оба примера того, как читать и записывать видео.