1. ホーム
  2. c++

[解決済み] OpenCVをPythonとC++でコーディングした場合、性能に違いはあるのか?

2023-03-24 10:25:33

質問

少しずつopencvを始めようと思っているのですが、まずOpenCVのどのAPIが便利かを判断する必要があります。Pythonの実装はC++のネイティブな実装に比べれば短いですが、実行時間はより密で遅くなると予想しています。これらの2つの視点の間のパフォーマンスとコーディングの違いについてコメントできる知人はいますか?

どのように解決するのですか?

Pythonはシンプルで移植性が高く、さらに創造性に富んでいるため、ユーザーはプログラミングに悩まされることなく、アルゴリズムだけを気にすればよいのです。

しかし,ここOpenCVでは違うことがあります.Python-OpenCV は,オリジナルの C/C++ コードのラッパーに過ぎません.これは通常,両言語の優れた特徴を組み合わせるために利用されます. C/C++のパフォーマンスとPythonのシンプルさ。 .

つまり、PythonからOpenCVの関数を呼び出した場合、実際に実行されるのはC/C++のソースになります。そのため、パフォーマンスにはあまり差がありません。OpenCVのいくつかの基本的な関数で概算してみると 最悪の場合 のペナルティがあります。 <4% . penalty = [maximum time taken in Python - minimum time taken in C++]/minimum time taken in C++ ).

例えば,OpenCVで利用できない独自の関数を作成している場合,事態はさらに悪化します.そのようなコードはPythonでネイティブに実行され、パフォーマンスを大幅に低下させます。

しかし、新しいOpenCV-Pythonインターフェースは、Numpyを完全にサポートしています。NumpyはPythonで科学計算を行うためのパッケージです。また、ネイティブCコードのラッパーでもあります。Numpy は高度に最適化されたライブラリで,様々な行列演算をサポートし,画像処理に非常に適しています.そのため,OpenCVの関数とNumpyの関数の両方を正しく組み合わせることができれば,非常に高速なコードを得ることができます.

覚えておくべきことは、Pythonでは常にループと反復を避けるようにすることです。その代わりに、Numpy(とOpenCV)で利用可能な配列操作の機能を使用します。単純に2つのnumpyの配列に C = A+B を使用して2つのnumpy配列を追加するだけで、2重ループを使用するよりも何倍も高速です。

例えば、以下のような記事を確認することができます。

  1. Pythonによる高速な配列操作
  2. OpenCVとPythonのインタフェースであるcvとcv2の性能比較