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];
目に見えて速くなった。
たまにはプロファイラにかけてみるべきだな、と思いました。