0

何のことですか?

OpenCVを使用してビデオの画像処理とコンピューター ビジョンを処理する C++ アプリケーションがあります。これをゼロから書き直して、使用するテクノロジを決定するための助けが必要です。具体的には、使用するテクノロジーの選択方法についてサポートが必要です。

アプリについて

アプリの機能は、構成 XML ファイルで定義された順序で呼び出されるモジュールに分割され、実行時に変更することもできますが、リアルタイムでは変更できません (つまり、アプリケーションを閉じる必要はありませんが、処理は最初から開始されます)。 . これらのモジュールは、中央のデータプールでデータを共有します。

なぜゼロから始めるのですか?

このアプリケーションは、現在目指しているほど動的になるように計画されていなかったため、バグのあるパッチ、マクロ、および回避策のコレクションに成長しました。現在、メモリ リーク、不要な QT の依存関係、QT と OpenCV のイメージ フォーマット間の変換の遅さ、コンパイルとテストの時間の大幅な増加などでいっぱいです。


言語の選択

プロジェクトを最初に開始した人が C++ しか知らなかったという理由だけで、元のコードは C++ を使用していました。できるだけ高速にする必要があるため、これは適切な選択かもしれませんが、アプリケーションの動的な性質を考慮すると、より良い選択があるかもしれません。

OpenCV でサポートされている言語によって制限されています (主に C++、Java、Python。Ruby、Ch、C#、および任意の JVM 言語もサポートされていることを読んだことがあります)。

必要なもの

  • Speed : リアルタイムトラッキングを目指しています。これにより、Python と Ruby が除外される可能性があります。
  • 名前によるクラスのインスタンス化: C++ マクロとクラス登録システムは機能しますが、独自のランタイムを持つ動的に設計された言語が適しています。おそらくObjective-C++、またはJavaです。

何が理想だろう

  • モジュール/プラグイン/拡張機能/コンポーネント フレームワーク: 車輪を再発明する必要はありません。これに優れたフレームワークを使用すると、アプリの特別な点に集中できます。ここには多くのオプションがあります。Objective-C には NSBundles があります。C++ には Boost.Extension、Pluma、DynObj、FxEngine などのライブラリがあります。C には C-Pluff があります。選択肢が多すぎるとさえ言えます。
  • ランタイム クラスのロードとリロード: 開発の観点からは、1 つのモジュールのみをコンパイルしてリロードできると興味深いでしょう。これは、Objective-C のコード インジェクションと Java のリフレクションを使用して行われるのを見てきました。

私は何が欠けていますか?

興味深いオプションが多すぎます!

モジュラー アプリ開発におけるあなたの経験に基づいて、この制約がある場合、どのような種類の言語/フレームワーク機能を探すべきですか?

検索を絞り込むために、このプロジェクトについて自分自身にどのような質問をする必要がありますか?


編集

OpenCV が C++ のみの GPU バインディングを持っていることに気付いていなかったので、それで立ち往生しています。

言語が固定されたので、検索はかなり絞り込まれました。Objective-C++ を使用して、必要なダイナミズム (Obj-C ランタイム + Cocoa/GnuStep/Cocotron の NSBundle) を得ることができましたが、これは複雑に聞こえます。またはフレームワークを使用した C++。

したがって、質問を次のように絞り込みます。

  • Objective-C++ でクロスプラットフォームの方法で NSBundle を使用するのは、思ったより簡単ですか?
  • ホットスワップ可能なモジュールを提供してくれる C++ フレームワークはどれですか?
  • 実行時にモジュールを交換する主な理由は、コードを迅速に変更できるようにすることです。Runtime-Compiled C++の方が優れたソリューションでしょうか?

メタ: このような質問をする方法について調査しました。それが受け入れられることを願っています。

4

2 に答える 2

1

移植性を求めていて、破棄するメモリが大きい場合は、Java を使用できます。C++ と Java の間のパフォーマンス ヒットはそれほど悪くありません。Mat と他の画像形式との間の変換については、まだわかりませんが、それを実行するにはディープ コピーが必要なので、コードが openCV ネイティブ形式で画像を表示できる場合は、アプリケーションを固定できます。

プロ :

  • メモリリークの心配がなくなります
  • プロジェクトは、C/C++ に比べてはるかに移植性があります (サイズが一貫していないプリミティブ データ型の使用を避けることができ、たとえば C で常に int*_t を使用する場合、これは間違っている可能性があります)。

短所:

  • C/C++ より遅い
  • より多くのメモリと CPU クロックが必要

http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html

于 2013-10-20T11:38:49.810 に答える