使用Opencv通过单端口多头(立体声)USB摄像头捕获视频,提供单输出

时间:2018-09-09 17:29:55

标签: python c++ opencv stereo-3d

我最近通过Amazon购买了一个立体相机,我想将其用于深度映射。问题是我从摄像机获得的输出是单个视频的形式,而两个摄像机都有输出。

Camera output

如果可能的话,我想要的是从单个USB端口获得两个单独的输出。我可以使用裁切,但是我不想使用它,因为我正试图减少处理时间,并且希望输出sepratley。

obove图像是通过以下代码生成的

  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 :(得分:2)

好吧,在分析了问题之后,我发现最好的方法是将图像裁剪一半,因为这样可以节省处理时间。如果您有两个不同的图像源,则获取这些图像所需的流水线时间将增加一倍。在经过裁剪且没有裁剪的情况下测试了立体摄像机之后,我发现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