这可能是错误的做事方式,但我将一个数组从LabView传递到我的C ++函数中,作为一个简单的char数组。然后我创建一个OpenCV图像并将指针指向我传递的数据。在函数的最后我使用cvReleaseImage删除所有OpenCV图像,是否会删除原始指针的数据?
另外,是否有更好的方法来执行修改原始图像的就地操作?
EXPORT void smoothImg(uchar * the_img, int size_x, int size_y)
{
CvSize size;
size.height = size_y ;
size.width = size_x;
IplImage * img1 = cvCreateImageHeader(size, IPL_DEPTH_8U, 1);
img1->imageData = (char *)the_img;
img1->imageDataOrigin = img1->imageData;
IplImage * img2 = cvCreateImage(size, IPL_DEPTH_8U, 1);
// this is because I want my end result to be in img1 (same data as my the_img
memcpy(img2->imageData,img1->imageData,sizeof(char)*size_x*size_y);
cvSmooth(img2,img1,CV_BLUR, 5,5);
cvReleaseImage(&img1 );
cvReleaseImage(&img2 );
}
注意:它似乎不会影响我的图像,因为结果是正确的,但我想确保在我把它放到任何地方之前这是正确的
谢谢!
答案 0 :(得分:4)
cvRelease释放图像使用的内存,因此在调用后,您将无法再引用该图像。
但是 - 在openCV存在之前,内存可能无法用于其他程序,它依赖于系统处理内存的方式,实际上当系统为其他应用程序返回免费内存时。
编辑:对不起我没回答你的问题。有一个标志你可以传递给cvCreateImage()来说 - 我拥有内存,不要删除它。该标志略微取决于您拥有的opencv版本
答案 1 :(得分:1)
我实际上发现了一篇关于OpenCV的内存分配/释放的非常有趣的文章,我想这意味着我应该使用cvReleaseImageHeader,因为我只是试图删除标题。