のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

OpenCVの使い方(5) Matの使い方

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

OpenCVにはMat型やRectが使われています。
なんか遅い気がしますが、それらの扱い方を見ていきたいと思います。
因みに今回は画像は扱いません、悪しからず。
(人物追跡についてはアルゴリズムを調査中)

Sample Code

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main(int argc, char const *argv[]){
	Mat m1 = Mat::ones(3,3,CV_32F) * 10;
	Mat m2 = Mat::ones(cv::Size(3,3), CV_32F) * 2;

	cout << "m1,m2" << endl;
	cout << m1 << endl;
	cout << m2 << endl;

	//四則演算
	cout << "和" << endl;
	cout << m1 + m2 << endl;
	cout << "差" << endl;
	cout << m1 - m2 << endl;
	cout << "積" << endl;
	cout << m1 * m2 << endl;
	cout << "商" << endl;
	cout << m1 / m2 << endl;
	cout << m1.rows << m1.cols << endl;

	//逆行列と行列式
	float data[][3] = { {1.0, -2.0, 3.0}, {3.0, 1.0, -5.0}, {-2.0, 6.0, -9.0} };
	Mat m3(3,3,CV_32F,data);

	cout << "逆行列" << endl;
	cout << m3.inv() << endl;
	cout << m3 * m3.inv() << endl;
	cout << "行列式" << endl;
	cout << determinant(m3) << endl;

	Rect r1 = Rect(0,0,2,2);
	Rect r2 = Rect(1,1,2,2);
	cout << r1 << r2 << endl;
	Mat m4(m1,r1);
	cout << m4 << endl;

	Rect r3 = r1 & r2;
	cout << r3 << endl;
	return 0;
}

Output

m1,m2
[10, 10, 10;
  10, 10, 10;
  10, 10, 10]
[2, 2, 2;
  2, 2, 2;
  2, 2, 2][12, 12, 12;
  12, 12, 12;
  12, 12, 12][8, 8, 8;
  8, 8, 8;
  8, 8, 8][60, 60, 60;
  60, 60, 60;
  60, 60, 60][5, 5, 5;
  5, 5, 5;
  5, 5, 5]
33
逆行列
[3, 0, 1;
  5.2857141, -0.42857143, 2;
  2.8571429, -0.2857143, 1]
[1, -5.9604645e-08, 0;
  -9.5367432e-07, 1, 0;
  -1.9073486e-06, 2.3841858e-07, 1]
行列式
7
[2 x 2 from (0, 0)][2 x 2 from (1, 1)]
[10, 10;
  10, 10]
[1 x 1 from (1, 1)]

一覧表

計算 プログラム
A+B mat1 + mat2
A-B mat1 - mat2
AB mat1 * mat2
ABの要素を掛ける mat1.mul(mat2)
A/B mat1/mat2
A_T(転置) mat1.t()
逆行列 mat1.inv()
行列式 determinant(mat1)

因みにRectは&によって共通部分を抽出することができます。
調べてみてわかったことは、正直どこぞのboostより使いやすそうってことですね。

Denoising Auto Encoderを実装した時boostよりもこっち使ったほうがよかったんじゃなかろうか…。少し気になるけど、実行時間とかどうなってるんだろ