分配矩阵元素时出现未处理的异常

时间:2014-07-16 19:35:48

标签: c++ opencv

我有一个图像矢量定义如下:

 vector<Mat> src;

我想将此向量中的每个图像存储为Mat中的单独行。因此,结果Mat将是一个(n * m)矩阵,其中n是图像的数量,m是图像的维数。

Mat reData;
for(int i = 0; i < src.size(); i++) {
    if(src[i].empty()) {
        string error_message = format("Image number %d was empty, please check your input data.", i);
        CV_Error(CV_StsBadArg, error_message);
    }
    // Make sure data can be reshaped, throw a meaningful exception if not!
    if(src[i].total() != src[0].total()) {
        string error_message = format("Wrong number of elements in matrix #%d! Expected %d was %d.", i, src[0].total(), src[i].total());
        CV_Error(CV_StsBadArg, error_message);
    }
    Mat xi;
    if(src[i].isContinuous()) {
        xi= src[i].reshape(1, 1);
    } else {
        xi= src[i].clone().reshape(1, 1);
    }

    for(int j=0; j< src[0].total(); j++)
    {
        try{
        reData.at<float>(i,j)=xi.at<float>(0,j);
        }
        catch (cv::Exception const & e) { std::cerr<<"OpenCV exception: "<<e.what()<<std::endl; }
    }
}

运行我的代码时,运行reData.at<float>(i,j)=xi.at<float>(0,j);时会产生以下异常:

Unhandled exception at 0x000007f68e0d1e1d in code.exe: 0xC0000005: Access violation reading location 0x0000000001f5f000.

这个例外我做错了什么?

更新1

我在以前的代码中定义reData Mat的方式是错误的。我改变了定义:

Mat reData(src.size(), src[0].total(), src[0].type());

2 个答案:

答案 0 :(得分:0)

Mat xi 为空.Matr被声明为变量,但没有给它任何内存。这会导致访问冲突。我自己做了一百次同样的事情。

创建一个矩阵。类似的东西:

Mat xi =  Mat::ones(100, 100, CV_8U);

但要替换你自己的价值观。

答案 1 :(得分:0)

在搜索了几个主题之后,我发现了this question关于使用pca功能训练svm的问题。 第二个答案包含避免这些异常的好方法。实际上operator=是一个浅表副本,意味着没有实际复制数据。所以我改变了我的代码,它运行没有任何问题。

src[i].reshape(1, 1).copyTo(xi);

错误分配矩阵元素的方法:

xi= src[i].reshape(1, 1);