C++中cv::Matの一種「スライス」の方法

694 ワード

OpenCV+C++を使用する場合、指定した数行の数列や領域など、Mat構造をpythonやMatlabのスライスと同様に操作したい場合があります.最近の学習の過程で,指定された領域のデータを取るのに役立つ,スライスのような操作をOpenCVが提供することを記した.
cv::Rect(x,y,width,height)関数のパラメータは4個で,xとyはそれぞれ取り領域の開始座標,widthとheightはそれぞれ取り領域の幅と長さを表す.これにより、次のテストコードを書くことができます.
double m[3][3] = 
	{ {1, 2, 3},
	  {4 ,5, 6},
	  {7 ,8, 9},
	};
cv::Mat testMat(3,3,CV_64FC1,m);
cout << testMat << endl;
cv::Mat A=testMat(cv::Rect(0,0,2,3));
cout << A << endl;

testMat: [1, 2, 3;  4, 5, 6;  7, 8, 9] A: [1, 2;  4, 5;  7, 8]
出力結果を示すように,我々が得た行列Aは行列testMatの(0,0)から始点,幅2長さ3のサブ領域,すなわち第1列と第2列である.
この関数により、「スライス」の機能を簡単に実現でき、マトリクスに必要な行ベクトルや列ベクトル、さらにはサブマトリクスを比較的簡単に取得できます.