我想将我的代码匹配到给定的接口(interface)。在类OperateImage的所有方法中,我都使用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;

就是说,Mat和Mat1b/Mat3b之间的转换应该是很自然的/自动的:
Mat1b mat1b;
Mat3b mat3b;
Mat mat;

mat = mat1b;
mat = mat3b;
mat1b = mat;
mat3b = mat;

回到您的情况,您的问题不应归因于其转换,而应归因于SubMain()的定义方式和使用方式。 SubMain()的输入参数是const cv::Mat3b &,但是,您试图修改其 header 以将其更改为函数内的Mat1b

如果将其更改为,例如:
cv::Mat1b SubMain(const cv::Mat3b& img)
{
    cv::Mat tmp = img.clone();

    OperateImage opImg(tmp);
    opImg.Trafo(tmp);
    return tmp;
}

10-08 09:11