OpenCV 2.3.1のcv::Matxとの2項演算子の不具合の解消。

以下それぞれでコンパイルエラーが出る。

cv::Vec3d v = cv::Matx33d() * cv::Vec3d();
cv::Matx44d() * cv::Scalar();

それぞれ、Matx と Vec との乗算演算の戻り値が Matxであるためと、opencv2/core/operations.hpp:656 の operator*(Matx, Scalar) 内にあるScalarのコンストラクタが存在しないため。

解決策として以下を追加する(追記位置はopencvのincludeファイルでなくてもよく、自分のコードでよい)。

namespace cv {
template <typename _Tp, int m, int n> static inline
const Vec<_Tp, m> operator*(const Matx<_Tp, m, n> &a, const Matx<_Tp, n, 1> &b) {
  return Vec<_Tp, m>(Matx<_Tp, m, 1>(a, b, Matx_MatMulOp()), 1, Matx_ScaleOp());
}
}

これにより、演算結果が行列でなくベクトルになる場合、Vecが戻り値になるようになる。ScalarのコンストラクタはVecから型変換したCvScalarを受けるので、問題は解決する。