在 Mat 和 Mat1b/Mat3b 之间进行转换

conversion between Mat and Mat1b/Mat3b

本文关键字:之间 转换 Mat3b Mat Mat1b      更新时间:2023-10-16

我想将我的代码匹配到给定的接口中。在我的类中,在所有方法中,我都使用cv::Mat格式。当它放在使用 cv::Mat3b 并返回 cv::Mat1b 的 SubMain 函数中时,它不起作用。如何更改它以便我可以使用我的书面课程?我确信一定存在简单的转换,但是我没有找到,我从opencv开始。提前感谢您的帮助。如果有人能很快指出何时使用 Mat1b/Mat3b 而不是 Mat,他们将不胜感激,他们的角色是什么?(我总是看到使用 Mat 的例子。

cv::Mat1b SubMain(const cv::Mat3b& img)
{
    OperateImage opImg(img);
    opImg.Trafo(img); // being used as reference in my methods
    return img;
}

Mat1bMat3b只是Mat类型的两个预定义情况,它们在core.hpp中定义如下:

typedef Mat_<uchar> Mat1b;
...
typedef Mat_<Vec3b> Mat3b;

也就是说,垫子和Mat1b/Mat3b之间的转换应该是非常自然/自动的:

Mat1b mat1b;
Mat3b mat3b;
Mat mat;
mat = mat1b;
mat = mat3b;
mat1b = mat;
mat3b = mat;

回到您的案例,您的问题不应归因于他们的转化,而应归因于您定义SubMain()的方式以及使用它的方式。SubMain() 的输入参数是一个const cv::Mat3b &,但是,您正在尝试修改其标头以将其更改为函数内部的Mat1b

如果您将其更改为可以,例如:

cv::Mat1b SubMain(const cv::Mat3b& img)
{
    cv::Mat tmp = img.clone();
    OperateImage opImg(tmp);
    opImg.Trafo(tmp);
    return tmp;
}