今天遇到了一个情况,使用OpenCV 2.1 的cvLoadImage 函数load一张1902*1080的彩色bmp 时,会报内存错误,但是load 1张512*512的彩色bmp就不会有这个问题。换成OpenCV2.3.1,就不存在这种情况。后来才发现是OpenCV2.1本身存在的bug,内存访问越界。具体描述与修正见:
http://www.cnblogs.com/hanming/archive/2011/01/21/2276210.html
patch for file:
src/highgui/grfmt_bmp.cpp (line 198)
change from:
AutoBuffer _src, _bgr;
if( (m_bpp != 24 || !color) )
_src.allocate(src_pitch + 32);
to:
AutoBuffer _src, _bgr;
// bug fix, otherwise memcpy in getBytes in file bitstrm.cpp will crash
if ( 4096 < src_pitch)
{
_src.allocate( src_pitch + (8 * nch) );
_bgr.allocate( src_pitch + (8 * nch) );
}
if( (m_bpp != 24 || !color) )
_src.allocate(src_pitch + 32);
修改完之后,需要重新编译OpenCV2.1.我用的是VS2008,具体操作流程见: http://wiki.opencv.org.cn/index.php/VC_2008_Express%E4%B8%8B%E5%AE%89%E8%A3%85OpenCV2.0/2.1
注意,如果以前使用过CMake编译过OpenCV,请先点击File菜单下的Delete Cache ,删除缓存文件,以免配置得不到更新。
因为很久以前编译的OpenCV2.1,后来中间又安装了Python2.7,导致我在ReBuild OpenCV工程时报了一个错:Cannot Open File 'python27_d.lib'
解决方法还挺多,我直接采用了一个简单的处理方法(http://blog.csdn.net/lbsswu/article/details/6292775):
从网上下一个python27_d.lib,放到D:/Program Files/Microsoft Visual Studio 9.0/VC/lib文件夹下(根据自己装VS2008的位置做相应的调整),再次编译即可成功。
另外,每次添加环境变量时,都需要注销或重启系统才能生效。
我的体会是:旧库就是会存在很多小bug,记得以前做大作业时发现OpenCV2.1还有个经典的bug就是视频处理时无法准确定位到某一帧视频,但是OpenCV1.0却没这个问题,后续新库不知道完善了没有(这个bug的具体描述可参见:http://blog.csdn.net/friedvan/article/details/6195777)。
总的来说假如不是开发过程中版本过度很麻烦的话,应该优先使用最新库啊。