我在使用cv::merge()
功能时遇到问题。调用它会导致断言错误:CV_Assert( 0 <= _dims && _dims <= CV_MAX_DIM )
。我在调试器中运行程序,我注意到_dims
未初始化(每个运行不同的随机值)。有时程序执行会传递断言并发生内存访问错误(在void Mat::copySize(const Mat& m)
中)。下面是调用cv::merge
过程中涉及的2个成员函数(mImages成员包含有效数据,当我显示单个通道图像[灰度]程序正确执行时。如果您对如何包含数据有疑问请参考到http://www.cs.toronto.edu/~kriz/cifar.html上的cifar10数据描述,但正如我所说,程序执行期间的所有输入数据都是有效的):
cv::Mat DataPackage::formatSingleChannelImage(std::vector<unsigned const char> const &channelData, DataPackage::RGB channel)
{
unsigned channelBeg = 0;
switch (channel)
{
case DataPackage::RGB::RED:
channelBeg = 0;
break;
case DataPackage::RGB::GREEN:
channelBeg = 1024;
break;
case DataPackage::RGB::BLUE:
channelBeg = 2 * 1024;
break;
default:
break;
}
cv::Mat singleChannelImg = cv::Mat::zeros(colsN, rowsN, CV_8UC1);
std::vector<unsigned char> tmp;
for (unsigned col = 0; col < colsN; ++col)
{
for (unsigned row = 0; row < rowsN; ++row)
{
singleChannelImg.at<unsigned char>(row, col) = (unsigned const char)channelData[channelBeg+(col*rowsN + row)];
}
}
return singleChannelImg;
}
cv::Mat DataPackage:: makeImage(unsigned id)
{
cv::Mat image = cv::Mat::zeros(colsN, rowsN, CV_8UC3);
std::vector<cv::Mat> channels;
channels.push_back(formatSingleChannelImage(mImages[id], DataPackage::RGB::RED));
channels.push_back(formatSingleChannelImage(mImages[id], DataPackage::RGB::GREEN));
channels.push_back(formatSingleChannelImage(mImages[id], DataPackage::RGB::BLUE));
cv::merge(channels, image);
return image;
}
提前致谢