如何将OpenCV的MatExpr的这个C包装器的指针输出转换回MatExpr

时间:2014-03-24 02:19:34

标签: c++ c opencv

这是我的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包装并验证是否有更好的方法写它,可能是一个可以接受多个类型的值参数...但不使用模板,因为我将它编译为.so并且它应该进入extern C {}

1 个答案:

答案 0 :(得分:1)

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图像。