OpenCV中cv::Vec2d与cv::Matx<double,2,1>转换错误及除法问题
问题
需要执行逐元素运算:
out = dist * v1 * v2 / res;
其中:
dist为double类型标量v1、v2、res均为cv::Vec2d(包含2个double元素的向量)
基于OpenCV编写的代码如下:
#include <opencv2/core.hpp> cv::Vec2d test() { double dist = 1.0; cv::Vec2d v1(1.0, 1.0), v2(1.0, 1.0); return (dist * v1).mul(v2).div(res); // 注:原代码中v3应为res,此处修正笔误 }
使用VC17的cl.exe编译时,出现如下错误:
E0312 no suitable user-defined conversion from "cv::Matx<double, 2, 1>" to "cv::Vec2d" exists
拆分操作后确认问题出在.div方法,.mul方法可正常运行。
查阅OpenCV文档后发现:
cv::Vec<_Tp,cn>继承自cv::Matx<_Tp,cn,1>,理论上cv::Vec2d等价于cv::Matx<double,2,1>,但不清楚哪里出错- 文档中未找到
cv::Vec<_Tp,cn>::div的声明,也无逐元素除法操作的相关说明,但该方法确实存在
请问错误原因是什么?如何简单解决?
补充说明
- 已在OpenCV论坛交叉发布
- 已在GitHub提交Issue
回答
错误原因
- 类型返回不匹配:
cv::Vec的mul方法是自身实现的成员函数,返回值仍为cv::Vec类型;但div方法是从父类cv::Matx继承而来,返回的是cv::Matx<double,2,1>类型。OpenCV未提供cv::Matx到cv::Vec的隐式转换,因此编译时触发类型转换错误。 - 文档显示问题:OpenCV官方文档仅展示
cv::Vec类自身声明的方法,不会列出从cv::Matx继承的成员函数,所以找不到div方法的文档说明,但实际它是父类方法,可被Vec调用。
解决方法
推荐以下几种简单可行的方案:
方案1:显式转换为cv::Vec2d
在div调用后,通过cv::Vec2d构造函数显式转换返回的Matx对象:
return cv::Vec2d( (dist * v1).mul(v2).div(res) );
方案2:使用/运算符重载
OpenCV为cv::Vec提供了逐元素除法的/运算符重载,直接替换div方法即可,代码更直观:
return (dist * v1).mul(v2) / res;
方案3:手动逐元素计算
如果想完全避免依赖继承方法或运算符重载,可手动遍历计算每个元素:
cv::Vec2d temp = (dist * v1).mul(v2); return cv::Vec2d(temp[0] / res[0], temp[1] / res[1]);
内容的提问来源于stack exchange,提问作者Buzz
相关产品推荐
相关产品推荐

