cvCreateMatが重い

プロファイラにかけてみたら、cvCreateMatが意外に重い。
頻繁に呼ばれる関数で毎回、行列を確保・解放するのがよくない。


幸いにも、自分が使う行列は3x3と3x1だけなので
3x3と3x1の行列をクラスのメンバとして確保することにした。


コンストラクタで十分な数だけ行列を確保して、
各関数でポインタを適宜代入

デストラクタで解放。


//foo.h
	//行列の確保は重いので、あらかじめメンバ関数として用意
	std::vector<CvMat*> m_mat3x3;
	std::vector<CvMat*> m_mat3x1;
//foo.cpp
//コンストラクタ

	//最初に行列を確保しておく
	int matNum = 10;
	m_mat3x3.resize(matNum);
	m_mat3x1.resize(matNum);
	for(int i=0; i<matNum; i++){
		m_mat3x1[i] = cvCreateMat(3, 1, CV_64FC1);
		m_mat3x3[i] = cvCreateMat(3, 3, CV_64FC1);
	}

//クラス内の関数で、こうして使う
	enum eP3P{
		Y,
		X,
		R,
		AR,
		TMP,
		IMG,
		WLD,
		SIZE
	};

	std::vector<CvMat*> mat(SIZE);
	mat[Y] = m_mat3x3[0];
	mat[X] = m_mat3x3[1];
	mat[R] = m_mat3x3[2];
	mat[AR] = m_mat3x3[3];
	mat[TMP] = m_mat3x3[4];
	mat[IMG] = m_mat3x1[0];
	mat[WLD] = m_mat3x1[1];


目に見えて速くなった。
たまにはプロファイラにかけてみるべきだな、と思いました。