OpenCv合并。使用cv :: merge时未初始化的_dims成员

时间:2016-01-17 23:08:36

标签: c++ opencv vector

我在使用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;
}

提前致谢

0 个答案:

没有答案