OpenCVにおける行列の"掛け算"
OpenCVの行列における演算子 *
の意味が、C++とPythonで異なるようですね。はまりそうです。PythonはOpenCVというか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もこれらに似せようとして時々こんなことがあり、微妙ですね。