我必须初始化一个多通道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;
}
}
答案 0 :(得分:0)
由于这个Mat_
构造函数,我试图使用OpenCV的Vec_
和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);