将cv :: MatExpr转换为type

时间:2014-04-03 01:59:05

标签: c++ opencv operator-overloading

我已经评估过1×1矩阵的多个矩阵表达式。我想做点什么:

cv::Mat a = cv::Mat(n, m, CV_64F), b = ..., c = ...
double d = a.t() * b * c.inv(); // result happens to be 1 x 1 matrix

我发现这样做的方法是写:

double d = ((cv::Mat)(a.t() * b * c.inv())).at<double>(0);

这有点长且非常令人困惑,特别是如果涉及长表达式。

有没有更好,更清晰的方式来写这个?我可以以某种方式重载操作符double仅适用于1x1 cv::MatExpr的?

修改

这样做的简单功能当然是可能的,虽然很难看。更优雅的解决方案?

double toDouble(cv::MatExpr M) {
  cv::Mat A = M;
  if (A.rows != 1 || A.cols != 1) throw "Matrix is not 1 by 1!";
  return A.at<double>(0);
} 

1 个答案:

答案 0 :(得分:5)

您可以做的是使用cv::Mat::dot函数(documentation link),该函数需要两个cv::Mat相同的大小并返回一个double。

如果您的操作结果是1x1矩阵,那么您应该能够使用cv::Mat::dot来表达它。例如,如果a和b是nx1,则以下两行是等效的:

double d = ((cv::Mat)(a.t() * b)).at<double>(0);

double d = a.dot(b);

人们还可以想象更复杂的操作:

double d = (M.t()*U.inv()*a).dot(V.inv()*b);