Захват видео с использованием Opencv через однопортовую многоголовочную (стерео) USB-камеру с одним выходом - PullRequest
0 голосов
/ 09 сентября 2018

Я недавно купил стереокамеру через Amazon и хочу использовать ее для картирования глубины. Проблема в том, что вывод, который я получаю с камеры, осуществляется в виде одного видео с выходом обеих камер.

Camera output

То, что я хочу, - это два отдельных вывода из одного USB-порта, если это возможно. Я могу использовать обрезку, но я не хочу использовать это, потому что я пытаюсь сократить время обработки, и я хочу, чтобы выходы sepratley.

Полученное изображение было сгенерировано из следующего кода

  import numpy as np
  import cv2

  cam = cv2. VideoCapture(1)
  cam.set(cv2.CAP_PROP_FPS, 120)

  cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
  cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

  while(1):
  s,orignal = cam.read()
  cv2.imshow('original',orignal)

  if cv2.waitKey(1) & 0xFF == ord('w'):
  break


  cam.release()
  cv2.destroyAllWindows()

Я также пробовал другие методы, такие как:

  import numpy as np
  import cv2


  left = cv2.VideoCapture(1)
  right = cv2.VideoCapture(2)


  left.set(cv2.CAP_PROP_FRAME_WIDTH, 720)
  left.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
  right.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
  right.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

  left.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
  right.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))

  # Grab both frames first, then retrieve to minimize latency between cameras
  while(True):
  _, leftFrame = left.retrieve()
  leftWidth, leftHeight = leftFrame.shape[:2]
  _, rightFrame = right.retrieve()
  rightWidth, rightHeight = rightFrame.shape[:2]

  # TODO: Calibrate the cameras and correct the images

  cv2.imshow('left', leftFrame)
  cv2.imshow('right', rightFrame)
  if cv2.waitKey(1) & 0xFF == ord('q'):
  break

  left.release()
  right.release()
  cv2.destroyAllWindows()

но они не распознают третью камеру, любая помощь будет полезна.

Моя версия openCV - 3.4

P.S. Если кто-нибудь может представить решение на c ++, оно также будет работать для меня

1 Ответ

0 голосов
/ 09 сентября 2018

Хорошо, поэтому, проанализировав проблему, я решил, что лучшим способом было бы обрезать изображения пополам, поскольку это экономит время обработки. Если у вас есть два разных источника изображений, то для получения этих изображений время вашего конвейера удваивается. После тестирования стерео камеры с использованием обрезки и без обрезки я не увидел заметных изменений в FPS. Вот простой код для обрезки видео и отображения его в двух разных окнах.

import numpy as np
import cv2

cam = cv2.  VideoCapture(1)
cam.set(cv2.CAP_PROP_FPS, 120)

cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
s,orignal = cam.read()
height, width, channels = orignal.shape
print(width)
print(height)
while(1):
    s,orignal = cam.read()
    left=orignal[0:height,0:int(width/2)]
    right=orignal[0:height,int(width/2):(width)]
    cv2.imshow('left',left)
    cv2.imshow('Right',right)

    if cv2.waitKey(1) & 0xFF == ord('w'):

        break


cam.release()
cv2.destroyAllWindows()

[Left Image

Right Image

...