Opencvの(4)-画像フォーマット間の変換を学ぶ
1 opencvのいくつかの一般的な画像タイプ
Opencvでは、いくつかの一般的な画像タイプがあります.
IplImage,Mat,CvMat,CvArr
CvArr :
古いバージョンの構造になりました.抽象ベースクラスで、関数プロトタイプではCvArr(CvArr*)によく見られるので、CvMar*またはIplImage*をプログラムまたは関数パラメータに渡すことができます.
CvMat :
マトリックス構造、
IplImage :
従来のバージョンの1つで、画像を「符号化」する基本構造です.これらの画像は階調、カラー、4チャネル(RGB+alpha)であり、各チャネルは任意の整数または浮動小数点数を含むことができます.
Mat:
新しいバージョンの強力な画像コンテナは、Matlabの関数に対応しています.基本的にMatはクラスであり、マトリクスヘッダ(マトリクスサイズ、格納方法、格納アドレスなどの情報を含む)と、すべての画素値を格納するマトリクス(選択した格納方法によって異なる次元であってもよい)を指すポインタとからなる.マトリクスヘッドのサイズは定数値ですが、マトリクス自体のサイズは画像によって異なり、通常はマトリクスヘッドのサイズより数桁大きいです.
2 opencvでの画像タイプ変換の格納
(1)IplImageタイプをMatタイプに変換
Mat::Mat(const IplImage* img, bool copyData=false);
デフォルトでは、新しいMatタイプは元のIplImageタイプと画像データを共有し、変換はMatマトリクスヘッダを作成するだけです.パラメータcopyDataをtrueに設定すると、画像データ全体がコピーされます.
例:
IplImage*iplImg = cvLoadImage("greatwave.jpg", 1);
Matmtx(iplImg);//IplImage*->Mat共有データ
//or : Mat mtx = iplImg;
(2)MatタイプをIplImageタイプに変換
同じように画像ヘッダを作成するだけで、データはコピーされません.
例:
IplImage ipl_img = img; //Mat -> IplImage
(3)CvMatタイプをMatタイプに変換
IplImageの変換と同様に、データをコピーするかどうかを選択できます.
Mat::Mat(const CvMat* m, bool copyData=false);
(4)MatタイプをCvMatタイプに変換
IplImageの変換と同様に、データをコピーせずにマトリクスヘッダのみを作成します.
例:
//MatタイプのimgMat画像データが存在するとする
CvMat cvMat = imgMat; //Mat -> CvMat
いくつかの例:
マトリクスに便利なオペレータを定義します.既存の階調画像imgを全黒にすることができます.
対象領域を選択:
MatをC APIデータ型に変換するには:
注意ここにはデータコピー操作はありません.
カラー画像をグレースケール画像に変換するには、次の手順に従います.
画像の種類を8 UC 1から32 FC 1に変更します.
3まとめ
やはり多く参考にして、多く使って、映像はやっと深いです
4参考
http://www.cnblogs.com/zcftech/archive/2013/04/10/3013027.html
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_mat.html#id6
Opencvでは、いくつかの一般的な画像タイプがあります.
IplImage,Mat,CvMat,CvArr
CvArr :
古いバージョンの構造になりました.抽象ベースクラスで、関数プロトタイプではCvArr(CvArr*)によく見られるので、CvMar*またはIplImage*をプログラムまたは関数パラメータに渡すことができます.
CvMat :
マトリックス構造、
IplImage :
従来のバージョンの1つで、画像を「符号化」する基本構造です.これらの画像は階調、カラー、4チャネル(RGB+alpha)であり、各チャネルは任意の整数または浮動小数点数を含むことができます.
Mat:
新しいバージョンの強力な画像コンテナは、Matlabの関数に対応しています.基本的にMatはクラスであり、マトリクスヘッダ(マトリクスサイズ、格納方法、格納アドレスなどの情報を含む)と、すべての画素値を格納するマトリクス(選択した格納方法によって異なる次元であってもよい)を指すポインタとからなる.マトリクスヘッドのサイズは定数値ですが、マトリクス自体のサイズは画像によって異なり、通常はマトリクスヘッドのサイズより数桁大きいです.
2 opencvでの画像タイプ変換の格納
(1)IplImageタイプをMatタイプに変換
Mat::Mat(const IplImage* img, bool copyData=false);
デフォルトでは、新しいMatタイプは元のIplImageタイプと画像データを共有し、変換はMatマトリクスヘッダを作成するだけです.パラメータcopyDataをtrueに設定すると、画像データ全体がコピーされます.
例:
IplImage*iplImg = cvLoadImage("greatwave.jpg", 1);
Matmtx(iplImg);//IplImage*->Mat共有データ
//or : Mat mtx = iplImg;
(2)MatタイプをIplImageタイプに変換
同じように画像ヘッダを作成するだけで、データはコピーされません.
例:
IplImage ipl_img = img; //Mat -> IplImage
(3)CvMatタイプをMatタイプに変換
IplImageの変換と同様に、データをコピーするかどうかを選択できます.
Mat::Mat(const CvMat* m, bool copyData=false);
(4)MatタイプをCvMatタイプに変換
IplImageの変換と同様に、データをコピーせずにマトリクスヘッダのみを作成します.
例:
//MatタイプのimgMat画像データが存在するとする
CvMat cvMat = imgMat; //Mat -> CvMat
いくつかの例:
マトリクスに便利なオペレータを定義します.既存の階調画像imgを全黒にすることができます.
img = Scalar(0);
対象領域を選択:
Rect r(10, 10, 100, 100);
Mat smallImg = img(r);
MatをC APIデータ型に変換するには:
Mat img = imread("image.jpg");
IplImage img1 = img;
CvMat m = img;
注意ここにはデータコピー操作はありません.
カラー画像をグレースケール画像に変換するには、次の手順に従います.
Mat img = imread("image.jpg"); // loading a 8UC3 image
Mat grey;
cvtColor(img, grey, CV_BGR2GRAY);
画像の種類を8 UC 1から32 FC 1に変更します.
src.convertTo(dst, CV_32F);
3まとめ
やはり多く参考にして、多く使って、映像はやっと深いです
4参考
http://www.cnblogs.com/zcftech/archive/2013/04/10/3013027.html
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_mat.html#id6