В OpenCV у меня есть маска области кадра. Как бы я тогда вставил другое изображение в это место в исходном кадре?

#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, попробуйте этот скрипт.

Генерация видеовыхода Вам нужна для создания видеозаписывающего устройства, и как только вся обработка изображения будет выполнена, запишите обработанный кадр в новое видео. Я почти уверен, что вы не можете читать и записывать в один и тот же видеофайл.

Далее смотрите Официальные документы здесь.

В нем есть оба примера того, как читать и записывать видео.