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

Posted

技术标签:

【中文标题】通过单端口多头(立体声)usb 摄像头使用 Opencv 捕获视频,提供单输出【英文标题】:Video capture using Opencv through single port multi-head (stereo) usb camera giving single output 【发布时间】:2018-09-09 17:29:55 【问题描述】:

我最近通过Amazon 购买了立体相机,我想用它来进行深度映射。问题是我从摄像头获得的输出是单个视频的形式,其中包含两个摄像头的输出。

如果可能的话,我想要的是来自单个 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++ 提出一个独奏,它也对我有用

【问题讨论】:

您是否阅读过这篇博文albertarmea.com/post/opencv-stereo-camera。 闻起来像过早的优化(我什至都​​不敢这么称呼它)。很可能您需要的只是获得两个投资回报率,而成本可以忽略不计。即使您必须复制两半,与任何有意义的处理相比,成本也将是微不足道的。 |我会说专注于重要的部分,处理。当您完成这项工作并且您的测量确定图像采集是一个瓶颈时,您可以随时回来尝试改进它。 @DanMašek 谢谢,我在代码中添加了裁剪,它的效果可以忽略不计,事实上,它比使用两个单独的相机更快,因为这增加了整个图像管道的处理时间。在这里我们只有一张图像要处理,所以它大大减少了我的处理时间 是的,我就是这么想的 :) 另外,您知道这两个视图可以与给定的硬件同步。 【参考方案1】:

好的,所以在分析问题后,我认为最好的方法是将图像裁剪成两半,因为这样可以节省处理时间。如果您有两个不同的图像源,那么获取这些图像的管道时间会加倍。在使用裁剪和不裁剪测试立体相机后,我发现 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()

[

【讨论】:

以上是关于通过单端口多头(立体声)usb 摄像头使用 Opencv 捕获视频,提供单输出的主要内容,如果未能解决你的问题,请参考以下文章

USB媒体设备端口绑定(以海康会议摄像头为例)

在人脸识别机器视觉中USB免驱摄像头拍照颜色不对怎么办?大影30~1600万像素多种摄像头方案通过一次白平衡解决偏色问题。

CoreAudio,iOS:无法通过 RemoteIO 使用单声道输入和立体声输出

android录音采用的双麦克风还是单麦克风

使用单声道输入和立体声输出设置音频单元 iOS

通过 USB 编程访问多个网络摄像头