關于使用Mat.at(i,j) = int 文法報錯,記憶體異常的原因。
首先是檢視異常如何發生的,單步調試可以發現再at方法裡有以下斷言:
_Tp& Mat::at(int i0, int i1)
{
CV_DbgAssert(dims <= 2);
CV_DbgAssert(data);
CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());
return ((_Tp*)(data + step.p[0] * i0))[i1];
}
其中斷言2要求這個Mat必須是有資料填充的,不能是空的。我一開始使用如下方法定義了一個空的Mat.
Mat mat;
mat.create(mat_a.size(),mat_a.type());
建立了一個指定大小和資料類型的空Mat,是以在調用at方法時報錯。
改變,建立一個以0填充的Mat結構就可以了。
Mat mat = Mat::zeros(mat_a.size(),mat_a.type());