【问题标题】:Initialize a Multi-Channel OpenCV Mat初始化多通道 OpenCV Mat
【发布时间】:2023-03-30 14:50:01
【问题描述】:

我必须初始化一个多通道 OpenCV 矩阵。我正在创建这样的多通道矩阵

cv::Mat A(img.size(), CV_16SC(levels));

其中levels 是矩阵中的通道数,可以是 20 - 300 之间的任何值。我无法初始化这个矩阵,只能为零。

如果我像这样初始化矩阵

cv::Mat A(img.size(), CV_16SC(levels), Scalar(1000));

我收到一条错误消息,指出“cv::scalarToRawData 中的断言失败 (cn

OpenCV 中是否有其他可用的方法来初始化这个多通道矩阵,或者我必须手动初始化这些值?

编辑: 我已经完成了以下操作来初始化这个多通道矩阵。希望这对遇到相同问题的人有所帮助

for (int j = 0; j < img.rows; ++j) for (int i = 0; i < img.cols; ++i)
{
    short *p = A.ptr<short>(j) +(short)i*levels;
    for (int l = 0; l < levels; ++l)
    {
        p[l] = 1000;
    }
}

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    我试图使用 OpenCV 的 Vec_Mat_ 模板类,因为这个 Mat_ 构造函数。不幸的是,我找不到可行的解决方案。所有尝试都会导致相同的错误,您已经遇到过。因此,我的猜测是,底层的 OpenCV 实现不支持此类操作,即使是自定义派生类型也是如此。

    当然,您有自己的想法来解决这个问题。不过,我想提供我能想到的最短(希望也是最有效)的解决方案:

    const int levels = 20;
    const cv::Size size = cv::Size(123, 234);
    
    const cv::Mat proto = cv::Mat(size, CV_16SC1, 1000);
    
    std::vector<cv::Mat> channels;
    for (int i = 0; i < levels; i++)
        channels.push_back(proto);
    
    cv::Mat A;
    cv::merge(channels, A);
    

    【讨论】:

    • 这篇文章没有回答问题,所以投反对票。
    猜你喜欢
    • 1970-01-01
    • 2022-07-10
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多