将cv :: MatExpr转换为type

nbu*_*bis 0 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

写这个有更好,更清晰的方法吗?我可以以某种方式超载操作员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);
} 
Run Code Online (Sandbox Code Playgroud)

BCo*_*nic 5

你可以做的是使用cv::Mat::dot函数(文档链接),它具有两个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);
Run Code Online (Sandbox Code Playgroud)

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

double d = (M.t()*U.inv()*a).dot(V.inv()*b);
Run Code Online (Sandbox Code Playgroud)