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)
你可以做的是使用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)
| 归档时间: |
|
| 查看次数: |
3817 次 |
| 最近记录: |