2014年7月7日
这几天自己去写程序时候,遇到的opencv问题,问题看似很小,但是找起来是很头疼的。
自己解决的方法:(相同的问题,但是解决方法不同,因代码而异)目前自己总结:
问题描述:我是针对视频中的每张图进行操作,以src=cvQueryFrame(capture); 我在最后直接释放了cvReleaseImage(&src);
1.错误出处:最后一句cvReleaseImage(&src);
2.问题解决:
cvQueryFrame从摄像头或文件中抓取一帧并且返回这一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。抓取后,capture被指向下一帧,可用cvSetCaptureProperty调整到合适的帧.
与cvLoadImage不同的是,cvLoadImage为图像分配内存空间,而cvQueryFrame使用已经在cvCapture结构中分配好的内存。这样的话就不用通过cvReleaseImage来释放内存,当cvCapture结构释放后,每一帧图像对应的内存空间即会释放。
注意:cvQueryFrame返回的指针总是指向同一块内存。建议cvQueryFrame后拷贝一份。而且返回的帧需要FLIP后才符合opencv的坐标系。若返回值为NULL,说明到了视频的最后一帧。
3. 总结
A.认真学习opencv函数,否则用的时候混淆导致错误。
B.在创建图像申请内存时,一定要记得去释放内存,否则内存会爆的。