Mat和Mat1b / Mat3b之间的转换

时间:2015-06-14 15:20:00

标签: c++ opencv image-processing mat

我想将我的代码与给定的界面相匹配。在我的类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;
}

2 个答案:

答案 0 :(得分:6)

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 &,但是,您尝试修改其标题,将其更改为函数内的Mat1b

如果将其更改为例如:

,则可以
cv::Mat1b SubMain(const cv::Mat3b& img)
{
    cv::Mat tmp = img.clone();

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

答案 1 :(得分:0)

对于在尝试转换类型时遇到此问题的任何人,如果您不需要或想要创建新变量,也可以投射它们。

void convertToMat(const cv::Mat3b& src) {
    Mat test = (Mat)src;
    // Test is now cv::Mat
}

void convertToMat3b(const cv::Mat& src) {
    Mat3b test = (Mat3b)src;
    // Test is now cv::Mat3b
}