这是我对 OpenCV 的 MatExpr“/”运算符的 C 包装器
MatExpr* cv_Mat_div_S(Mat* m1, int m2) {
return new MatExpr(*m1 / m2);
}
我想我把这部分做对了,我将 frame 转换为指针以在 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
包装器并验证如果有更好的方法来编写它,也许可以接受不止一种类型的值参数...但不使用模板,因为我正在将它编译为 .so 并且它应该放在 extern C 中{}
最佳答案
cvtColor()的声明是
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn=0 );
MatExpr 可以隐式转换为 _InputArray。但是 MatExpr 无法隐式转换为 _OutputArray。 (查看 _InputArray 和 _OutputArray 的源代码了解更多)
我尝试测试代码片段:
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 图像。
关于c++ - 如何将这个用于 OpenCV 的 MatExpr 的 C 包装器的指针输出转换回 MatExpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22600005/