【问题标题】:conversion between Mat and Mat1b/Mat3bMat 和 Mat1b/Mat3b 之间的转换
【发布时间】:2021-08-08 05:56:07
【问题描述】:

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

【问题讨论】:

    标签: c++ opencv image-processing mat


    【解决方案1】:

    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 &amp;,但是,您正在尝试修改其标题以将其更改为函数内的 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 有什么意义?
    • 您使用硬类型的次数越多,编译器将为您捕获的错误就越多。此外,您不能将 image(row,col) 与 cv::Mat 一起使用,
    • cvtColor(rgb, 灰色, cv::COLOR_BGR2GRAY); // 请注意,这也考虑了权重...
    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2013-05-04
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多