我有一个图像矢量定义如下:
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());
答案 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);