web-dev-qa-db-ja.com

OpenCV-IplImage

IplImageOpenCVとは何ですか?タイプとしての意味を説明していただけますか?いつ使うべきですか?

ありがとう。

16
Simplicity

質問にある「c ++」タグに基づいて:使用しないでください。cv:: Matを使用する必要があります。すべてのIplImageは内部的にcv :: Matです。

IplImageはCAPIでのみ使用されます。これは一種のCvMatであり、画像データを保持します。その名前は、OpenCVのルーツ(Intel IPL)に由来しています。

OpenCVのC++ APIを使用している場合は、もう関係ありません。

24
ypnos

IplImageとcv :: Matは、マトリックス/画像データの異なるヘッダータイプです。これらは基本的に相互に互換性がありますが、IplImageはOpenCVのC APIで使用され、cv :: MatはnewC++ APIで使用されます。

OpenCVのCAPIを使用する場合は、主にIplImagesを使用します。それ以外の場合は、主にcv :: Matsを使用します。

もちろん、IplImagesとcv :: Matsを相互に変換することもできます。

cv::Mat mat(myIplImage);

この場合、それらは同じ基になるデータを共有します。つまり、データへのアクセスに使用しているヘッダーに関係なく、いずれかのヘッダーを介して行われた変更が表示されます。

ディープコピー(ヘッダーが「変換」/コピーされるだけでなく、基になるデータも)が可能です。

cv::Mat mat(myIplImage, true)

複数のcv :: Matsと同様に、複数のIplImageが同じ基になるデータを指すこともあることに注意してください。


OpenCVおよび同様のライブラリを使用する場合、cv :: MatsおよびIplImagesは実際のデータの「ヘッダー」にすぎないことに注意することが重要です。 cv :: MatsとIplImagesは基本的にポインタであり、行数、列数、チャネル数、使用されるデータ型などの重要なメタ情報であると言えます。マトリックス/画像の個々のセル/ピクセルに対して。そして、実際のポインタのように、同じ実際のデータを参照/指すことができます。

たとえば、IplImageの定義を見てください: http://opencv.willowgarage.com/documentation/basic_structures.html#iplimage

最も重要なメンバーはchar *imageData;。このポインタは、実際の画像データを参照します。ただし、IplImage全体には、行数や列数など、画像に関するメタ情報も含まれています。

22
robert

IplImage構造は、フォーマットがネイティブであるIntel Image ProcessingLibraryから継承されました。上記のパラメータリストで概説されているように、OpenCVは可能なIplImage形式のサブセットのみをサポートします。

2
Soumajyoti

C++を使用している場合、IplImageはCプログラムでのみ使用されるため、使用しません(IplImageはC APIにあります)。さらに、Cを使用している場合は、変数名の前にCvを投稿する必要があります: "CvMat *" "CvPoint" "IplImage"など。C++コードを使用することをお勧めします。Cv:" Mat * "などは使用しませんが、IplImageの代わりにIplImageタイプを使用することはできません。Matタイプを使用します。たとえば、findchessboardcorner関数で。

0
Isra-MiAn