1

次のコードを使用して、Windows 7 上の Visual Studio 2008 の C++ コードに opencv ライブラリ ファイルを自動的に含めています。

#ifndef NDEBUG
#pragma comment(lib, "opencv_core231d.lib")
#pragma comment(lib, "opencv_highgui231d.lib")
#pragma comment(lib, "opencv_imgproc231d.lib")
#else
#pragma comment(lib, "opencv_core231.lib")
#pragma comment(lib, "opencv_highgui231.lib")
#pragma comment(lib, "opencv_imgproc231.lib")
#endif 

しかし、.lib ファイルのファイル名にバージョン (この場合は 2.31) が含まれているため、システムに別のバージョンの opencv ライブラリがインストールされていると問題が発生します。利用可能なopencvライブラリのバージョンを自動的またはほぼ自動的に検出し、適切なバージョン文字列をプラグマにスライドさせる良い方法はありますか?

4

2 に答える 2

2

OpenCV の異なるバージョン間では小さな変更があります。それほど多くはありませんが、2.0 から 2.2 または 2.2 から 2.3.1 に変更するとアプリがクラッシュするほどです。また、ベータ 2.4 リリースには、以前のものから十分な変更が加えられています。

そのため、OpenCV バージョンでアプリをテストし、それらの dll のみでアプリを配信することをお勧めします。

小さな例:

Mat a(3,3,CV_8UC3);

a.setTo( Scalar(10) ); // in 2.3.1 will set all channels to 10,
// in 2.2 will only set first channel. 

対応する 2.2 呼び出しは次のようになります。

a.setTo(Scalar::all(10));

または

a = 0; // runs fine on 2.3.1. Equivalent to setTo().
// Does not compile on earlier versions

もう 1 つの例はcv::drawPoly()、2.2 と 2.3.1 で異なる署名を持つ です。

これらの変更が十分に文書化されていないという事実を考えると、誤ってそのうちの 1 つを見逃す可能性が非常に高くなります。

于 2012-04-06T05:39:51.507 に答える
2

次の記事をマージして、さまざまなバージョンの OPENCV でコードを実行するための解決策を考え出しました。

  1. マクロから文字列を作成する方法
  2. マクロでの文字列の連結
  3. MSDN の VS2008をサポートする #defines のプラグマ ステートメント
  4. おまけ:ソリューションでグローバル設定を定義する方法

前述のように、互換性のないバージョン間でポップした場合、これは深刻な問題を引き起こす可能性がありますが、サポートされているバージョンと機能については、これが役立つ場合があります. この手法を使用して、opencv のバージョンを一度設定すると、コードが目的のバージョンに自動的にリンクされます。

  1. ソースコードの 1 か所で OPENCV_VERSION を定義する

  2. プロパティ シートで定義する
  3. システム環境変数で定義します。

私のコードは次のようになりました:

#include <iostream>

// #define OPENCV_VERSION $(OPENCV_VERSION)
// #define OPENCV_VERSION 220

#define QUOTE(name) #name
#define STR(macro) QUOTE(macro) 

#define LINK_TO_OPENCV(libname) __pragma(comment(lib, "opencv_" #libname STR(OPENCV_VERSION)))
#define LINK_TO_OPENCV_DEBUG(libname) __pragma(comment(lib, "opencv_" #libname STR(OPENCV_VERSION) "d"))

#ifndef NDEBUG
LINK_TO_OPENCV_DEBUG("core")
LINK_TO_OPENCV_DEBUG("highgui")
LINK_TO_OPENCV_DEBUG("imgproc")
#else
LINK_TO_OPENCV("core")
LINK_TO_OPENCV("highgui")
LINK_TO_OPENCV("imgproc")
#endif 


int main()
{
    std::cout << STR(LINK_TO_OPENCV("core")) << "\n";
    return 0;
}

次に、OPENCV_VERSION を好きな場所に設定します。たとえば、次の行を持つすべてのユーザーが単一のヘッダー ファイルを含めることができます。

#define OPENCV_VERSION 220

または、Project->Properties->C/C++->Preprocessor に移動して、Preprocessor Definitions を OPENCV_VERSION=220 に設定することもできます。または、ソリューション全体の共有プロパティ シートで同じことを行うこともできます。

または、これは重要です。この手法を使用して、Windows 自体で OPENCV_VERSION_ENV というグローバル環境変数を定義し、その値をバージョン コード (たとえば 220) に設定できます。次に、プリプロセッサ定義を設定してOPENCV_VERSION=$(OPENCV_VERSION_ENV)、環境変数をリンク コマンドに取り込みます。できません#define OPEN_VERSION $(OPENCV_VERSION_ENV)が、プロパティ ページは $(macro) を自動的に変換するため、そこで環境変数を取得できます。

于 2013-02-20T07:07:09.237 に答える