2012-09-25 52 views
0

是它没关系这样做的,代码段当然是不完全的,只是为了说明我的意思:OpenCV和(不)返回IplImages,什么时候可以,什么时候没有?

void draw(IplImage* image){ 
cvLine(image,cvPoint(20,20),cvPoint(100,100),cvScalar(0,0,255),1);} 

int main(){ 

cvNamedWindow("preview",CV_WINDOW_AUTOSIZE); 
IplImage* image; 
image=cvCreateImage(cvSize(480,360),8,3); 
while(true){ 
draw(image); 
cvShowImage("preview",image); 
int ops=cvWaitKey(10) 
if ops!=-1 break;} 
cvReleaseImage(&image);cvDestroyWindow("preview");return 0; 
} 

还是会造成问题,如果我不返回IplImage结构是这样的:

IplImage* draw(IplImage* image){ 
    cvLine(image,cvPoint(20,20),cvPoint(100,100),cvScalar(0,0,255),1);return image;} 

好吧,我问的原因是,如果我不返回IplImage有时它的工作原理。然而,在其他情况下,我可能会收到某种空指针错误消息。例如,如果我释放函数中的图像,然后在此之后重新创建它,仍然处于该函数中,可能会发生崩溃。

+0

()你是将指针'image'(指向IplImage结构...)的副本传递给函数void draw(IplImage * image){} ...在绘制函数内部,指向图像的指针的副本被去参照并用于修改图像(在你的案例中画一条线......)所以不需要返回...如果你还回来,那么也是一个警察y返回不是在main()中创建的原始图像指针... –

+0

感谢您的评论rotate_image。我想我明白。如果我返回的图像,你说的副本增加工作内存,并可能导致内存溢出? I.o.w.会返回图像也没关系? – user1331044

+0

将指针的副本传递给IplImage并不意味着你正在传递图像的副本...其指向图像的指针的副本...所以在32位机器上,指向图像的指针的大小为4个字节。 ..我不认为这会导致内存溢出,如果你在循环中使用它也..但如果你使用cvCreateImage或cvLoadImage没有cvReleaseImage循环内,那么它可以导致内存溢出... –

回答

0

你不需要返回任何东西,但你绝对需要检查失败!

问题是你没有安全编码。在调用OpenCV函数时,您从不检查失败,这可能会导致draw()收到一个NULL指针作为参数,这可能会导致崩溃或其他一些奇怪的行为。

你应该做的第一件事就是开始防守编码:

IplImage* image = cvCreateImage(cvSize(480,360),8,3); 
if (!image) 
{ 
    // print error and quit 
} 

,它不会伤害添加一个安全检查自己的函数中:在主

void draw(IplImage* image) 
{ 
    if (!image) 
    { 
     // print error 
     return; 
    } 

    cvLine(image,cvPoint(20,20),cvPoint(100,100),cvScalar(0,0,255),1); 
} 
+0

是的,做更多的检查时可能会有帮助,当试图找到潜在的错误。感谢提示。 – user1331044

相关问题