Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Mat和Mat1b/Mat3b之间的转换_C++_Opencv_Image Processing_Mat - Fatal编程技术网

C++ Mat和Mat1b/Mat3b之间的转换

C++ Mat和Mat1b/Mat3b之间的转换,c++,opencv,image-processing,mat,C++,Opencv,Image Processing,Mat,我想将我的代码匹配到给定的接口中。在我的类OperateImage中,我在所有方法中都使用cv::Mat格式。当将其放入使用cv::Mat3b并返回cv::Mat1b的Submin函数时,它不起作用。如何更改它,以便使用我的书面类?我相信一定有简单的转换,但我没有找到,我开始在opencv。事先谢谢你的帮助。如果有人能很快指出使用Mat1b/Mat3b代替Mat有意义时,他们将非常感激,他们的角色是什么? (我经常看到使用Mat的示例。) Mat1b和Mat3b只是Mat类型的两个预定义案例,在

我想将我的代码匹配到给定的接口中。在我的类OperateImage中,我在所有方法中都使用cv::Mat格式。当将其放入使用cv::Mat3b并返回cv::Mat1b的Submin函数时,它不起作用。如何更改它,以便使用我的书面类?我相信一定有简单的转换,但我没有找到,我开始在opencv。事先谢谢你的帮助。如果有人能很快指出使用Mat1b/Mat3b代替Mat有意义时,他们将非常感激,他们的角色是什么? (我经常看到使用Mat的示例。)


Mat1b
Mat3b
只是
Mat
类型的两个预定义案例,在
core.hpp
中定义如下:

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

回到您的案例,您的问题不应该归咎于它们的转换,而应该归咎于您定义
submin()
的方式以及如何使用它。
submin()
的输入参数是一个
const cv::Mat3b&
,但是,您试图修改它的头,将其更改为函数内部的
Mat1b

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

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

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

有人能回答:“……当使用Mat1b/Mat3b而不是Mat有意义时,他们的作用是什么?(我经常看到使用Mat的例子。)”@herohuyongtao当我们可以简单地使用
Mat
时,使用
Mat1b
的意义是什么?您使用的硬类型越多,编译器就会为您捕获越多的错误。此外,不能将图像(行、列)与cv::Mat、CVT颜色(rgb、灰色、cv::COLOR_BGR2GRAY);//请注意,这还考虑了权重。。。
Mat1b mat1b;
Mat3b mat3b;
Mat mat;

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

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