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の場合、大抵は用意されている関数を使う方がパフォーマンスも出るので、用意されている機能はゴリゴリ使う方がコードもどんどん短くなって気持ちよさそうです。