c++ - 如何将这个用于 OpenCV 的 MatExpr 的 C 包装器的指针输出转换回 MatExpr

标签 c++ c opencv

这是我对 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/

相关文章:

c++ - 将 Mat 对象转换为 double arr (OpenCV)

python - 检测目标图像上的弹孔

c++ - 一个互斥锁与多个互斥锁。线程池用哪个好?

c++ - *((unsigned char*) ... ) 是什么意思?

c - 自增后指针变为NULL

java - 什么是 C/C++ 等同于 Java 的异步任务

C编程: IP header ID is negative

C++/boost::scoped_lock:缺少编译器警告

使用 FindFirstFile/FindNextFile 删除文件夹中所有文件的 C++ 代码

c++ - findContours、contourArea 给出嵌套轮廓的错误。 "Assertion failed", "input array is not a valid matrix"