OpenCV(2.4)およびPython(2.7.3)をThorlabs(DC1545M)のUSBカメラで使用しています。
ビデオストリームで画像解析を行っていますが、ビデオストリームのカメラパラメーターの一部を変更できるようにしたいと思います。紛らわしいのは、カメラのプロパティの一部を変更できることですが、すべてを変更することはできません。また、自分が何を間違っているのかわかりません。
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.
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)
私の質問は:
python/opencvを介してカメラの露出時間(または他のカメラパラメーター)を設定することは可能ですか?
そうでない場合、これらのパラメーターをどのように設定しますか?
注:これを行う方法を示すカメラメーカーによって提供されるC++コードがありますが、私は(ロングショットで)C++の専門家ではなく、Pythonベースのソリューションに感謝します。
前もって感謝します!
すべてのパラメータがすべてのカメラでサポートされているわけではありません-実際、それらはOpenCVライブラリの最も厄介な部分の1つです。 AndroidカメラからUSBカメラ、プロ用カメラまで、各カメラタイプには、パラメータを変更するための異なるインターフェースがあります。 OpenCVコードには多くのブランチがあり、それらの多くをサポートしていますが、もちろんすべての可能性が網羅されているわけではありません。
できることは、カメラドライバーを調査し、OpenCVのパッチを作成して、code.opencv.orgに送信することです。このようにして、他の人があなたの仕事を楽しむようになります。
カメラがリクエストをサポートしていない可能性もあります-ほとんどのUSBカムは安価でシンプルです。たぶん、そのパラメーターは変更に利用できないだけです。
カメラが特定のパラメーターをサポートしていると確信している場合(カメラの製造元がコードを提供していると言います)、OpenCVを台無しにしたくない場合は、Pythonで使用できるように、boost :: pythonでC++でそのサンプルコードをラップできます。その後、それを使用してお楽しみください。
整数値を使用してVideoCapture
プロパティを識別することを避けるために、たとえば、OpenCV 2.4ではcv2.cv.CV_CAP_PROP_FPS
、OpenCV 3.0ではcv2.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')
Raspberry Piの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)
使用しなければならない時間が異なる場合があります
OpenCVの問題も修正できませんでしたが、Linuxを使用している場合、video4linux(V4L2)の回避策は機能しますwith OpenCV。少なくとも、Rasbianを搭載したRaspberry Piと安価なWebカメラでは機能します。これは、あなたが望むほど堅固で、軽量で、ポータブルではありませんが、それでも、いくつかの状況では、それは非常に便利かもしれません。
V4l2-ctlアプリケーションがインストールされていることを確認してください。 Debian v4l-utilsパッケージから。コマンドを実行する(pythonアプリケーションを実行する前、または内部から):
v4l2-ctl -d /dev/video1 -c exposure_auto=1 -c exposure_auto_priority=0 -c exposure_absolute=10
カメラのシャッター時間を手動設定に上書きし、最後のパラメーターを(この例では)10にしてシャッター時間(ms?)を変更します。この値が低いほど、画像は暗くなります。
CV_CAP_PROP_EXPOSURE
の値が何であるかをまだ疑問に思っている場合:
依存します。安いウェブカメラの場合、希望する値を直接入力する必要があります。 1/10の場合は0.1。高価な産業用カメラの場合、露光時間を2 ^ -5s = 1/32sにするには-5を入力する必要があります。