OpenCV 2.1 on VC++ 2010 Express で映像を読み込めないわけと対応策の例

読み込めないわけ

さて,映像ファイルを読み込めない - BiBoLoG で映像を読み込めないことを挙げた.VC++ 2010 のメジャーバージョン番号は10であるにも関わらす,9のライブラリを読み込もうとするコードが問題だった.ソースを msvcr90 で検索すれば ffopencv.cpp に行き当たる.

  • 「_MSC_VER >= 1500」のとき「#pragma comment(lib, "libmsvcr90d_.a")」している
  • libmsvcr100d_.a という文字列は影も形もない

こういうわけで,Visual Studio 2010 では無理なんだ.

読み込める版は,リビジョンは?

この問題が対処されたのはリビジョン3029.Diff of /trunk/opencv/interfaces/ffopencv/ffopencv.cpp を確認しよう.ごっそり削られて「extern "C" { __declspec(dllexport) unsigned int __lc_codepage = 0; }」が追加されている.SVN コメントには

fix the problem with various versions of MSVCRT* in opencv_ffmpeg (ticket #286)

とあって,これが今回探していた「問題が対処されたリビジョン」の変更境界だと分かる.

確認

リビジョン選択

タートスSVNでリビジョングラフを見て,r3110 を選んだ.表示されるリビジョン番号の表示がどういう基準かは知らない.OpenCV 2.1 が r2995 相当らしいから,これより後で,かつ,r3029 以降を探すと r3110 だった.

docs\html\html\html\html\html\html\html\html\html\html\html\html\html\html\... と延々掘る OpenCV ビルドに注意

CMake を操作するとき,BUILD_DOXYGEN_DOCS のチェックを外して対応する.外さないままどうなるかは,各自が試して確認すればよいと思うから,記述を省略する.PC が壊れるわけじゃないし.

ファイル構成の違いに注意

OpenCV 2.2 へ向けて,ファイル構成が一変している.Momma's Wiki OpenCV/SVN版/従来のヘッダの廃止 - include/opencv/cv.h等の従来使われてきたヘッダの廃止 モ... にまとめられている.OpenCV ビルド後,どのライブラリをリンクするか,よく考える.

OpenCVr3110debug.props を作った.

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets" />
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup />
  <ItemDefinitionGroup>
    <ClCompile>
      <AdditionalIncludeDirectories>C:\Software\Develop\opencvlibrary\OpenCV2.1\include</AdditionalIncludeDirectories>
    </ClCompile>
    <Link>
      <AdditionalLibraryDirectories>C:\Software\Develop\opencvlibrary\OpenCV2.1\lib</AdditionalLibraryDirectories>
      <AdditionalDependencies>cxcore210d.lib;highgui210d.lib;cv210d.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup />
</Project>
結果

うまくいった.対策としては「r3110 以降の SVN ソースを入手してビルドしろよ」.