1

ウェブカメラ(Creative Live!Cam Chat)を使用してC / C ++で画像を取得し、特定のフォルダー(Ubuntuを実行)に保存しようとしています。理想的には、それが最もエレガントなソリューションではないにもかかわらず、可能な限りシンプルなものを探しています。

これまでのところ、理解するのが非常に混乱しているv4l2grabを見つけました。また、クリエイティブWebカメラ(5Kbのサイズの黒い画像を返します)では機能しないようですが、インストールされているWebカメラでは機能するようです。私のラップトップの一部。

これを行うために使用できる単純なCライブラリまたはコードはありますか?

4

4 に答える 4

2

この目的に適したライブラリを知りません(コメントを追加して、ある場合は教えてください:-))。注: 用途によっては、たとえば。OpenCVは問題ありません。それで十分な場合は、必ず使用してください。しかし、もっと知りたい場合は、読み進めてください。

したがって、それを使用するには独自のコードを作成する必要があります。特に難しいことではありません。関連する質問が 1 つあります: Video4Linux2 (オンスクリーン ディスプレイ) 出力 API の使用方法/学習方法は?

学習を容易にするためのいくつかのポイント:

  • IOCTL を呼び出した後は、常にリターン ステータスをチェックし、可能性のあるエラー メッセージを出力します。あなたは仕事をしている間にこれらをたくさん手に入れることになるので、それについて体系的に考えてください. 以下に示すような関数を提案し、check_errorioctl 呼び出しの直後に常に呼び出します。

  • IMO必須:実際のヘッダーファイルにシンボルをたどることができるIDE /エディターを使用します(たとえば、Qt Creatorでは、名前にもかかわらず純粋なCアプリケーションIDEであり、シンボルでF2を押すと、システムヘッダーにも移動します定義されている場所を表示します)。これを V4L2 関連のシンボルと定義で自由に使用し、ヘッダー ファイルのコメントを読んでください。これは多くの場合、最良のドキュメントです。

  • query ioctl および write 関数を使用して、nice 形式で返される値をダンプします。たとえば、 function を持ちvoid dump_cap(const struct v4l2_capability &cap) {...}、コードで使用するすべての構造体に同様の関数を追加します。

  • IOCTL に渡す構造体内の値の設定を怠らないでください。memset(&ioctl_struct_var, 0, sizeof(ioctl_struct_var));構造体を宣言した後、およびそれらを再利用する場合は、構造体を常に 0 に初期化します (V4L2 では非常に一般的な、一部の設定で「get-modify-set」操作を行う場合を除く)。

  • 可能であれば、2 つ (またはそれ以上) の異なる Web カメラ (異なる解像度、異なるブランド) を用意し、両方 (すべて) でテストします。これは、ビデオ デバイスをコマンド ライン パラメーターとして使用する場合に最も簡単な方法です。そのため、カメラごとに異なる引数を指定してプログラムを呼び出すことができます。

  • 小さなステップ。多くの場合、ioctl は期待どおりの結果を返さない可能性があるため、返されたデータを使用するコードを記述しても、クエリがカメラに対して何を返すかを実際に確認する必要はありません。

上記のcheck_error機能:

void check_error(int return_value_of_ioctl, const char *msg) {
    if (return_value_of_ioctl != -1) return; /* all ok */
    int eno = errno; /* just to avoid accidental clobbering of errno */
    fprintf(stderr, "error (%d) with %s: %s\n", eno, msg, strerror(eno));
    exit(1); /* optional, depending on how you want to work with your code */
}

すべての ioctl の直後に呼び出します。次に例を示します。

struct v4l2_capability cap;
setmem(&cap, 0, sizeof(cap));
int r=ioctl(fd, VIDIOC_QUERYCAP, &cap); 
check_error(r, "VIDIOC_QUERYCAP");
dump_querycap(&cap);
于 2013-03-18T07:59:56.707 に答える
1

OpenCVを見たことがありますか?あらゆる種類の画像の取得と処理に非常に便利です。写真を撮るプロセスは十分に文書化されていますが、実際に使用することに決めた場合は、このようなものを見ることをお勧めします.

于 2013-03-18T06:03:40.340 に答える
1

uvccaptureソースコードを見てみましょう。非常にシンプルですが、V4L2 インターフェイスのみを使用する標準 C です。OpenCVも機能しますが、セットアップとコンパイルがより複雑になります。

于 2013-03-18T06:09:09.897 に答える