OpenCV和(不)返回IplImages,什么时候可以,什么时候没有?

时间:2012-09-25 13:33:51

标签: pointers opencv null return iplimage

可以做这样的事情,代码片段当然不完整,只是为了表明我的意思:

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,有时它会起作用。但是,在其他情况下,我可能会收到某种NULL指针错误消息。例如,如果我在函数中释放图像,然后在此之后重新创建它,仍然在该函数中,可能会发生崩溃。

1 个答案:

答案 0 :(得分: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);
}
相关问题