我想将我的代码匹配到给定的接口(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;
}
最佳答案
Mat1b
和Mat3b
只是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;
}