OpenCV / Pythonでのカメラパラメータの設定


87

Thorlabs(DC1545M)のUSBカメラでOpenCV(2.4)とPython(2.7.3)を使用しています。

ビデオストリームで画像分析を行っていますが、ビデオストリームからカメラパラメータの一部を変更できるようにしたいと考えています。紛らわしいのは、カメラのプロパティの一部を変更できるが、すべてを変更できるわけではなく、何が間違っているのかわからないことです。

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ベースのソリューションをいただければ幸いです。

前もって感謝します!


3
では、15番目のオプション、つまりCV_CAP_PROP_EXPOSUREとは何ですか?露出時間ではないですか?
Abid Rahman K

3
です。私が言っていたのは、それを修正しようとすると、測定可能な結果が得られるということです。(それはcap.set(15, x)、の値がx測定可能な変化をもたらさないところです。)ところで、あなたのブログに感謝します。Pythonを介してopencvに慣れるのに非常に役立ちました。あなたはそのための賛成を得ます:)
マイク

4
彼はそれらの番号を間違えました。それらはすべて1つ高すぎます。誰か編集してください。
Katastic Voyage 2017

1
@KatasticVoyageが完了しました、今私には正しいようです:)
linusg 2018

2
opencv 4の場合、プロパティ名から「CV」プレフィックスを削除する必要があります。だから、cv2.CV_CAP_PROP_FRAME_HEIGHT- >cv2.CAP_PROP_FRAME_HEIGHT
マルクス・ウェーバー

回答:


55

すべてのパラメーターがすべてのカメラでサポートされているわけではありません。実際、これらはOpenCVライブラリの最も厄介な部分の1つです。AndroidカメラからUSBカメラ、プロ仕様のカメラまで、各カメラタイプは、パラメーターを変更するための異なるインターフェイスを提供します。OpenCVコードには、それらの多くをサポートするための多くのブランチがありますが、もちろん、すべての可能性が網羅されているわけではありません。

あなたができることは、カメラドライバーを調査し、OpenCVのパッチを作成して、code.opencv.orgに送信することです。このようにして、他の人があなたの仕事を楽しむことができます。あなたが他の人を楽しむのと同じです。

お使いのカメラがあなたの要求をサポートしていない可能性もあります-ほとんどのUSBカムは安価でシンプルです。たぶん、そのパラメータは変更に利用できないだけです。

カメラが特定のパラメーターをサポートしていることが確実で(カメラの製造元がコードを提供していると言う)、OpenCVをいじりたくない場合は、そのサンプルコードをboost :: pythonでC ++にラップして、Pythonで使用できるようにすることができます。その後、それを使用してお楽しみください。


2
Mac Linux WindowsのOpenCVでサポートされているカメラの作業リストはありますか?将来的には、ソフトウェアから始めて、購入する前にハードウェアに戻るようです。カメラドライバーを書くことは良い目標ですが、それを学ぶことができるようになるまでにはしばらく時間がかかります。
user391339 2014

@sammyこれを行う方法について質問を投稿しました。あなたはここで詳しく説明する気になりますstackoverflow.com/questions/27914780/...
evan54

27

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)

使用しなければならない時間は異なる場合があります


うわー、あなたのコードは私のlogitech c615ウェブカメラをopencvで私のmacbookで動作させました!「それはうまくいく!」私はこれを何日も試していました。私はそれがかなりHDであるとは思わず、フォーカスパラメータを変更できるかどうかはわかりませんが、本当に良いスタートです。
user391339 2014

2
私は決して専門家ではありません。3、4、15は私にとって魔法の数字です。たとえば、CV_CAP_PROP_FRAME_WIDTHの代わりになりますか?
アランNørgaard

5
cap.set(15、-8.0)はどういう意味ですか?ロジクールのウェブカメラで露出時間を設定しようとしています。
user391339 2015

1
@ user391339 Logitech Webカメラで露出時間を設定しましたか?
abc 2017

@AllanNørgaardはい、フラグは偽装した整数です
Kev1n 9119

26

VideoCaptureプロパティを識別するために整数値を使用することを避けるために、たとえば、cv2.cv.CV_CAP_PROP_FPSOpenCV2.4およびOpenCV3.0で使用できますcv2.CAP_PROP_FPS。(以下のStefanのコメントも参照してください。)

ここに、OpenCV2.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')

2
これらの定数がPythonで定義されている場所を見つけるために、10分を費やしました-ありがとうございます!
rescdsk 2013

2
あなたは正しいです-あなたは2.4.9のようなバージョン(2014年4月25日からの安定したダウンロードを使用する場合opencv.orgを)あなたが使用する必要がありますcv2.cv.CV_CAP_PROP_XXXX事を-この参照の詳細に関する情報のため code.opencv.org/issues/3181 場合あなたが使用することができ、最新のブランチを使うcv2.CAP_PROP_XXXX
ステファン・クルーガー

ビデオの最新のリストは、一般的な性質をキャプチャされ、ここで(OpenCVの4.3)
Mikolasan

8

OpenCVの問題も修正できませんでしたが、Linuxを使用している場合、video4linux(V4L2)の回避策はOpenCVで機能ます。少なくとも、Rasbianを搭載したRaspberryPiと安価なWebカメラでは機能します。これは、あなたが望むほど頑丈で、軽く、持ち運び可能ではありませんが、状況によっては、それでも非常に役立つ場合があります。

たとえば、Debianv4l-utilsパッケージからv4l2-ctlアプリケーションがインストールされていることを確認してください。コマンドを実行するよりも(Pythonアプリケーションを実行する前、または内部から):

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

カメラのシャッター時間を手動設定に上書きし、最後のパラメーターでシャッター時間(ミリ秒単位?)を(この例では)10に変更します。この値を低くすると、画像が暗くなります。


これは、Ubuntu14.04を実行している東芝のIntelベースのラップトップで機能しました。v4l2-ctlを使用して、フレームレートなど、必要なオプションを設定しました。OpenCVでこれらの設定を試しましたが、上記と同じエラーが発生しました。
Derek Simkowiak 2015

4

の値が何であるかまだ疑問に思っている人がいる場合CV_CAP_PROP_EXPOSURE

依存します。私の安いウェブカメラの場合、希望の値を直接入力する必要があります。たとえば、1/10の場合は0.1です。私の高価な工業用カメラの場合、2 ^ -5s = 1 / 32sの露出時間を取得するには、-5を入力する必要があります。


OpenCVの集合関数は整数を処理できますか?
Saeed Masoomi 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.