初始化多通道OpenCV垫

问题描述 投票:0回答:1

我必须初始化一个多通道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 <= 4)”。这似乎我们可以初始化最多4个通道的值

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个回答
0
投票

我试图使用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);
© www.soinside.com 2019 - 2024. All rights reserved.