原创
摄像机标定过程中涉及到的内存管理问题总结
2009-2-21 23:26
3086
5
5
分类:
软件与OS
这4天里边,这个内存的东西搞得人心惶惶啊!都怪自己以前在学语言的时候不好好学,不过话又说回来,电脑上我可以用管理器来查看内存的占有情况,甚至有专门去看内存 的工具,单片机有吗? 单片机出现内存泄漏,或者其他的内存问题的时候,又会出现什么情况,可想而知,对于这些系统内存的管理都很重要。 先说说内存泄漏的原因,其实很简单,就是开辟的空间,你没有释放,在我这里跟可恶的就是不但没释放 而且还要对其一直重新开辟,这样我在任务管理器可以看到在每次加载图片后,程序的内存就增加好多 虽然知道问题是内存的释放,也知道解决的办法,可是开始的时候我以为是new以后一定要释放所以加了标志在适当的时候才进行开辟以及释放,但是还是一样。今晚在一个同学的帮助下终于找到问题所在,原来是CVLOADimage函数自己开辟空间,但是我又没有在使用后即使的释放,所以结果就是这样了 这里还要提到的就是程序的调试,学会调试很重哟。此时我想起 单片机如果出现内存的泄漏会有什么后果,而且单片机又没有任务管理器可以去查看内存的占有情况 if (m_CalibrateFlag.is_LoadOver && !m_CalibrateFlag.is_CalibrateOver) { m_Corner.corner_count = new int[m_CalibratePram.NImages]; m_Corner.ImgCornerCoordinate= new CvPoint2D32f[m_CalibratePram.NImages*NPoints]; m_Corner.WodCornerCoordinate= new float[m_CalibratePram.NImages*NPoints*3]; m_CameraPram.err = new double[m_CalibratePram.NImages]; m_CameraPram.intrinsic_matrix = cvCreateMat(3,3,CV_32FC1); //内参数矩阵 m_CameraPram.distortion_coeffs = cvCreateMat(1,4,CV_32FC1); //形变参数 m_CameraPram.rotation_vectors = cvCreateMat(m_CalibratePram.NImages,3,CV_32FC1); //旋转向量 m_CameraPram.translation_vectors = cvCreateMat(m_CalibratePram.NImages,3,CV_32FC1); //平移向量 m_CameraPram.points_counts = cvCreateMat(m_CalibratePram.NImages,1,CV_32SC1); //视图数目 m_CameraPram.object_points = cvCreateMat(m_CalibratePram.NImages*NPoints,3,CV_32FC1);//世界坐标系中角_点的坐标 m_CameraPram.image_points = cvCreateMat(m_CalibratePram.NImages*NPoints,2,CV_32FC1);//检测到的坐标点坐标 } //如果空间开辟,检测空间是不是够,如果图片的数量改变,释放空间,再去开辟新的空间;如果不变,不在开辟空间 //参数改变 if ( m_CalibrateFlag.is_LoadOver && m_CalibrateFlag.is_CalibrateOver) { delete []m_Corner.corner_count; m_Corner.corner_count = NULL; delete []m_Corner.ImgCornerCoordinate; m_Corner.ImgCornerCoordinate = NULL; delete []m_Corner.WodCornerCoordinate; m_Corner.WodCornerCoordinate = NULL; delete []m_CameraPram.err; m_CameraPram.err = NULL; cvReleaseMat(&m_CameraPram.distortion_coeffs); cvReleaseMat(&m_CameraPram.intrinsic_matrix); cvReleaseMat(&m_CameraPram.rotation_vectors); cvReleaseMat(&m_CameraPram.translation_vectors); cvReleaseMat(&m_CameraPram.points_counts); cvReleaseMat(&m_CameraPram.image_points); cvReleaseMat(&m_CameraPram.object_points); m_Corner.corner_count = new int[m_CalibratePram.NImages]; m_Corner.ImgCornerCoordinate= new CvPoint2D32f[m_CalibratePram.NImages*NPoints]; m_Corner.WodCornerCoordinate= new float[m_CalibratePram.NImages*NPoints*3]; m_CameraPram.err = new double[m_CalibratePram.NImages]; m_CameraPram.intrinsic_matrix = cvCreateMat(3,3,CV_32FC1); //内参数矩阵 m_CameraPram.distortion_coeffs = cvCreateMat(1,4,CV_32FC1); //形变参数 m_CameraPram.rotation_vectors = cvCreateMat(m_CalibratePram.NImages,3,CV_32FC1); //旋转向量 m_CameraPram.translation_vectors = cvCreateMat(m_CalibratePram.NImages,3,CV_32FC1); //平移向量 m_CameraPram.points_counts = cvCreateMat(m_CalibratePram.NImages,1,CV_32SC1); //视图数目 m_CameraPram.object_points = cvCreateMat(m_CalibratePram.NImages*NPoints,3,CV_32FC1);//世界坐标系中角_点的坐标 m_CameraPram.image_points = cvCreateMat(m_CalibratePram.NImages*NPoints,2,CV_32FC1);//检测到的坐标点坐标 } //******************************************************************* //这里出现过问题,就是因为分不清啥时候该去开辟空间,啥时候不该去开辟空间 /********************************************************************/ //图片载入 //cvNamedWindow("image",1); for(int CurrentImage=0;CurrentImage < m_CalibratePram.NImages;CurrentImage++) { //加载图片 // 代码。。。。 cvReleaseImage(&m_GrbImage);// 就是这里的问题,加了一句话,内存的占有量一下子减少了好多 } } 再来说说NEW和DELTE的问题 开始的时候我在程序的结束的时候,总是有xxxx终止的对话框弹出来,我看了好久找不出问题所在,虽然知道估计是哪里的内存没有释放,结果没找到,倒是发现,自己释放的是自己没有开辟的空间,呵呵呵,所以在使用动态内存管理的时候也要助于这个问题 new和delete一定要配对使用,不然的话,不是内存泄漏就是出现xxx让你终止程序 俺还要说说自己的对opencv的使用,能看源码的话 就去看看源码,这次如果看了cvloadimage的源码 可能就不会让我郁闷半天 内存的管理还有很多 这次使用中的一点教训
文章评论(0条评论)
登录后参与讨论