IplImage
のOpenCV
とは何ですか?タイプとしての意味を説明していただけますか?いつ使うべきですか?
ありがとう。
質問にある「c ++」タグに基づいて:使用しないでください。cv:: Matを使用する必要があります。すべてのIplImageは内部的にcv :: Matです。
IplImageはCAPIでのみ使用されます。これは一種のCvMatであり、画像データを保持します。その名前は、OpenCVのルーツ(Intel IPL)に由来しています。
OpenCVのC++ APIを使用している場合は、もう関係ありません。
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全体には、行数や列数など、画像に関するメタ情報も含まれています。
IplImage構造は、フォーマットがネイティブであるIntel Image ProcessingLibraryから継承されました。上記のパラメータリストで概説されているように、OpenCVは可能なIplImage形式のサブセットのみをサポートします。
C++を使用している場合、IplImageはCプログラムでのみ使用されるため、使用しません(IplImageはC APIにあります)。さらに、Cを使用している場合は、変数名の前にCvを投稿する必要があります: "CvMat *" "CvPoint" "IplImage"など。C++コードを使用することをお勧めします。Cv:" Mat * "などは使用しませんが、IplImageの代わりにIplImageタイプを使用することはできません。Matタイプを使用します。たとえば、findchessboardcorner関数で。