OpenCVはC++の非常に成熟したパッケージですが、Matlabは今日でもコンピュータービジョンおよび画像処理コミュニティで非常に人気があることに気づきました。 Matlabを使用したことはありませんが、Matlabを見ると、C++のOpenCVに勝る利点はありません。よく使われているので、拾うことを考えています。
なぜこの群衆の間でそれほど人気があるのですか? OpenCVに対するその利点は何ですか?
私はコンピュータービジョンの博士課程の学生です。この質問の科学者にとって、matlabとpython)の比較についてはすでに回答しています: MATLABは何に適していますか?なぜですか?大学で使用されていますか?Pythonよりも優れているのはいつですか?
コンピュータービジョンのmatlabとopencvを比較するための回答を更新します。
以前はC++/OpenCVでのみコーディングしていましたが、博士号を取得してから(3年後)、Matlabでのみコーディングしています。だから私はそのトピックをよく知っています。
Opencvと比較して、matlabが非常に優れており、広く使用されている理由は1つあります。
個人的には、MATLABではOpenCV/C++よりも約10倍速くコーディングしており、最後のバグははるかに少なくなっています。
研究環境では、(願わくば)しばしば新しいアイデアがあり、それらを非常に迅速にテストして、その方向に進む価値があるかどうかを確認したいと思います。そして、ほとんどの場合、私たちがコーディングしたもののごく一部だけが役に立ちます。さらに、アイデアがうまくいくかどうかを事前に推測することはしばしば不可能です。
Matlabは実行時に少し遅くなることが多く、opencvは実行時間としては間違いなく最速ですが、あまり気にしません。どの方法が成功するかを事前に知らないので、多くのことを試さなければなりません。したがって、ボトルネックはプログラミング時間です。ほとんどの場合、コードは結果を公開するために数回実行され、それだけです。
それでは、matlabがプログラミング時間の改善にどのように役立つかを見てみましょう。
Matlabには本当に必要な関数がたくさんあるので、常にそれらを作り直す必要はありません。
行列のインデックスを2D座標に変更します。_ind2sub
_画像のすべてのパッチを抽出します:_im2col
_;画像のヒストグラムを計算します:hist(Im(:))
;リスト内の一意の要素を見つけるunique(list)
;行列のすべてのベクトルにベクトルを追加しますbsxfun(@plus,M,V)
; n次元配列の畳み込みconvn(A)
;コードのサブ部分の計算時間を計算します。_tic; %%code; toc
_;画像をトリミングするためのグラフィカルインターフェイス:imcrop(im)
;
リストは非常に長くなる可能性があります...そして、ヘルプを使用して見つけるのは非常に簡単です。
ただし、純粋なコンピュータービジョン機能を考慮すると、コアOpencvは、matlabとツールボックスよりも少し網羅的だと思います。しかし、今日では、非常に多くの研究者がソースコードをmatlabで公開しているため、最新の発見をテストする場合は、基本的にmatlabを使用する必要があります。
メモリを割り当てて解放する必要はありません。 Matlabがそれを行うので、作業に集中できます。
バッファオーバーフローはありません。だから、どこでクラッシュするのかを見つけるのに長い時間はかかりません。 Matlabは自動的に停止し、コードが行列の範囲外の値を取得しようとする場所を通知します。
コンパイル時間なし...
書き込むヘッダーがありません...
例:スクリプトを起動します。行列が原因でエラーが発生します。 コマンドラインでコードを実行できます。次のように視覚化します:imagesc(matrix)
。行列の最後の行がおかしいことがわかります。バグを修正します。 すべての変数はまだ設定されています。残りのコードを選択し、F9キーを押して選択を実行すると、すべてが続行されます。 そのおかげでデバッグが速くなります。
Matlabは、実行前に私のエラーのいくつかに下線を引きます。だから私はすぐに問題を見ることができます。それは私のコードをより速くするいくつかの方法を提案します。
OpenCV/C++/Visual Studioを使用すると、デバッグできます。しかし、このデバッガーではデバッグ中にコードを実行できませんので、たとえば行列などを視覚化することはできません。したがって、実際には、いくつかのコードをコピーアンドペーストして行列をダンプし、エラーがどこにあるかを確認します。これはとても痛いです。
IDEには素晴らしいプロファイラーが含まれています。 KCahcegrind for C++は、それに比べて使用するのが非常に面倒です。
私はそこにもっと書いた: 。mファイル用の代替エディターはありますか?
Matlabコードはよりサイズが小さく、デバッグ、読み取り、理解が容易であり、コードは私の数式のように見えます。
行列のすべての列を正規化するには(常に必要です)、次のようにします。bsxfun(@times,A,1./sqrt(sum(A.^2)))
行列から小額のすべての列を削除するには:
A(:,sum(A)<e)=[]
GPUで計算を行うには:
_gpuX = gpuarray(X);
%%% code normally and everything is done on GPU
_
私のコードを麻痺させるには:
_parfor n=1:100
%%% code normally and everything is multi-threaded
_
どの言語がそれを打ち負かすことができますか?
そしてもちろん、ループを作成する必要はめったにありません。すべてが関数に含まれているため、コードが読みやすくなり、インデックスに悩まされることもありません。ですから、プログラムの仕方ではなく、プログラムしたいことに集中することができます。
Matlabは、そのプロットツールで有名です。彼らは非常に役に立ちます。 OpenCVには、基本的なプロット機能だけがあります。
doc
と入力すると、簡単にアクセスできます。
PS:そして私がmatlabで嫌うもの:その価格
OpenCVのC++ APIはかなり新しいものです。また、発売時には多くのバグがありましたが、今ではもっとアイロンがけされています。それ以前は、C APIでは、OpenCVでコードを書くのは非常に面倒でした。例えば。マトリックスセルに簡単にアクセスできず、IplImageと他のマトリックスが区別され、マトリックス式がありませんでした。
これが、コンピュータービジョンのほとんどの人が「急速な開発のためのMatlab」のアイデアを今でも固守している主な理由だと思います。最近のほとんどのcvタスクでは、MatlabよりもC++とOpenCVの方がはるかに長い時間/負担やコード行が必要ないことは事実です。
ただし、Matlabを使用する理由はそれだけではありません。
研究コミュニティ全体が、無料で優れた代替手段が利用できる独自の環境に固執しているのは残念だと感じていることを付け加えたいと思います。
Matlabはコンピュータービジョンの研究者に適しており、研究者の時間を大幅に節約する膨大なアルゴリズムを備えています。新しいアルゴリズムを実装すると、MatlabがOpenCVよりも時間を節約できることもわかります。しかし、パフォーマンスが重要な関心事である場合、Matlabは良くありません。
OpenCVの利点は、高度にカスタマイズ可能であり、ネイティブC/C++のおかげでパフォーマンスが優れていることです。
コンピュータビジョンに関連する製品を作成している場合、または短時間で大量の画像を処理する必要がある場合、つまりパフォーマンスが重要な場合は、OpenCVを使用する必要があります。
新しいビジョンまたは画像アルゴリズムの研究を行っていて、パフォーマンスが問題にならない場合は、Matlabを選択してください。
Matlabは、C++と比較して開発時間が1桁速くなっています。正確な数はわかりませんが、両方の言語の経験がある人なら誰でもこの主張を支持するでしょう。
アルゴリズムを試してみたい場合、Matlabに必要な機能がある場合は、C++ではなくすぐに選択されます。
Matlabには、画像処理機能だけでなく、C++では他のライブラリをフックする必要がある数学関数もあります(画像処理を行う場合、数学ライブラリは非常に重要です)。