这是我的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 {}
答案 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图像。