画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(Translate)

プロフィール

Akira

ニックネーム:Akira
東京都の町田事業所に勤務
画像処理ソフトの開発を行っています。リンクフリーです!
詳細プロフィールは こちら
お問い合わせは、こちら↓

【補助HP】
画像処理ソリューションWeb版 【Newブログ】
イメージングソリューション

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

07 | 2017/08 | 09
S M T W T F S
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

趣味のブログ

iPhone萬歳!
iPhoneの情報いろいろ。
ブログ学習帳
ブログ、SEO、アフィリエイト情報など(まだまだこれから)
俺流クラフト日記
ハンドメイド作品の記録(現在、放置中)

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【OpenCV2.x】USBカメラ(Webカメラ)の画像取込

メインページOpenCV

OpenCV2.xより前のバージョンでは、画像の取込サイズが指定できない、複数台カメラ時のカメラ選択が思うように行かない、などの情報があり、かなり使いづらかったようなのですが、OpenCV2.0以降からは少しはましになりました。

USBカメラを本気で制御したい場合はやっぱりDirectShowを使った方が良いと思いますが、プログラムのハードルは一気に高くなるので、お手軽にカメラの画像を用いて画像処理をしたいという人にはオススメです。

【評価環境】
OS:Windows Vista
VisualStudio2005 ExpressEdition
使用言語:C++/CLI
OpenCV2.1
(使用カメラ)
●Qcam Fusion(Logicool)
●SP2208WFP(DELLのモニタ付属のカメラ)
●BWC-30L01(BUFFALO)
別途、SKnetのMonsterTVというアナログテレビのキャプチャボードが刺さった状態です。

という事で、最小限のサンプルコードはこのようになります。

int c;
IplImage *frame = 0;

//カメラの初期化(カメラの選択)
CvCapture *capture = cvCaptureFromCAM(0);

//取込サイズの設定
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH,  640);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, 480);

//ウィンドウの表示
cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);

while (1) {
     //フレーム画像の取込
     frame = cvQueryFrame (capture);
               
     //画像の表示
     cvShowImage ("Capture", frame);
               
     //キー入力待ち(Escキーで終了)
     c = cvWaitKey (2);
     if (c == '\x1b')
          break;
}

//後始末
cvReleaseCapture (&capture);
cvDestroyWindow ("Capture");
http://opencv.jp/sample/video_io.htmlより、ほぼ抜粋

cvCaptureFromCAM関数

CvCapture* cvCreateCameraCapture( int index );

index使用するカメラの番号を0(ゼロ)始まりで指定します。

また、途中でカメラを追加した場合、もともと接続されていたカメラの番号が変わってしまう場合もあるので、ご注意下さい。

ただし、私の環境では最初にキャプチャボードが0番に割り振られ、画像を取得する事ができなかったのですが、OpenCVのサンプルプログラムではキャプチャボードからの画像が取得できている。(原因分からず...)
他の番号(0以外)を指定すると、使用するカメラも切り替わってくれました。

cvSetCaptureProperty関数

int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );

capturecvCaptureFromCAM関数の戻り値を指定します。
property_id設定するパラメータの種類を指定します。カメラの場合、指定できるのは以下の2つのみ。
CV_CAP_PROP_FRAME_WIDTH:      取得する画像の幅

CV_CAP_PROP_FRAME_HEIGHTH:  取得する画像の高さ
value設定値

画像の幅、高さの設定値は任意の値を設定できる訳ではありません。

例えばLogicoolのFusionでは以下のような組み合わせしか設定できないと思われます。(全ては確認していません。)

高さ
320240
160120
480360
640480
960720
1280960

幅と高さの比が常に4:3に調整されています。
というよりも、cvSetCaptureProperty関数で幅か高さのどちらか一つを設定すると、もう片方の値は自動的に4:3の比率で設定されるので、幅と高さを両方を指定する必要はありません。

cvQueryFrame関数

IplImage* cvQueryFrame( CvCapture* capture );

capturecvCaptureFromCAM関数の戻り値を指定します。

cvQueryFrameで取得されるIplImageは、おそらくcaptureの値が同じである(cvCaptureFromCAM関数を再度実行していない)のなら、同じIplImageが戻って来ているようです。

また、取得した画像をしょぼいOpenCVのウィンドウで表示している分にはいいのですが、.NETなどを使って表示する場合はfor文やwhile文で回してしまうとウィンドウが固まってしまいます。
そうならないようにするためにも、タイマーなどを使ってcvQueryFrame関数を定期的に呼び出した方が良さそうです。
(コマ落ちしちゃいそうな気もしますが、細かい事は気にしない、気にしない)


と、OpenCVではフレームレートの設定や4:3以外の画像サイズの設定、接続しているカメラデバイス情報の取得など、出来ない事がいくつかあるのですが、何と言ってもお手軽にUSBカメラの画像を取得できてしまいます。
DirectShowは何せ私に取っては難しすぎる...

そして、上記のブログラムをベースに2カメラに対応させて撮影したのが、この画面↓
USBカメラの取込

2カメラでの撮影ができると、ステレオカメラや、なんちゃって防犯カメラのソフトとかも作りたくなってきます。

ちなみに、左がQcam Fusion(Logicool)で撮影した画像、そして右がBWC-30L01(BUFFALO)、何をもって画質が良いというのかは難しいところですが、左のLogicoolの200万画素のカメラよりも右のBUFFALOの30万画素のカメラの方が暗いけど、画質はいいようにも思います。

Logicoolのカメラは暗いところでも自動で明るくしてくれるので、万能ではあるのですが、何も処理をしていないであろうBUFFALOのカメラもそれなりに良いかも?

また、Logicoolのカメラで撮影画素数を1280×960にして撮影してみたところ、ブロックノイズ(画像の圧縮/解凍時に発生するノイズ)が目立ってしまい、あまり使い物になりそうにもありませんでした。(特に画像に左上の部分)

USBカメラの取込

また、OpenCVでUSBカメラから画像データを取得する場合、だいたい5fps程度しか出ていないようです。

やっぱりWebカメラを画像処理に使おうと思うとちょっと厳しそうです。
(画像処理の評価や学習に使うのはありだと思いますが。)

USBカメラを本気で画像処理に使うにはWebカメラではなく、アートレイアルゴのようなそれなりのカメラを使わないとダメかもしれません?
この手のカメラはOpenCVで認識してくれるのかなぁ?
 
Loading...
スポンサーリンク

この記事に対するコメント
Re: タイトルなし

やまかわさん、コメント頂きありがとうございます。

コメントにあるAkiさんがやっている詳細は分からない(評価できる環境がない)のですが、まずはフレームレートの設定をしてみてはいかがでしょうか?

この記事を書いた当時のOpenCVのバージョンでは使えなかったのですが、比較的新しいバージョンではOpenCVからフレームレートが設定できるかもしれません。(未確認です)

例)
cvSetCaptureProperty (capture, CV_CAP_PROP_FPS, 60);

参考:
http://opencv.jp/opencv-2svn/c/reading_and_writing_images_and_video.html#setcaptureproperty

アルゴのカメラに、もし画像撮り込みのサンプルがあれば、カメラの撮り込み部分は、そのサンプルプログラムを使った方が細かい設定ができるかも?しれません。

以上、よろしくお願い致します。

【2016/10/06 00:03】 URL | Akira #- [ 編集]


いつも参考にしています。
上のサンプルを用いた結果、アルゴのカメラでも実施できました。

akiさんの様に、60fpsでカメラ撮影を行いたいのですが、方法が分かりません。
記事に関係ない質問で申し訳ございません。

教えていただけらと思います。
よろしくお願いします。
【2016/10/05 13:46】 URL | やまかわ #- [ 編集]

Re: タイトルなし
情報ありがとうございます。
私もUSB3カメラが欲しくなりました。
ヤバイ
【2014/08/29 12:30】 URL | Akira #- [ 編集]


アルゴのUSB3.0のカメラ2台をOpenCV2.48で認識させてみました。
2台同時の撮像、ドライバの設定「60fps、1280x960、32bitColor」、
この条件で59.97fpsで安定動作できました。

リングバッファに10分ほど連続撮像してみましたが、画像取得時間の
間隔はほとんどぶれがありませんでした。(私の環境で0.05msec以下)
撮像というよりはUSBのデータ転送にかかる時間のブレかもしれませんが。
【2014/08/29 10:00】 URL | Aki #- [ 編集]


平山様、貴重の情報ありがとうございます。
アートレイのカメラの方がWebカメラよりも良いだろうなぁ?と思いつつも、なかなか個人で試せるような代物でもないので、本当、助かります。
【2010/12/24 22:42】 URL | Akira #- [ 編集]


アートレイのARTCAM-130SNで動作しました。
手順は下記の通りです。
(1)アートレイ提供のドライバをインストールし、カメラを認識させる。
(2)本サンプルプログラムを実行する。
とても簡単にキャプチャができました。
サンプルプログラムありがとうございます。
【2010/12/24 12:46】 URL | 平山 #- [ 編集]

コメント頂きありがとうございます。
kouさん。情報頂きありがとうございます。
DirectShowの設定がOpenCVにも影響を受けるということですね。
やっぱりUSBカメラを本気で使いたい場合にはDirectShowでやるべきだとは思うのですが、DirectShowに比べて、はるかに簡単にOpenCVはUSBカメラの画像を取得してくれるので、OpenCVもそれなりに重宝しています。
DirectShowについても少しは調べているのですが、自分のPC内では動くのですが、他のPCでは動かず、どうにも移植性が悪く、放置状態です。
DirectShowを.NETに対応したラッパーライブラリもありますが、今のところ自分で理解をしたく苦戦中です。
いつかまとまったら公開したいと思いますので、乞うご期待!
【2010/08/16 16:51】 URL | Akria #- [ 編集]

訂正
名称を間違えました。訂正します。
「AMCP」誤
「AMCAP」正
【2010/08/15 04:47】 URL | kou #mQop/nM. [ 編集]

ありがとうございます。
設定方法など大変参考になりスムーズに動作チェックを行う事が出来ました。
ありがとうございます。
動作チェック中に気が付いたのですが、CvCaptureは、
DirectShowベースのフリーソフト「AMCP」にて、コントラストなどの画像調整を変更すると、USBカメラを再接続し初期値に戻すまで、影響を受けるようです。
又、OpenCVサンプルプログラム起動中に、「AMCP」を同時起動すると、フレームレート設定も影響します。
使用カメラ:ELECOM UCAM-DSL30HBK
逆に、簡単にカメラの設定を変更できるメリットはりますが、USBカメラの初期値で画像の評価をされている方は要注意ですね。

これからも宜しくお願いいたします。
ありがとうございました。
【2010/08/15 04:38】 URL | kou #- [ 編集]


この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://imagingsolution.blog107.fc2.com/tb.php/208-19143b70
この記事にトラックバックする(FC2ブログユーザー)

I-O DATA USB接続ビデオキャプチャBOX GV-USB |

I-O DATA USB接続ビデオキャプチャBOX GV-USBこれまで録りため... お買い得連絡通信【2010/04/13 17:22】

ロジクール ウェブカム C200 |

ロジクール ウェブカム C200パソコンにつなぐだけですぐに使える30万画素セン... お買い得連絡通信【2010/05/03 17:22】

現在の閲覧者数: / 合計