現在地 >> メニュー >> OpenCV >> C++インターフェイス編02
INDEX:C++インターフェイス編01 <<C++インターフェイス編02 >> C++インターフェイス編03?

cv::Matクラス


OpenCV2.0からは「cv::Matクラス」が用意されている。
これは、従来の「IplImage」や「CvMat」のかわりとなっている。

IplImageやCvMatと異なり、メモリは自動的に破棄するようになっている。
また、簡単にIplImageやCvMatに変換する事ができる。

画像読み込みと表示

【例】
const std::string filename("building.png");

int main()
{
	cv::Mat imgB;
	imgB = cv::imread(filename);
	if( !imgB.data )
	{
		std::cerr << "Can't Load Image\n";
		return -1;
	}

	cv::namedWindow(filename);
	cv::imshow(filename,imgB);
	
	cv::waitKey();

	return 0;	//デストラクタによりメモリが破棄される
}

保存


保存にほcv::imwriteというのがあるが、2.0時点でのリファレンスをみると細かな制限があるっぽい。
(シングルチャンネルでもPNG, JPG 2000, TIFF の場合は 16ビットとか)

素直にcvSaveImageがいいかもしれない。
【例】
cv::Mat imgB;
imgB = cv::imread(filename);
… …
IplImage output = imgB;//画像データは共有状態
cvSaveImage("testout.png",&output);
▲このように「=」を使って簡単にIplImageにすることができる。
なお画像データは共有状態となる。

IplImage、CvMat型にする


「cv::Matクラス」はIplImage型やCvMat型の変数に対し「=」で代入するだけで変換して扱う事ができる。
ただし、画像データそのものはコピーせず、共有状態となる。
【例】
cv::Mat imgB;
… …
IplImage ipl_imgA = imgB;//画像データはコピーしない。共有状態となっている。

cv::Matを破棄してもメモリを破棄しない


cv::Matを破棄しても他のオブジェクトがデータを参照できる状態の場合、
cv::Matオブジェクトが破棄されても、データは破棄されない。

cv::Ptr<IplImage> imgA = cvLoadImage(filename.c_str());
… …
{
	cv::Mat imgB(imgA);//データは共有状態
	… …
}//cv::Matオブジェクトはここで破棄される。しかし画像データは破棄されない。

サンプルコード


目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます