cvQueryFrame获取的图像和cvReleas…

来源:互联网 发布:hey jude 知乎 编辑:程序博客网 时间:2024/05/16 13:44
  在项目中需要从原始图像中截取感兴趣的子区域保存,于是利用cvCopy就写了个cvSubImage方法:

2010-08-26 10:19:

void cvSubImage(IplImage* srcImage, CvRect rect, IplImage*destImage)
{
//从图像orgImage中提取一块(rectInImage)子图像imgRect
 cvSetImageROI(srcImage,rect);//设置感兴趣的区域,则下面的操作都只针对该区域
 cvCopy(srcImage,destImage);
 cvResetImageROI(srcImage);//释放感兴趣区域,则整个图像被选中
}
对于一般的图像是没有问题的,然而从摄像头或文件中抓取的帧图像就出现了内存释放问题:

Unknown error code -49 (Deallocation error) 
in function cvFree_, \opencv\cxcore\src\cxalloc.cpp(129) 

后来将cvResetImageROI(srcImage);这句注释掉后,程序运行正常。感觉很奇怪,通过cvQueryFrame方法从摄像头或文件中抓取的帧图像是不能被释放和修改的,而cvResetImageROI好像也没用修改帧图像吧?看了opencv帮助文档里,发现可以用cvSetImageROI(image, cvRect( 0, 0, image->width,image->height));来代替cvResetImageROI方法,可是还是不行。没办法,只能在调用前先给cvQueryFrame得到的图像进行clone一份,然后作为参数传递到subImage方法中。
0 0
原创粉丝点击