ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

OPEN CVコミュのopenCVに関する質問全般

  • mixiチェック
  • このエントリーをはてなブックマークに追加
openCVに関する質問はこちら

ダウンロード
各種設定
サンプルコードの使い方
OpenCVの関数の使い方

等

コメント(549)

はじめまして。
質問ですが、OpenCV2.0以降でLBPによる顔検出が実装されていて
「lbpcascade_frontface.xml」というファイルも付属しているのですが、
これをHaar同様に動かしても動作しませんでした。
どなたか動かされた方がおられましたら、ご教授お願いします。
はじめまして!

私はOpenCVを使ってネットワークカメラにアクセスしリアルタイムに画像を表示するプログラムを書いているのですがうまくいっていませんあせあせ(飛び散る汗)
詳細を以下に示します。

/****************************/
私のプログラムではパナソニックのネットワークカメラBL-C131に対してソケットを開設しGET命令を送り画像を取得し、
それを表示しています。画像はJpeg画像です。
表示にはcvShowImage関数を使っています。
OpenCVで処理を行うためには、取得した画像をIplImage型に変換しなくてはいけません。
そのため、私はcvLoadImage関数を使って変換しています。
また、この関数は保存してあるファイルを読み込む関数なので、
取得した画像は一旦ファイルとして書きこんでいます。
このような方法を取っているため、25fpsまでは対応出来るのですが、
30fpsになると画像ファイルの書き込み、読み込みが追いつかなってしまいます。
/****************************/

このように、私のプログラムでは、
ネットワークカメラから画像取得→それをディスクに書き込み→それをcvLoadImage関数で読み込む、
というプロセスをとっているためIOコストが大きくなってます・・・。
理想としては「取得した画像をそのままcvMat型に変換」等をすることでIOコストをゼロにしたいです。

しかし私はJpegや画像処理に関して素人なのでやり方が分かりませんふらふら
かなり困っていますたらーっ(汗)

わかりづらい部分が多々あると思いますが、どうかお力添えください。
宜しくお願い致しますm(_ _)m
cvGetImage() を使えばよいのではないでしょうか…?詳しくはこちらへ↓
http://opencv.willowgarage.com/documentation/c/operations_on_arrays.html#cvGetImage
>Kawaiさん

レスありがとうございますexclamation
cvGetImage()を早速調べてみました手(パー)

しかし引数のCvArrにどういったデータを渡せばよいか分かりませんでした冷や汗
この第1引数にはCvMatやIplImage等が入るようですが、僕の場合はどの様にしたら良いでしょう?

僕のプログラムではfdopenでカメラサーバに繋がってるFILE構造体fpを作って、
fgetc(fp)で画像を読み込んでますふらふら

本当に初心者でスミマセンあせあせ(飛び散る汗)
宜しくお願い致しますm(_ _)m
もう一回質問を読み返したのですが、すみません、私が出した提案は的外れでした。前のは忘れてください…。

どの環境でプログラムしているのかわかりませんが、fmemopen という便利な関数が用意されている環境もあるようです(Linuxとか)。jpeg でしか取得することを考えないのであれば、メモリディスクに保存するようにすれば、(カーネルのオーバーヘッドはあるものの)物理的なディスク I/O は無いも同然になるはずです。

ところで、BL-C131 は mpeg4 を流すことができるようですが、これを使わない理由があるのでしょうか…?
レスありがとうございます!

こちらこそわかりづらい日本語でスミマセンたらーっ(汗)
OSはLinuxのUbuntuを使っていますexclamation

>メモリディスクに保存するようにすれば、
最もですね電球
画像データをRAMディスクに保存するようにしてみます手(パー)
明日大学で実験してみますダッシュ(走り出す様)

>fmemopenという便利な関数
fmemopenを使った場合はどのようにしてIplImageに取り込むのでしょうかexclamation & question

>これを使わない理由があるのでしょうか…?
スミマセン・・・これも自分の質問の仕方が悪かったのですが、
現在とりあえずカメラのモニタリングプログラムを作っているだけで、
今後は任意の画像処理をリアルタイムに行う予定です。
そのため、画像処理の行える静止画を対象としています。
よこやり失礼します。
> OpenCVで処理を行うためには、取得した画像をIplImage型に変換しなくてはいけません。
IplImageは画像のメタ情報を格納するだけの構造体です。
画像データ本体は単なるchar配列です。(8bit画像であれば)
> 私のプログラムではパナソニックのネットワークカメラBL-C131に対してソケットを開設しGET命令を送り画像を取得し、 それを表示しています。画像はJpeg画像です。
→ HTTP GETをつかっているという意味ならば、JPEGをバッファリングして直接char配列に変換してしまうのが速いかと。
ソケット通信サンプルアプリと違い、データが画像なので受信バッファを多めにとる必要がありそうですね。

深読みしすぎかもしれませんが、わざわざcvLoadImage()を使ったということはバッファリング&保存の処理をブラックボックスのまま使っているのでしょうか?
だとしたらJPEGヘッダ解析&char配列へのコピーなど調べるべきことがありそうです。いい勉強にはなると思いますが。

fmemopen()は便利ですが、ストリームR/Wのたびにフラッシュしないとバッファオーバーフローするので、初心者には危険な香りがします。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fmemopen.3.html
>nabe!nabe!さん

コメント有難うございますわーい(嬉しい顔)

>IplImageは画像のメタ情報を格納するだけの構造体です。画像データ本体は単なるchar配列です。
知りませんでした、ありがとうございます!

>cvLoadImage()を使ったということはバッファリング&保存の処理をブラックボックスのまま使っているのでしょうか?

プログラムを簡略化して載せます。
s = socket(AF_INET, SOCK_STREAM, 0);
connect(s, (struct sockaddr *)&server, sizeof(server));
fp = fdopen(s, "rb+");
setvbuf(fp, NULL, _IONBF, 0);

fprintf(fp, "GET %s HTTP/1.0\r\n", path);
fprintf(fp, "Host: %s:%d\r\n", host, port);
fprintf(fp, "Authorization: Basic %s\r\n", pass);
fprintf(fp, "\r\n");

sf=fopen("image.jpg","wb");

int c = 0;
while(fgetc(fp)がjpegデータの間){
c =fgetc(fp);
fputc(c, sf);
}

このような流れで保存しています。
因みにpathは"/nphMotionJpeg?Resolution=320x240&Quality=Standard"です。

cvLoadImage()のソースコードを調べてみたところ、
jpeg_stdio_src()、jpeg_read_header()、jpeg_start_decompress()などの jpeglibが提供している関数を使ってデコードしているので、これを使えばIOコストをゼロに出来ることに気がつきました。

流れとしては以下のようになります。
→サーバに繋がったfpをオープン
→fmemopenでメモリ上にファイルsfをオープン
→fpから画像データをゲットしsfにプット
→jpeg_stdio_src()にsfを渡して画像を読み込み
→jpeglibの関数を使ってデコード
→IplImageを生成し、必要なデータを代入

なんだかあまりスマートではないですねたらーっ(汗)

>だとしたらJPEGヘッダ解析&char配列へのコピーなど調べるべきことがありそうです。
やっぱり勉強しないとだめですかねあせあせ
>鏡乃さん

ありがとうございます!
検索したら出てきました、これで試してみたいと思います。
> Qさん、鏡乃さん
私もその案には賛成です。
JPEGはデコードが必要なことを忘れていました。基本的なことなのに。

> これで試してみたいと思います。
がんばってください!
学部の研究でopenCVを使ってカメラで顔認識や目などを認識しないといけないのですがどうすればいいかわからなくて本当に困っています。 もしよければどなたか教えてもらえませんか?
めぞんがいい-香織- さん

OpenCVのサンプルで同梱されているfacedetect.cppが参考になるでしょう。
あと、書籍では毎日コミュニケーションズから出版されているOpenCVプログラミング第2版の4−12「学習による顔検出」を読んでみるとよいでしょう。
> kinyaさん

ありがとうございます。
それは本ですか?
横槍失礼します。
>それは本ですか?
インストールしたらソースコード配下にsampleがあります。公開されてもいますが。
http://opencv.jp/sample/object_detection.html
めぞんがいい-香織- さん

facedetect.cppはnabe!nabe!書いてくださったとおりOpenCVをインストールすると一緒にインストールされます。windowsの場合、デフォルトではC:\OpenCV2.1\samples\cに有ります。
「OpenCVプログラミング第2版」は書籍で紀伊国屋書店などの大型書店へ行けば在庫が有ると思います。
アマゾンでは
http://www.amazon.co.jp/OpenCV-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88-1-1%E5%AF%BE%E5%BF%9C/dp/4839931593/ref=sr_1_1?ie=UTF8&s=books&qid=1281713158&sr=8-1
で購入できます。
はじめまして。
UVC対応のカメラを用いて画像を取得しようとしてもOpenCVが認識してくれず、DirectShowを経由したやり方もわからず途方にくれています。
だれかOpenCVで上手く画像を取得する方法を教えて下さい。お願いします。
認識してくれないとはどういう状況?
サンプルプログラムも動かない感じですか?

とりあえず実行環境とエラーの内容を教えてもらわないとどういう状況下判断できない。
OS、スペック、カメラ機種、OpenCVのバージョンなんか載せてくれるとアドバイスしやすいかもしれないです。
> チュン様@オルコッ党さん
遅れてすいません。
使用してるバージョンはOpenCV2.2で実行環境は、VC2010にインクルードファイルとライブラリファイルを設定し、PATHを通してデバッグするとカメラのウィンドウが出るとこまでは上手くいきました。ただ、ウィンドウにはなにも写らず黒いだけです。
また、2回目からはカメラ画像にNULLの値が返ってきて認識されてないことになります。
ちなみに使用してるカメラはノートPCに始めから付いていたcomunication cameraというやつです。
OpenCVに付属のサンプルプログラムは動きますか?
あと、どの関数からNULLが返ってくるんですか?

一応確認ですけど、無限ループで毎回フレームの取得はおこなっていますよね?

できれば該当部分のソースが見たいです。
横槍失礼します。
ソースコードがないと何とも言えないというチュン様@オルコッ党さんの意見には同意です。

ただ、画面が黒いというのが気になりました。
私の手元にあるWin7+OpenCV2.1などではNULLが格納されたIplImageをcvShowImage()に渡すと画面が灰色になります。
コウタさんもWindowsのようですのでが、ウィンドウが黒く描画されるということは黒い画像データが格納されているということはないでしょうか?
>2回目からはカメラ画像にNULLの値が返ってきて認識されてないことになります。
ということですが、どのように判断したのか具体的にお聞きしたいです。
>nabe!nabe!さん
そうなんですよね、だからカメラが起動しきっていないときに取得した黒い画面そのままが表示されてその後更新してないかなと疑ったわけで・・・
ちょっと今OpenCV環境がないので自分で試すことができませんが。
>nabe!nabe!さん
遅れましたがソースコードを以下に書きます。
#include <stdio.h>
#include <qedit.h>

//--------------------------------------------------------------------------
#pragma warning(disable : 4819) // disables warning messages
#include <opencv2/imgproc/imgproc.hpp> // OpenCVヘッダ
#include <highgui.h> // OpenCVヘッダ


int main(void)
{
char* szWndName="カメラ映像";
CvCapture* capture; // ビデオキャプチャ宣言
IplImage* img;

capture=cvCaptureFromCAM(0); // 映像取得(カメラ映像)
if(capture==NULL)
{ // カメラ映像が取得できない場合
fprintf(stderr, "カメラが見つかりません.\n");
return -1;
}

cvNamedWindow(szWndName);

while(1)
{
img=cvQueryFrame(capture); // 1フレーム取得
cvShowImage(szWndName, img); // 1フレーム表示

if(cvWaitKey(1)>=0) // 何かキーを押したら終了
break;
}
cvDestroyWindow(szWndName); // 表示ウィンドウの破棄
cvReleaseCapture(&capture); // ビデオキャプチャの解放

return 0;
}

また、NULLが帰ってきたというのは上のソースコードを見てもらえばわかると思います。
言い忘れましたが、qedit.hはダイレクトショウを経由させようとした名残なので気にしないで下さい。
返信おそくなりました。
一見よさそうなソースコードですね.. 
VC++2008にmain()の中を貼りつけて実行してみましたが、ふつうに動きました。

> また、NULLが帰ってきたというのは上のソースコードを見てもらえばわかると思います。
→ すいません。ちょっとよく分からないのですが、VC++のウォッチとかで変数imgのアドレスを確認したという意味でしょうか..?
img=cvQueryFrame(capture);の後にif(img == NULL)とかで判定していないと
変数imgがNULLかどうかは分からないと思うんですが。

IplImageの中身によって追跡の方向が変わるので、ブレイクを張ってアドレスNoやメンバ変数までチェックするべきです。
> nabe!nabe!さん
説明下手ですいません。
> また、NULLが帰ってきたというのは上のソースコードを見てもらえばわかると思います。
これはprintfで゛カメラが見当たらない゛と表示された時NULLの値が返ってきたということです
こんにちは、私も返事が遅くなり申し訳ありません。
ソースに問題がないようなので他の原因かな…
UVC対応とのことなので考えられるのは、同時にほかのアプリで使用しているとか?

まぁ、初回は起動したけど画像は取得できなかったみたいだし良くわからんな。
PC再起動して、他に何もプログラムが走ってない状態で起動しても動きませんか?
他のプログラムからはカメラを認識しますか?

問題としてあげられるのはこのくらいかなぁ
cvCaptureFromCAM()の引数は-1で任意。0と同意になるので変わる気がしませんが..

サンプルのlkdemo.exeとかでも同じ現象ならば、ソースコードの問題ではないと切り分けることができます。
もし、ソースコードが問題ないとなれば、ハードの問題になります。

> ちなみに使用してるカメラはノートPCに始めから付いていたcomunication cameraというやつです。
→VAIOですか? Skype等の他のWinアプリからでもアクセスできないなら初期不良の可能性が高いです。

チュン様@オルコッ党さんの言うとおり、PC(USBコントローラ)とカメラの相性は気になります。
私の偏った経験だと、Lenovo(IBM)やSONYは相性悪いことが多々あります。

他のUSBカメラでも同じ現象かどうか、USBに他のデバイスが繋がってないか、起動時にUSBデバイスを複数つないでないか..等々、手当たり次第に試すことになります。。
visual studio c++ 2010にてopencvの出力画像を別の場所に保存し、コマンドプロンプトで、gcc ○○ としていじりたいです。
出力画像の保存場所を指定するプログラムを教えていただきたいです。
マルチで質問しているからどこに答えていいのかわからない…
とりあえずこっちに

gccで画像を弄りたいって意味がよくわからない…
保存場所指定するなら相対パスなり絶対パスなりで指定すればいいんでないの?
OpenCVの質問ってわけじゃない気もするがw
はじめまして.
OpenCVの物体検出サンプルに入っている,cvHaarDetectObjectsで使われているxmlファイルは,どのような学習画像を使っているのかや,どのくらいの生成時間がかかっているのかを知りたいのですが,誰か情報提供をしてくださる方はいませんでしょうか.よろしくお願いします.

ログインすると、残り517件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

OPEN CV 更新情報

OPEN CVのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。