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よりもこっち使ったほうがよかったんじゃなかろうか…。少し気になるけど、実行時間とかどうなってるんだろ