Đặt thông số máy ảnh trong OpenCV / Python


86

Tôi đang sử dụng OpenCV (2.4) và Python (2.7.3) với máy ảnh USB từ Thorlabs (DC1545M).

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ố camera 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 của máy ảnh nhưng không phải tất cả chúng và tôi không chắc mình đang làm gì sai.

Đây là mã, sử dụng các liên kết cv2 trong 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 lệnh cap.set () đề cập đến việc liệt kê các thuộc tính camera, được liệt kê bên dưới:

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.
2. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file
3. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
4. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.
5. CV_CAP_PROP_FPS Frame rate.
6. CV_CAP_PROP_FOURCC 4-character code of codec.
7. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
8. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
9. CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
10. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
11. CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
12. CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
13. CV_CAP_PROP_HUE Hue of the image (only for cameras).
14. CV_CAP_PROP_GAIN Gain of the image (only for cameras).
15. CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
16. CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
17. CV_CAP_PROP_WHITE_BALANCE Currently unsupported
18. 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ẽ thiết lập các thông số này như thế nào?

Lưu ý: Có mã C ++ do nhà sản xuất máy ảnh cung cấp hướng dẫn cách thực hiện việc này, nhưng tôi không phải là chuyên gia (bằng một tầm xa) về C ++ và sẽ đánh giá cao bất kỳ giải pháp dựa trên python nào.

Cảm ơn trước!


3
Vậy tùy chọn thứ 15, tức là CV_CAP_PROP_EXPOSURE là gì? Đó không phải là thời gian tiếp xúc?
Abid Rahman K,

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

4
Anh ta đánh số sai chúng. Tất cả chúng đều QUÁ CAO. Ai đó hãy chỉnh sửa nó.
Katastic Voyage

1
@KatasticVoyage đã xong, bây giờ có vẻ phù hợp với tôi :)
linusg

2
Đối với opencv 4, tôi phải xóa tiền tố "CV" khỏi tên thuộc tính. Vì vậy cv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Markus Weber

Câu trả lời:


54

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 rắc rối 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 máy ảnh chuyên nghiệp cung cấp một giao diện khác nhau để sửa đổi các thông số của nó. Có nhiều nhánh trong mã OpenCV để hỗ trợ nhiều nhánh trong số đó, nhưng tất nhiên không phải tất cả các khả năng đều được bao phủ.

Những gì bạn có thể làm là điều tra trình điều khiển máy ảnh của mình, viết một bản vá cho OpenCV và gửi nó đến code.opencv.org. Bằng cách này, người khác sẽ thích công việc của bạn, giống như cách bạn thưởng thức 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ó thể thông số đó không có sẵn để sửa đổi.

Nếu bạn chắc chắn máy ảnh hỗ trợ một tham số nhất định (bạn nói rằng 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 bằng Python. Sau đó, tận hưởng sử dụng nó.


2
có danh sách các máy ảnh được hỗ trợ cho opencv trên mac linux windows 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 lại với phần cứng trước khi mua. Viết một trình điều khiển camera là một mục tiêu tốt nhưng sẽ mất một thời gian trước khi tôi có thể học cách làm điều đó.
user391339

@sammy Tôi đã đăng một câu hỏi về cách thực hiện việc này. Bạn có muốn giải thích thêm ở đây không: stackoverflow.com/questions/27914780/…
evan54

27

Tôi đã gặp vấn đề tương tự với openCV trên Raspberry Pi ... không biết liệu điều này có thể giải quyết được vấn đề của bạn hay không, nhưng điều đã hiệu quả với 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


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

2
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 không?
Allan Nørgaard

5
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

1
@ user391339 bạn đã đặt thời gian phơi sáng trên webcam Logitech chưa?
Abc

@ AllanNørgaard vâng, các lá cờ chỉ là số nguyên ngụy trang
Kev1n91 15/02/19

26

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

Đâ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 đặt trước đó trong mã tiện ích của tôi như sau:

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

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

2
bạn đúng - 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ừ opencv.org ), bạn phải sử dụng cv2.cv.CV_CAP_PROP_XXXXđiều này - để biết thêm thông tin về điều này, hãy xem code.opencv.org/issues/3181 nếu bạn sử dụng các chi nhánh mới nhất bạn có thể sử dụngcv2.CAP_PROP_XXXX
Stefan Krüger

Danh sách mới nhất về các thuộc tính chung của Video Capture có tại đây (OpenCV 4.3)
Mikolasan

8

Tôi cũng không thể khắc phục sự cố OpenCV, nhưng giải pháp video4linux (V4L2) hoạt động với OpenCV khi sử dụng Linux. Ít nhất, nó hoạt động trên Raspberry Pi của tôi với Rasbian và webcam rẻ tiền của tôi. Điều này không chắc chắn, nhẹ và di động như bạn muốn, nhưng đối với một số trường hợp, nó có thể rất hữu ích.

Đảm bảo rằng bạn đã cài đặt ứng dụng v4l2-ctl, ví dụ như 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 cửa trập máy ảnh của bạn thành cài đặt thủ công và thay đổi thời gian cửa trập (tính bằng mili giây?) Với tham số cuối cùng thành (trong ví dụ này) 10. Giá trị này càng thấp, hình ảnh càng tối.


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

4

Nếu ai đó vẫn đang thắc mắc giá trị trong CV_CAP_PROP_EXPOSUREcó 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 trong 1/10 giây. Đố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.


hàm thiết lập của OpenCV có thể xử lý số nguyên?
Saeed Masoomi, 14/09/17
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.