如何将 OpenCV 的 MatExpr 的 C 包装器的指针输出转换回 MatExpr
Posted
技术标签:
【中文标题】如何将 OpenCV 的 MatExpr 的 C 包装器的指针输出转换回 MatExpr【英文标题】:How to I convert the pointer output of this C wrapper for OpenCV's MatExpr, back into a MatExpr 【发布时间】:2014-03-24 02:19:33 【问题描述】:这是我的 OpenCV 的 MatExpr "/" 运算符的 C 包装器
MatExpr* cv_Mat_div_S(Mat* m1, int m2)
return new MatExpr(*m1 / m2);
我认为我在将帧转换为要在 cv_Mat_div_S 中使用的指针的地方得到了正确的部分 并在 cv_Mat_div_S 函数中使用对它的引用
Mat mat(frame);
cv_Mat_div_S(&mat, 255);
但是在尝试在如下所示的普通 C++ cvtColor 中使用 Cv_Mat_div_S 的输出时,我收到一长串错误,其中最相关的是:
错误:'operator*' 不匹配(操作数类型为'cv::Mat') cvtColor(*mat, *mat, CV_BGR2Luv);
这就是我尝试转换回 MatExpr 的方式:
cvtColor(*mat, *mat, CV_BGR2Luv);
我尝试使用 & 代替 * 但不行。
我可以使用帮助将 cv_Mat_div_S
的输出转换回 MatExpr 以用于其他 C++ 函数进行测试...如果有人可能注意到 cv_Mat_div_S
包装器并验证是否有更好的编写方法,也许一个可以接受不止一种类型的 value 参数...但不使用模板,因为我正在将它编译为 .so 并且它应该进入 extern C
【问题讨论】:
【参考方案1】:cvtColor()的声明是
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn=0 );
MatExpr 可以隐式转换为 _InputArray。但是 MatExpr 无法隐式转换为 _OutputArray。 (更多见_InputArray和_OutputArray的源代码)
我试了一个测试代码sn-p:
Mat a0;
MatExpr a(a0);
cvtColor(*(&a), *(&a), COLOR_GRAY2BGR);
VS2012有编译错误:
error C2664: 'cv::cvtColor' : cannot convert parameter 2 from 'cv::MatExpr' to 'cv::OutputArray '
所以你需要指定一个有效的 OutputArray(例如 Mat 而不是 MatExpr)来保存转换后的 Luv 图像。
【讨论】:
感谢 *(&a) 是我所需要的……你很友善:)以上是关于如何将 OpenCV 的 MatExpr 的 C 包装器的指针输出转换回 MatExpr的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有c ++的opencv库将下图中的黑色像素更改为红色像素