2012-07-10 9 views
46

Tôi đang sử dụng OpenCV (2.4) và Python (2.7.3) bằng camera USB từ Thorlabs (DC1545M).Đặt thông số máy ảnh trong OpenCV/Python

Tôi đang thực hiện một số phân tích hình ảnh trên luồng video và tôi muốn có thể thay đổi một số thông số máy ảnh từ luồng video của mình. Điều khó hiểu là tôi có thể thay đổi một số thuộc tính máy ảnh nhưng không phải tất cả chúng, và tôi không chắc chắn về những gì tôi đang làm sai.

Đây là mã, sử dụng các ràng buộc CV2 bằng Python, và tôi có thể xác nhận rằng nó chạy:

import cv2 


#capture from camera at location 0 
cap = cv2.VideoCapture(0) 
#set the width and height, and UNSUCCESSFULLY set the exposure time 
cap.set(3,1280) 
cap.set(4,1024) 
cap.set(15, 0.1) 

while True: 
    ret, img = cap.read() 
    cv2.imshow("input", img) 
    #cv2.imshow("thresholded", imgray*thresh2) 

    key = cv2.waitKey(10) 
    if key == 27: 
     break 


cv2.destroyAllWindows() 
cv2.VideoCapture(0).release() 

Để tham khảo, đối số đầu tiên trong cap.set() lệnh đề cập đến liệt kê các thuộc tính máy ảnh, được liệt kê dưới đây:

0. CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds. 
1. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next. 
3. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file 
4. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream. 
5. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream. 
6. CV_CAP_PROP_FPS Frame rate. 
7. CV_CAP_PROP_FOURCC 4-character code of codec. 
8. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file. 
9. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() . 
10. CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode. 
11. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras). 
12. CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras). 
13. CV_CAP_PROP_SATURATION Saturation of the image (only for cameras). 
14. CV_CAP_PROP_HUE Hue of the image (only for cameras). 
15. CV_CAP_PROP_GAIN Gain of the image (only for cameras). 
16. CV_CAP_PROP_EXPOSURE Exposure (only for cameras). 
17. CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB. 
18. CV_CAP_PROP_WHITE_BALANCE Currently unsupported 
19. CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently) 

câu hỏi của tôi là:

Có thể đặt thời gian phơi sáng của máy ảnh (hoặc các thông số máy ảnh khác) thông qua python/opencv không?

Nếu không, tôi sẽ làm cách nào để thiết lập các thông số này?

Lưu ý: Có mã C++ do nhà sản xuất máy ảnh cung cấp, nhưng tôi không phải là chuyên gia (bằng ảnh dài) trong C++ và sẽ đánh giá cao mọi giải pháp dựa trên python.

Cảm ơn trước!

+2

Vì vậy, tùy chọn 15 là gì, tức là CV_CAP_PROP_EXPOSURE? Không phải là thời gian phơi sáng sao? –

+3

Đó là. Điểm tôi đang làm là cố gắng sửa đổi điều đó tạo ra bất kỳ kết quả có thể đo lường nào. (đó là 'cap.set (15, x)', không có giá trị 'x' tạo ra một thay đổi có thể đo lường được.) Nhân tiện, cảm ơn blog của bạn. Nó đã được vô cùng hữu ích cho tôi trong việc tăng tốc với opencv thông qua python. Bạn nhận được một upvote cho rằng :) – Mike

+0

dòng cuối cùng: cv2.VideoCapture (0) .release() có thể chỉ đơn giản là cap.release() :) – otterb

Trả lời

29

Không phải tất cả các thông số đều được hỗ trợ bởi tất cả các máy ảnh - thực ra, chúng là một trong những phần phiền hà nhất của thư viện OpenCV. Mỗi loại máy ảnh - từ máy ảnh android đến máy ảnh usb đến những máy ảnh proffesional cung cấp giao diện khác nhau để đặt thông số của máy ảnh. Và có rất nhiều chi nhánh trong mã OpenCV hỗ trợ nhiều người trong số họ, nhưng tất nhiên không phải tất cả các khả năng đều được bảo hiểm.

Điều bạn có thể làm là điều tra trình điều khiển máy ảnh của mình, tạo một bản vá cho OpenCV và gửi nó tới code.opencv.org. Bằng cách này, những người khác sẽ tận hưởng công việc của bạn, giống như cách bạn tận hưởng công việc của người khác.

Cũng có khả năng máy ảnh của bạn không hỗ trợ yêu cầu của bạn - hầu hết các cam USB đều rẻ và đơn giản. Có lẽ thông số đó không có sẵn để sửa đổi.

Nếu bạn chắc chắn máy ảnh hỗ trợ thông số đã cho (bạn nói nhà sản xuất máy ảnh cung cấp một số mã) và không muốn gây rối với OpenCV, bạn có thể bọc mã mẫu đó trong C++ bằng boost :: python, để làm cho nó có sẵn trong python. Sau đó, thích sử dụng nó.

+2

có danh sách máy ảnh hỗ trợ cho opencv trên cửa sổ mac linux không? có vẻ như trong tương lai tôi sẽ bắt đầu với phần mềm và sau đó làm việc trở lại phần cứng trước khi mua. viết một trình điều khiển máy ảnh là một mục tiêu tốt nhưng nó sẽ là một thời gian trước khi tôi có thể học cách làm điều đó. – user391339

+0

@sammy Tôi đã đăng câu hỏi về cách thực hiện việc này. Bạn có quan tâm đến việc xây dựng ở đây không: http://stackoverflow.com/questions/27914780/why-does-the-frame-width-height-not-always-get-set-using-opencv – evan54

14

tôi đã cùng một vấn đề với OpenCV trên Raspberry Pi ... không biết nếu điều này có thể giải quyết vấn đề của bạn, nhưng những gì làm việc cho tôi là

import time 
import cv2 


cap = cv2.VideoCapture(0) 

cap.set(3,1280) 

cap.set(4,1024) 

time.sleep(2) 

cap.set(15, -8.0) 

thời gian bạn phải sử dụng có thể khác nhau

+0

wow, mã của bạn đã tạo ra logitech của tôi webcam c615 hoạt động trên macbook của tôi với opencv! "nó chỉ hoạt động!" tôi đã cố gắng này trong nhiều ngày. Tôi không nghĩ rằng nó là khá HD và không chắc chắn nếu tôi có thể thay đổi các thông số tập trung, nhưng một khởi đầu thực sự tốt. – user391339

+0

Tôi không phải là một chuyên gia, và 3, 4 và 15 là những con số kỳ diệu đối với tôi. Nó có phải là sự thay thế cho ví dụ CV_CAP_PROP_FRAME_WIDTH? –

+3

cap.set (15, -8.0) nghĩa là gì? Tôi đang cố gắng đặt thời gian phơi sáng trên webcam logitech của mình. – user391339

20

Để tránh sử dụng giá trị số nguyên để xác định thuộc tính VideoCapture, người ta có thể sử dụng, ví dụ: cv2.cv.CV_CAP_PROP_FPS trong OpenCV 2.4 và cv2.CAP_PROP_FPS trong OpenCV 3.0. (Xem thêm bình luận của Stefan dưới đây.)

Đây là một chức năng tiện ích hoạt động cho cả OpenCV 2.4 và 3.0:

# returns OpenCV VideoCapture property id given, e.g., "FPS" 
def capPropId(prop): 
    return getattr(cv2 if OPCV3 else cv2.cv, 
    ("" if OPCV3 else "CV_") + "CAP_PROP_" + prop) 

OPCV3 được thiết lập trước đó trong mã tiện ích của tôi như thế này:

from pkg_resources import parse_version 
OPCV3 = parse_version(cv2.__version__) >= parse_version('3') 
+1

Tôi đã dành 10 phút cố gắng tìm ra những hằng số được định nghĩa bằng Python - cảm ơn bạn! – rescdsk

+2

bạn có quyền - nếu bạn sử dụng phiên bản như 2.4.9 (2014-04-25 tải xuống ổn định từ http://opencv.org/), bạn phải sử dụng điều 'cv2.cv.CV_CAP_PROP_XXXX' - để có thêm thông tin về điều này, hãy xem http://code.opencv.org/issues/3181 nếu bạn sử dụng nhánh mới nhất, bạn có thể sử dụng 'cv2.CAP_PROP_XXXX' –

6

Tôi đã không thể khắc phục vấn đề OpenCV một trong hai, nhưng một video4linux (v4l2) workaround không làm việc với OpenCV khi sử dụng Linux. Ít nhất, nó có trên Raspberry Pi của tôi với Rasbian và webcam rẻ của tôi. Đây không phải là rắn, nhẹ và di động như bạn muốn nó được, nhưng đối với một số trường hợp nó có thể rất hữu ích tuy nhiên.

Đảm bảo bạn đã cài đặt ứng dụng v4l2-ctl, ví dụ: từ gói Debian v4l-utils. Hơn chạy (trước khi chạy ứng dụng python, hoặc từ bên trong) lệnh:

v4l2-ctl -d /dev/video1 -c exposure_auto=1 -c exposure_auto_priority=0 -c exposure_absolute=10 

Nó ghi đè thời gian máy ảnh chụp của bạn để thiết lập thủ công và thay đổi thời gian màn trập (? Tính bằng ms) với tham số cuối cùng (trong này Ví dụ) 10. Giá trị này càng thấp, hình ảnh tối hơn.

+0

Điều này làm việc trên máy tính xách tay chạy trên nền tảng Intel của Intel chạy Ubuntu 14.04. Tôi đã sử dụng v4l2-ctl để đặt bất kỳ tùy chọn nào tôi muốn, bao gồm tỷ lệ khung hình. Tôi đã thử các thiết lập này với OpenCV nhưng có cùng lỗi như trên. –

0

Nếu ai vẫn còn tự hỏi điều gì giá trị trong CV_CAP_PROP_EXPOSURE có thể là:

Phụ thuộc. Đối với webcam giá rẻ của tôi, tôi phải nhập trực tiếp giá trị mong muốn, ví dụ: 0,1 cho 1/10s. Đối với máy ảnh công nghiệp đắt tiền của tôi, tôi phải nhập -5 để có thời gian phơi sáng là 2^-5s = 1/32s.

+0

chức năng thiết lập của OpenCV có thể xử lý số nguyên? –