我が家の森林限界

情報工学学生ではありますが、記事内容はそうとは限りません。気になったものについて不可思議な文章を書き連ねます。

備忘録 OpenCV:cvCaptureFromCamのエラー

さて、今回は情報学生らしく備忘録として遭遇したプログラミングのエラー関して軽くまとめたいと思います。

まだまだ若輩者ですので、参考になさろうという奇特な方がいらっしゃいましたら、参考程度ということでお願いします。

もし解釈違いがあるよという指摘がありましたら、コメントで教えていただければ幸いです。

 

今回のエラー:LNK2019

さて、

 研究室での研究の関係でお世話になっているOpenCVですが、何かにつけて問題にぶち当たり大量のエラーを吐くので、オープンソースのライブラリであるからして致し方無いこととは分かっていつつも正直苦手意識があるんですよねぇ…

今回、私はVisualStudio2013のC++ソリューション上でOpenCV3.0.0を使ってWebカメラMicrisoft社製LifeCamStudioからMatを引っ張ってきたかったので、cv::VideoCapture(0)を_tmain内で立ち上げた所…

f:id:hardAstarboard:20161212204445p:plain

「error LNK2019:未解決の外部シンボル~が~で参照されました。」系のエラーが列挙される結果となってしまいました。

いやぁ、大変困りましたねぇー。涙が出ちゃいますねぇ…

MicrosoftさんによればLNK2019はリンカツールエラーであり、ファイルの場所は「opencv_videoio300.lib」…OpenCVのライブラリの中で問題が起きているのでしょうか?

「外部シンボルとは、別のオブジェクトまたはライブラリ ファイルで定義されているもの (外部関数やグローバル変数など) を参照するために使用する、ソース コードで宣言された名前のことです。」

リンカーは、オブジェクト ファイルをアプリケーションまたは DLL にリンクする際に、各オブジェクト ファイルにあるすべての外部シンボル参照を解決する処理を行います。」

リンカーは、リンクするどのファイルからも外部シンボルに対応する定義を見つけられない場合に、LNK2019 を生成します。 このエラーは、そのシンボルの定義が存在するソース コードまたはライブラリ ファイルがビルドに含まれていない場合に発生することがあります。 」

リンカ ツール エラー LNK2019

うーん、ライブラリの内部で行われる関数のためのライブラリの類を登録し忘れている…?

「追加の依存ファイル」には手作業で大量のライブラリを目を血走らせながら登録していったってのに、まだ足りないと仰せになるのですか…

f:id:hardAstarboard:20161212204513p:plain

 

天の助けとvfw32.lib

色んなサイトを見て回ったり、C:¥opencv300で目に付くライブラリとそのディレクトリを片っ端から登録するも21件のエラーは一向に減らぬまま幾星霜(数時間)…

海外のサイト「stackoverflow.com」(jp.stackoverflow.comではない)にこの様な項目を見つけました。

stackoverflow.com

どうやら私と同じくライブラリ(こちらの方はopencv_highgui243.lib)でLNK2019のエラーが出たご様子。

それに対して、この様な回答が。

「You need to link with MS vfw32.lib library. (answered by Andrey Kamaev)」

vfw32.lib?何だろうか、それは。

調べてみると、この様なサイトに行き着く。

http://laputa.cs.shinshu-u.ac.jp/~gtakano/prog1.html

ビデオキャプチャー」…!

これは当たりを引いた様だぞ!

このサイトさんによると、ライブラリvfw32.libはVideo for Winの使用に必要との事。

Video for Winとは、キャプチャ関連のAPIのことを指すらしい。

http://kot9a.sakura.ne.jp/Alice9/extra/vcpp/vcpp_01.htm

さらに言えば、エラーの中の「ICSendMessage」とは、vfw.hで宣言されている「コンプレッサ(圧縮処理)にメッセージを送信」する関数のことで、インポートライブラリはvfw32.lib。

https://msdn.microsoft.com/ja-jp/library/cc410463.aspx

OpenCVもこれを使っているというわけなのか…

というかエラー欄から調べた方が早かったか。まだまだこういう対処の仕方が未熟だなぁ。

 

というわけで、取りあえず「追加の依存ファイル」に「vfw32.lib」を追加登録してみるとf:id:hardAstarboard:20161212204906p:plain

動いた!

いやぁ、Webカメラから画像引っ張ってくるだけなのに異様に長かった...

 

 解決

というわけで、何とか問題解決です。

opencv_videoio300」が「vfw」を使用するはずが、参照できない状態であったことが原因でしょうか。

今回のことを鑑みても、これから先、OpenCVとのがっぷり四つの取っ組み合いは続きそうですね…