web-dev-qa-db-ja.com

OpenCV:IplImage対Mat、どちらを使用しますか?

私はOpenCVを初めて使用します(約2か月後)。 BradskiとKaehlerによる著書OpenCVの学習があります。私の質問は、2.0 +の方法ですべてを実行したい場合、Matrices(Mat)をいつ使用し、IplImageをいつ使用するかです。

Bradkyの本は、OpenCV 2.0に基づいて書かれていることを前書き(序文)に記載しており、主にサンプルコードでIplImageを使用していますが、最近のオンラインドキュメントでは、Matが画像、マスクなどのキャッチオールデータ型のように聞こえます、Matlabの基本的なマトリックスのようなものです。これにより、IplImageを廃止する必要があるかどうか疑問に思うようになります。

だから、新しいコードを書くときにIplImagesを完全に避けるべきですか?または、IplImagesでMatsができない重要なことができますか?

ありがとう。

57
SSilk

IplImage当初からOpenCVにありました。 OpenCVのCインターフェイスの一部です。 IplImage構造体のメモリを自分で割り当ておよび割り当て解除する必要があります。 (cvReleaseImageコマンドを覚えていますか?)

新しいMat構造は、C++構造の一部です。したがって、明らかにオブジェクト指向です。また、すべてのメモリを管理します!それへの参照を追跡します。その後、参照の数がゼロになり、自動的に割り当て解除されます。これは素晴らしい機能です!

Matに進みます。コードをIplImage thingyからMat thingyに変換するのは簡単です。IntelliSenseを使用しているIDE(使用可能な関数のリストをドロップダウン、変数などを入力しながら)

73
Utkarsh Sinha

Matを使用することを強くお勧めします。私はしばらくそれを使ってきましたが、それは素晴らしいことです。メンバー関数と行列式は、IplImageを扱うよりもはるかに簡単になり、先ほど述べたように、すべてをキャッチするデータ型です。

Matを探してください!

16
Jacob

これは、実際にアプリケーションを実行するプラットフォームに依存すると言うでしょう。組み込みシステム用のアプリケーションを開発している場合、Cを使用する可能性が高くなります。その場合、IplImageを使用する必要があります。 チュートリアル からの引用:

C++インターフェースの主な欠点は、現時点では多くの組み込み開発システムがCのみをサポートしていることです。したがって、組み込みプラットフォームを対象としない限り、古い方法を使用する意味はありません(マゾプログラマーであり、トラブルのため)。

12
Sunny

助けてくれてありがとう。

また、この質問を投稿して以来、Matを引数として持つ関数は、そのIplImage引数の代わりにMatを直接取ることができることを発見しました。既に便利な機能に分割されている場合は、コードをまとめて更新します。関数の引数をIplImage*からMatに変更してから、Matで機能するように関数を変更します。その関数を呼び出す他のコードは引き続き正常に動作するはずです(私の経験では)。

7
SSilk

クイックアップデート:

OpenCV 4 の出現により、IplImageおよび「レガシーC API」と呼ばれるものがすべて徐々に削除されるため、質問に対する答えはより簡単になります。 OpenCV 4.0 "alpha"では、IplImageはすでになくなっています-CvMatと同様

したがって、OpenCV4.0 +で作業する場合、Mat Class...を使用してください。選択肢がないためです。

[注:もちろん、OpenCVの古いバージョンをまだ使用している場合、問題は依然として関連しています。]

2
godot

マットははるかに使いやすくなっています。画像をマトリックスとして表します。それも高速です。 IplImageよりもMatをお勧めします。

1
Mojo Jojo

マットをお勧めします。ガベージコレクションは自動的に行われるため、アプリケーションの信頼性が高くなり、メモリリークが少なくなります。また、Matはデータストレージの新しい方法であるため、OpenCVから始めたばかりの初心者の方は、Matの方が新しく、完全なアプリケーションを作成するのにそれほど慎重なコーディングは必要ありません。

互換性は、Matが少し悪くなることの1つです。IplImageはより長く利用できるため、ほとんどのものとの互換性が向上しています。 IplImageをMatでも使用できると信じています。そうでない場合、IplImage> Matも非常に簡単に実行できます。

Iplimageははるかに長い期間利用可能であるため、おそらくより多くのサンプルが見つかるでしょう。

ここに私の2セントがあります:OpenCVを使用した視覚処理の新人(まだ学習のコツ)として、MatまたはIplImageのいずれかを選択して、それを本当に得てください。ただし、少なくとも他のユーザーとの互換性がない機能を使用する必要がある場合はどうすればよいかがわかるように、少なくとも他のユーザーの基本を学んでください。

しかし、もしあなたが初心者なら、Matから始めてみてください。それはより新しい実装であるため、学習し、正しく取得するのが簡単です!

1
yash101

私は2012年頃にopencvを使い始めました。だから私はMatから始めました。これは強力で使いやすいです。また、使用します。しかし、未来はマットだと思います。クラスのマットを忘れないでください。つまり、マットをリリースする必要はありません。一方、インプリメンテーションを解放する必要があります。私の英語は下手です、ごめんなさい。

0
jsxyhelu

Cv :: Matを使用する方がはるかに便利だと思います。より一般的です。 IplImageはcv :: Matのサブセットであることがわかります。 IplImageのデフォルトのデータ型は符号なし整数ですが、cv :: Matのデータ型はdoubleです。そのため、Matをあらゆる種類の数学演算に使用する方がはるかに簡単です。

0

IplimageはOpencvのCインターフェイスの構造であり、MatはC++プログラムにより適し、refパラメーターやストリーム演算子などのC++スタイルをサポートしています。これらはすべてオブジェクト指向プログラミングですが、MatにはIplimageよりも多くのメソッドが含まれています。 IpliamgeがcvXXXインターフェイスを呼び出して作成し、リリースします。さらに、MatはOpencv2の新しい構造であり、古い構造の開発のシンボルだと思います。助けてほしい。

0
user2226360