cv::Matx

OpenCV 2.2 で追加されたコンパイル時固定サイズ行列クラス。cv::Matの基本処理 — OpenCV-CookBook cookbookやマニュアルにない機能もあるので紹介する。対象バージョンは2.3.1。

変数宣言

cv::Matx<Type, Rows, Columns> m;

テンプレート引数に行数、列数を定数で指定する。浮動小数点数型であれば、4行4列以下、1行6列、6行1列、6行6列の行列が以下の書式で typedef されている。https://code.ros.org/trac/opencv/browser/branches/2.3/opencv/modules/core/include/opencv2/core/core.hpp?desc=1#L519

cv::Matx[1-46][1-46][fd]

たとえば、cv::Matx24d は double型2行4列の行列である。

初期化

行列の要素数が10個以下、12個、16個の場合なら以下の書式で初期化可能。

cv::Matx22d m22d(0, 1,
                 2, 3);
cv::Matx34d m34d(0, 1, 2, 3,
                 4, 5, 6, 7,
                 8, 9, 0, 1);

全要素に同じ値valueが入ったMatxは Matx::all(value) で得られる。

cv::Matと同じ機能

cv::Matと同様に、ゼロ行列、全要素が1の行列、単位行列はそれぞれ Matx::zeros()、Matx::ones()、Matx::eye()で得られる。

また、diagはMatx::diag(Matx)で対角行列を定義する。ここで、MatxはVecでもよい。メンバ関数をm.diag()と呼べば対角成分だけ取り出せる。

一様分布乱数正規分布乱数で初期化した行列を得るには以下。
Matx::randu(a, b);
Matx::randn(a, b);

その他

面倒なので他は書かないけれど、基本的にcv::Matにあるもののほとんどは使える。なければ型変換すればよい。

Matへの型変換

型変換の際、Matと異なり実体は共有されないので、Matへの変更先の変数を書き換えることで元の変数の値を書き換えたい場合はcv::Mat(m, false)とする。ただし、スコープを抜けるなどしてMatx変数が解放される場合は正常動作しないだろう。たとえば関数の内部で宣言したMatxを、戻り値cv::Mat(m, false)のように返したりするのはダメ。