我想获得可用相机的数量。
我试着计算这样的相机:
for(int device = 0; device<10; device++)
{
VideoCapture cap(device);
if (!cap.isOpened())
return device;
}
如果我连接了相机,它永远不会打开。 所以我试着预览不同的设备,但我总是得到相机的图像。
如果连接第二台摄像机,则设备0为摄像机1,设备1-10为摄像机2。
我认为DirectShow设备存在问题。
如何解决这个问题?或者是否有类似OpenCV1 cvcamGetCamerasCount()
的功能?
我使用的是Windows 7和USB相机。
答案 0 :(得分:10)
OpenCV仍然没有枚举相机或获取可用设备数量的API。有关详细信息,请参阅OpenCV错误跟踪器上的this ticket。
VideoCapture的行为未定义为设备数量大于连接的设备数量,并且取决于用于与相机通信的API。有关OpenCV中使用的API列表,请参阅OpenCV 2.3 (C++,QtGui), Problem Initializing some specific USB Devices and Setups。
答案 1 :(得分:10)
即使这是一篇旧文章,也是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下测试:
使用0到3个Usb相机
答案 2 :(得分:7)
这是一篇非常古老的帖子,但我发现在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()
也许有人会觉得这很有用。
答案 3 :(得分:5)
我在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计算了两次自己的嵌入式相机。
答案 4 :(得分:0)
我也遇到过类似的问题。我通过使用videoInput.h库而不是Opencv来枚举摄像机并将索引传递给Videocapture对象来解决了这个问题。它解决了我的问题。
答案 5 :(得分:0)
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())