如何将 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在窗口上显示图像

如何使用带有c ++的opencv库将下图中的黑色像素更改为红色像素

c ++如何将视频序列放入OpenCV中的vector<Mat>?

如何将一个点附加到opencv c中的另一个点

如何使用opencv C ++将3D矩阵划分为2D矩阵束

如何从 c# web 服务调用 c++ Opencv 项目?