如何计算 OpenCV 2.3 中的摄像头?
Posted
技术标签:
【中文标题】如何计算 OpenCV 2.3 中的摄像头?【英文标题】:How to count cameras in OpenCV 2.3? 【发布时间】:2011-09-06 16:11:00 【问题描述】:我想获取可用摄像头的数量。
我试着像这样数相机:
for(int device = 0; device<10; device++)
VideoCapture cap(device);
if (!cap.isOpened())
return device;
如果我连接了摄像头,它就永远无法打开。 所以我尝试预览不同的设备,但我总是得到我相机的图像。
如果我连接第二个摄像头,设备 0 是摄像头 1,设备 1-10 是摄像头 2。
我认为 DirectShow 设备存在问题。
如何解决这个问题?或者有没有类似OpenCV1cvcamGetCamerasCount()
的功能?
我使用的是 Windows 7 和 USB 摄像头。
【问题讨论】:
【参考方案1】:OpenCV 仍然没有 API 来枚举相机或获取可用设备的数量。有关详细信息,请参阅 OpenCV 错误跟踪器上的 this ticket。
对于大于已连接设备数的设备编号,VideoCapture 的行为未定义,并且取决于用于与您的相机通信的 API。有关 OpenCV 中使用的 API 列表,请参阅 OpenCV 2.3 (C++,QtGui), Problem Initializing some specific USB Devices and Setups。
【讨论】:
【参考方案2】:即使这是一个旧帖子,这里也是 OpenCV 2/C++ 的解决方案
/**
* Get the number of camera available
*/
int countCameras()
cv::VideoCapture temp_camera;
int maxTested = 10;
for (int i = 0; i < maxTested; i++)
cv::VideoCapture temp_camera(i);
bool res = (!temp_camera.isOpened());
temp_camera.release();
if (res)
return i;
return maxTested;
在 Windows 7 x64 下测试:
OpenCV 3 [自定义构建] OpenCV 2.4.9 OpenCV 2.4.8带有 0 到 3 个 USB 摄像头
【讨论】:
如果不存在,则打开相机时在 opencv 2.4.8 上崩溃。 2.4.9 对我来说不会崩溃(Windows 8.1)。但是,它还会发现一个被另一个进程阻塞的相机,如果您尝试接收新图像并尝试在没有.isEmpty
检查的情况下使用它(因为被阻塞的凸轮抓取的图像是空的),它将崩溃。不知何故,OpenCV 让我的相机崩溃了,即使在电脑重启后也没有解锁它,所以我不得不在操作系统中停用它并稍后重新激活......
你的代码在 Git 的某个地方吗,我也有 windows 8.1,我想检查它是 Windows 平台问题还是 OpenCV 错误
@jgd : 你能告诉我你使用的女巫版本,多少个摄像头,在女巫系统上能够再次检查我的代码(一年前完成)
@BlouBlou Windows,opencv 2.4.2,在带有两个摄像头的平板电脑上。而在笔记本电脑上进行的另一项测试,使用相同版本的 opencv,只有一个摄像头【参考方案3】:
这是一篇非常古老的帖子,但我发现在 Ubuntu 14.04 和 OpenCv 3 上的 Python 2.7 下,这里的解决方案都没有为我工作。相反,我在 Python 中想出了类似的东西:
import cv2
def clearCapture(capture):
capture.release()
cv2.destroyAllWindows()
def countCameras():
n = 0
for i in range(10):
try:
cap = cv2.VideoCapture(i)
ret, frame = cap.read()
cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
clearCapture(cap)
n += 1
except:
clearCapture(cap)
break
return n
print countCameras()
也许有人会觉得这很有用。
【讨论】:
【参考方案4】:我在 Python 中这样做:
def count_cameras():
for i in range(10):
temp_camera = cv.CreateCameraCapture(i-1)
temp_frame = cv.QueryFrame(temp_camera)
del(temp_camera)
if temp_frame==None:
del(temp_frame)
return i-1 #MacbookPro counts embedded webcam twice
可悲的是,Opencv 无论如何都会打开 Camera 对象,即使那里什么也没有,但是如果您尝试提取其内容,则将没有任何内容可归因。您可以使用它来检查您的相机数量。它适用于我测试的每个平台,所以很好。
返回i-1
的原因是MacBookPro对自己的嵌入式摄像头计数了两次。
【讨论】:
【参考方案5】:我也遇到过类似的问题。我通过使用 videoInput.h 库而不是 Opencv 来枚举摄像机并将索引传递给 Videocapture 对象,从而解决了这个问题。它解决了我的问题。
【讨论】:
【参考方案6】:Python 3.6:
import cv2
# Get the number of cameras available
def count_cameras():
max_tested = 100
for i in range(max_tested):
temp_camera = cv2.VideoCapture(i)
if temp_camera.isOpened():
temp_camera.release()
continue
return i
print(count_cameras())
【讨论】:
以上是关于如何计算 OpenCV 2.3 中的摄像头?的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV - 从 C/C++ 中的默认网络摄像头获取图片 - GTK 问题
如何利用opencv计算图像畸变系数,并进行校正与摄像机标定?