2011-09-06 39 views
21

Tôi muốn nhận được số lượng máy ảnh khả dụng.Cách đếm máy ảnh trong OpenCV 2.3?

tôi đã cố gắng để đếm camera như thế này:

for(int device = 0; device<10; device++) 
{ 
    VideoCapture cap(device); 
    if (!cap.isOpened()) 
     return device;   
} 

Nếu tôi có một máy ảnh kết nối, nó không bao giờ thất bại trong việc mở. Vì vậy, tôi đã cố gắng xem trước các thiết bị khác nhau nhưng tôi luôn nhận được hình ảnh của máy ảnh của mình.

Nếu tôi kết nối một camera thứ hai, thiết bị 0 là camera 1 và thiết bị 1-10 là camera 2.

Tôi nghĩ có một vấn đề với các thiết bị DirectShow.

Cách giải quyết vấn đề này? Hoặc là có một chức năng như trong OpenCV1 cvcamGetCamerasCount()?

Tôi đang sử dụng máy ảnh Windows 7 và USB.

Trả lời

10

OpenCV vẫn không có API để liệt kê máy ảnh hoặc nhận số lượng thiết bị khả dụng. Xem this ticket trên trình theo dõi lỗi OpenCV để biết chi tiết.

Hành vi của VideoCapture không được xác định cho số thiết bị lớn hơn số lượng thiết bị được kết nối và phụ thuộc từ API được sử dụng để liên lạc với máy ảnh của bạn. Xem OpenCV 2.3 (C++,QtGui), Problem Initializing some specific USB Devices and Setups để biết danh sách các API được sử dụng trong OpenCV.

5

Tôi làm điều này bằng 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 

Đáng buồn thay OpenCV mở đối tượng máy ảnh dù sao, ngay cả khi không có gì ở đó, nhưng nếu bạn cố gắng trích xuất nội dung của nó, sẽ có gì để gán cho. Bạn có thể sử dụng điều đó để kiểm tra số lượng máy ảnh của mình. Nó hoạt động trong mọi nền tảng tôi đã thử nghiệm để nó tốt.

Lý do trả lại i-1 là MacBookPro Đếm máy ảnh nhúng riêng của mình hai lần.

+1

Đó là vì nếu bạn đặt 'id = -1', máy ảnh sẽ có camera đầu tiên .. – Lipis

10

Thậm chí nếu nó là một bài cũ đây là một giải pháp cho 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; 
} 

Tested dưới Windows 7 x64 với:

  • OpenCV 3 [Custom Build]
  • OpenCV 2.4. 9
  • OpenCV 2.4.8

Với 0 đến 3 Máy quay USB

+0

gặp lỗi khi mở máy ảnh 2.4.8 khi mở máy ảnh nếu không tồn tại. – Prasaathviki

+0

2.4.9 không sụp đổ cho tôi (Windows 8.1). Tuy nhiên, nó cũng tìm thấy một máy ảnh bị chặn bởi một quá trình khác sẽ bị lỗi nếu bạn cố gắng nhận một hình ảnh mới và cố gắng sử dụng nó mà không cần kiểm tra '.isEmpty' (vì ảnh chụp bởi một cam bị chặn đang trống). Bằng cách nào đó OpenCV bị rơi máy ảnh của tôi và không mở khóa ngay cả sau khi khởi động lại máy tính, vì vậy tôi đã phải tắt nó trong hệ điều hành và kích hoạt lại sau ... – Micka

+0

bạn có mã của bạn ở đâu đó trong Git, tôi cũng có cửa sổ 8.1 và tôi muốn kiểm tra nếu đó là vấn đề nền tảng Windows hoặc lỗi OpenCV – BlouBlou

6

Đây là một bài đăng rất cũ nhưng tôi thấy rằng dưới Python 2.7 trên Ubuntu 14.04 và OpenCv 3 không có giải pháp nào ở đây có hiệu quả đối với tôi. Thay vào đó tôi đã đưa ra một cái gì đó như thế này trong 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() 

Có thể ai đó sẽ thấy điều này hữu ích.

0

Tôi cũng đã gặp phải vấn đề tương tự. Tôi giải quyết vấn đề bằng cách sử dụng thư viện videoInput.h thay vì Opencv để liệt kê các camera và truyền chỉ mục cho đối tượng Videocapture. Nó giải quyết vấn đề của tôi.

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()) 
Các vấn đề liên quan