Mat和Mat1b/Mat3b之间的转换

5

我希望将我的代码与给定的接口匹配。在我的类OperateImage中,我在所有方法中使用cv :: Mat格式。当将其放入使用cv :: Mat3b并返回cv :: Mat1b的SubMain函数中时,它无法正常工作。我如何更改它,以便可以使用我编写的类?我确定必须存在简单的转换,但我没有找到,我正在开始使用opencv。提前感谢您的帮助。如果有人能简要指出何时使用Mat1b / Mat3b而不是Mat,以及它们的角色,我将非常感激。

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

6

Mat1bMat3bMat类型的两个预定义情况,这些类型在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&amp; ,但是您正在尝试修改其标题以在函数内部将其更改为Mat1b

如果您将其更改为以下内容,则不会出现问题:

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

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

1
有人能回答一下吗:“………什么时候使用Mat1b/Mat3b而不是Mat更有意义,它们的作用是什么?(我总是看到使用Mat的例子。)” - Ruchir
1
@herohuyongtao,使用Mat1b的意义是什么?我们为什么不能直接使用Mat呢? - Hadi GhahremanNezhad
你使用硬类型越多,编译器就会为你捕获更多的错误。此外,你不能在cv::Mat中使用image(row,col)。 - midjji
cvtColor(rgb, grey, cv::COLOR_BGR2GRAY); // 注意这也会处理权重... - midjji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接