OpenCVにおける行列の"掛け算"

OpenCVの行列における演算子 * の意味が、C++Pythonで異なるようですね。はまりそうです。PythonOpenCVというかnumpyの仕様になりますが。

Python

m = numpy.zeros((5, 1), numpy.uint8)
n = numpy.zeros((5, 1), numpy.uint8)
mn = m * n  # ok

要素ごとの積を求めるので、サイズが同じならOK。

C++

cv::Mat m = cv::Mat::zeros(5, 1, CV_8UC1);
cv::Mat n = cv::Mat::zeros(5, 1, CV_8UC1);
cv::Mat mn = m * n;  // error

行列の積なので、サイズが不正でエラー。

要素ごとの積ならこうします。

auto mn = m.mul(n);

numpyで行列の積

numpyの方で行列の積をするなら、dotです。

mn = m.dot(n)

C++の方のdotはまた別の意味(dot product)なのでさらに注意。

感想

numpyとMatlabも微妙に違って混乱がありますが、OpenCVもこれらに似せようとして時々こんなことがあり、微妙ですね。