2012-07-10 350 views
46

我使用Thorlabs(DC1545M)的USB攝像頭使用OpenCV(2.4)和Python(2.7.3)。在OpenCV/Python中設置攝像機參數

我正在做一些視頻流的圖像分析,我希望能夠從我的視頻流中更改一些相機參數。令人困惑的是我能夠改變一些相機的屬性,但不是所有的相機屬性,我不確定我做錯了什麼。

下面是代碼,在Python使用CV2綁定和我可以證實,它運行:

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() 

作爲參考,在cap.set的第一個參數()命令指相機性能的列舉,列舉如下:

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) 

我的問題是:

是否可以通過python/opencv設置相機曝光時間(或其他相機參數)?

如果不是,我將如何去設置這些參數?

注意:有相機制造商提供的C++代碼顯示瞭如何做到這一點,但我不是C++的專家(很長一段時間),並會欣賞任何基於python的解決方案。

在此先感謝!

+2

那麼什麼是第15個選項,即CV_CAP_PROP_EXPOSURE?是不是曝光時間? – 2012-07-11 09:18:59

+3

是的。我所做的一點是,試圖修改它會產生任何可衡量的結果。 (這是'cap.set(15,x)',沒有'x'的值會產生可測量的變化。) 順便說一句,感謝您的博客。對於通過python加快opencv的速度,我已經非常有用了。你得到一個贊成:) – Mike 2012-07-11 20:01:36

+0

最後一行:cv2.VideoCapture(0).release()可以簡單地是cap.release():) – otterb 2013-10-07 12:54:54

回答

29

並非所有參數都支持所有參數 - 實際上,它們是OpenCV庫中最麻煩的部分之一。每個相機類型 - 從android相機到usb相機到專業相機都提供了不同的界面來設置其參數。 OpenCV代碼中有許多分支可以支持其中的很多分支,但當然並不涵蓋所有可能性。

你可以做的是調查你的相機驅動程序,打開OpenCV的補丁併發送到code.opencv.org。這樣,其他人會喜歡你的工作,就像你喜歡他人一樣。

也有可能您的相機不支持您的請求 - 大多數USB攝像頭便宜,簡單。也許這個參數不能用於修改。

如果您確定相機支持給定的參數(您說相機制造商提供了一些代碼)並且不想混淆OpenCV,那麼可以使用boost :: python將該示例代碼包裝在C++中,以使其在python中可用。然後,享受使用它。

+2

是否有支持在mac linux上使用opencv的相機的工作列表?聽起來像將來我會從軟件開始,然後在購買之前回到硬件。編寫攝像頭驅動程序是一個不錯的目標,但是在我可以學會這麼做之前還需要一段時間。 – user391339 2014-02-19 18:28:57

+0

@sammy我發佈了一個關於如何做到這一點的問題。您是否願意在此詳細說明:http://stackoverflow.com/questions/27914780/why-does-the-frame-width-height-not-always-get-set-using-opencv – evan54 2015-01-13 04:34:03

14

我跟OpenCV的對樹莓派同樣的問題...不知道這是否可以解決您的問題,而是什麼工作對我來說是

import time 
import cv2 


cap = cv2.VideoCapture(0) 

cap.set(3,1280) 

cap.set(4,1024) 

time.sleep(2) 

cap.set(15, -8.0) 

你必須使用可以是不同的時間

+0

哇,您的代碼使我的Logitech c615攝像頭在我的macbook上使用opencv工作! 「它行得通!」我一直在嘗試這個好幾天。我不認爲這是相當高清,不知道我是否可以改變焦點參數,但一個非常好的開始。 – user391339 2014-02-19 18:33:24

+0

我絕不是專家,3,4和15是我的魔法數字。它是否替代了CV_CAP_PROP_FRAME_WIDTH? – 2014-12-12 14:38:46

+3

cap.set(15,-8.0)是什麼意思?我正在嘗試在我的Logitech攝像頭上設置曝光時間。 – user391339 2015-02-10 08:28:14

20

爲了避免使用整數值來標識屬性,可以在OpenCV 3.0中使用OpenCV 2.4和cv2.CAP_PROP_FPS中的cv2.cv.CV_CAP_PROP_FPS。 (另請參閱下面的Stefan的評論。)

這裏有一個適用於OpenCV 2.4和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較早設置我的事業像這樣的代碼:

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

我花了10分鐘試圖找到那些常量在Python中定義的位置 - 謝謝! – rescdsk 2013-04-09 18:55:26

+2

你是對的 - 如果你使用2.4.9版本(2014-04-25從http://opencv.org/穩定下載),你必須使用'cv2.cv.CV_CAP_PROP_XXXX'的東西 - 更多信息關於這一點,請參閱http://code.opencv.org/issues/3181如果您使用最新的分支,您可以使用'cv2.CAP_PROP_XXXX' – 2014-07-22 07:12:04

6

我沒能解決問題的OpenCV要麼,但video4linux實現(V4L2)變通辦法工作使用Linux時的OpenCV。至少,它在我的Raspberry Pi上用Rasbian和我便宜的網絡攝像頭。這並不像你想要的那樣堅固,輕便和便攜,但是在某些情況下,它可能非常有用。

確保您安裝了v4l2-ctl應用程序,例如來自Debian v4l-utils軟件包。

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

它會覆蓋你的相機快門時間手動設置,並與最後一個參數更改快門時間(?毫秒)(在此:不是運行命令(或從內運行的Python應用程序之前)例如)10.這個值越低,圖像越暗。

+0

這工作在我的東芝基於Intel的筆記本電腦上運行Ubuntu 14.04。我用v4l2-ctl來設置我想要的任何選項,包括幀速率。我確實使用OpenCV嘗試了這些設置,但得到了與上述相同的錯誤。 – 2015-08-20 05:45:02

0

如果有人仍然不知道什麼CV_CAP_PROP_EXPOSURE值可能是:

依賴。對於我的廉價攝像頭,我必須直接輸入所需的值,例如0.1爲1/10s。對於我昂貴的工業相機,我必須輸入-5來獲得2^-5s = 1/32s的曝光時間。

+0

OpenCV的設置函數可以處理整數嗎? – 2017-09-14 16:54:04