此问题是由于opencv库中cxcore中一处行模板大小内存固定长度为4096限定造成的。
通过代码跟踪发现:
1 在bmp解码器中定位到问题(在grfmt_bmp.cpp文件中)
bool BmpDecoder::readData( Mat& img )
{
…
AutoBuffer<uchar> _src, _bgr; //问题源处,此处大小为4096
…
uchar *src = _src, *bgr = _bgr;
…
/************************* 24 BPP ************************/
case 24:
for( y = 0; y < m_height; y++, data += step )
{
m_strm.getBytes( src, src_pitch );
//问题代码所在此处只要24位bmp图超过宽度4096就会内存溢出
if(!color)
icvCvt_BGR2Gray_8u_C3C1R( src, 0, data, 0, cvSize(m_width,1) );
else
memcpy( data, src, m_width*3 );
}
result = true;
break;
}
2 分析AutoBuffer模板定义(在cxcore.hpp文件中)
template<typename _Tp, size_t fixed_size=4096/sizeof(_Tp)+8> class CV_EXPORTS AutoBuffer
{
…..
protected:
_Tp* ptr;
size_t size;
_Tp buf[fixed_size];
}
3 初步解决方法
1)在声明处将
template<typename _Tp, size_t fixed_size=4096/sizeof(_Tp)+8> class CV_EXPORTS AutoBuffer
将大小改为自己需要的大小:
template<typename _Tp, size_t fixed_size=(5120 * 3)/sizeof(_Tp)+8> class CV_EXPORTS AutoBuffer
2)或者在调用处将
AutoBuffer<uchar,> _src, _bgr;
替换为:
AutoBuffer<uchar, (5120 * 3)/sizeof(uchar)+8> _src, _bgr;