閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

OpenCVのMatが強かった

C++版のMat構造体って表現力豊かだなーと思っていましたが、oepratorも色々用意されていて今まで書いてたコードも冗長だったなと気付かされました。

OpenCV: cv::MatExpr Class Reference

Matとdoubleを比較してマスクを得る…みたいなことができるので、これを使うとPythonと同じくらいのコード量で同じことができます。

Pythonというかnumpyだと、配列(画像)中の0以外の値を全部255にしたい、という場合に以下のように書けますが

mat = np.array([
    0, 1, 0,
    1, 1, 1,
    0, 1, 0])
mat[mat != 0] = 255

C++もこれだけでいけました。

cv::Mat mat = (cv::Mat_<uint8_t>(3, 3) <<
            0, 1, 0,
            1, 1, 1,
            0, 1, 0);
mat.setTo(255, mat != 0);

さすがに直接代入することはできなさそうですが、十分簡潔です。OpenCVの場合、大抵は用意されている関数を使う方がパフォーマンスも出るので、用意されている機能はゴリゴリ使う方がコードもどんどん短くなって気持ちよさそうです。