現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::基本編05
INDEXOpenCV::基本編04 << OpenCV::基本編05 >> OpenCV::基本編06

行列


OpenCVでは、 などの行列が用意されているが、ここでは「CvMat」に関してである。

行列の作り方


行列を作る場合は
  • メモリだけ確保しておく
  • 行列の作成とデータの設定をする

という2種類の場合がある。

[1].メモリだけ確保する場合


cvCreateMat関数でメモリ確保ができる。


[例]

	CvMat *M = cvCreateMat(256,512,CV_32FC1); //256行512列の行列、float(32bit)、1チャネル


この後、データを設定する事になる。


#include <iostream>
#include <algorithm>
#include <cv.h>

float dataM[]={1,2,3,4,5,6,7,8};

int main(int argc, char **argv)
{

	CvMat *M = cvCreateMat(2,4,CV_32FC1);//2行4列(すべての行は1要素が4バイトでアライメント)
	cvSetData(M,dataM,M->step); //データ設定(今回はstep = 4×4 = 16バイトが行の長さ)
	
	std::copy(M->data.fl,M->data.fl+8,std::ostream_iterator<float>(std::cout,", "));
	std::cout << "\n";

	return EXIT_SUCCESS;
}



[2].行列の作成とデータの設定をする


cvMat関数cvInitMatHeader関数がある。

[例1]:cvMat関数を使った場合

#include <iostream>
#include <algorithm>
#include <cv.h>

float dataM[]={1,2,3,4,5,6,7,8};

int main(int argc, char **argv)
{

	CvMat M = cvMat(1,8,CV_32FC1,dataM);//1行8列の行列、float、1チャネル、DataMを設定

	std::copy(M.data.fl,M.data.fl+8,std::ostream_iterator<float>(std::cout,", "));
	std::cout << "\n";

	return EXIT_SUCCESS;
}



[例2]:cvInitMatHeader関数を使った場合

#include <iostream>
#include <algorithm>
#include <cv.h>

float dataM[]={1,2,3,4,5,6,7,8};

int main(int argc, char **argv)
{
	CvMat M;

	cvInitMatHeader(&M,1,8,CV_32FC1,dataM);

	std::copy(M.data.fl,M.data.fl+8,std::ostream_iterator<float>(std::cout,", "));
	std::cout << "\n";

	return EXIT_SUCCESS;
}

メモ


OpenCVのCvMat構造体は

typedef struct CvMat
{
	int type; /* CvMat signature (CV_MAT_MAGIC_VAL), element type and flags */
	int step; /* full row length in bytes */

	int* refcount; /* underlying data reference counter */

	union
	{
		uchar* ptr;
		short* s;
		int* i;
		float* fl;
		double* db;
	} data; /* data pointers */

	#ifdef __cplusplus
	union
	{
		int rows;
		int height;
	};

	union
	{
		int cols;
		int width;
	};
	#else
	int rows; /* number of rows */
	int cols; /* number of columns */
	#endif

} CvMat;

とあるようにC++では
  • row → 高さ(y)
  • cols → 幅(x)
となっている。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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