【问题标题】:OpenCV and (not) returning IplImages, when is it okay, when not?OpenCV 和(不)返回 IplImages,什么时候可以,什么时候不行?
【发布时间】:2012-09-17 00:54:06
【问题描述】:

这样行不行吗,sn-p的代码当然不完整,只是说明我的意思:

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 指针错误消息。例如,如果我在函数中释放图像,然后立即重新创建它,仍然在该函数中,则可能会发生崩溃。

【问题讨论】:

  • 在您的 main() 中,您将指针“image”(指向 IplImage 结构...)的副本传递给函数 void draw(IplImage* image){}...inside绘图功能指向图像的指针的副本被取消引用并用于修改图像(在你的情况下画一条线......)所以不需要返回......如果你也返回那么副本也是返回不是在 main() 中创建的原始图像指针...
  • 感谢您对旋转图像的评论。我觉得我明白了。如果我返回图像,您所说的副本是否会增加工作内存并可能导致内存溢出? I.o.w.返回图片也可以吗?
  • 将指针的副本传递给 IplImage 并不意味着您正在传递图像的副本......它是指向图像的指针的副本......所以在 32 位机器上你的指针指向 Image大小为 4 字节...我认为如果您在循环中使用它也不会导致内存溢出..但是如果您在循环中使用 cvCreateImage 或 cvLoadImage 而没有 cvReleaseImage 那么它可能会导致内存溢出...
  • 是的,听起来合乎逻辑。感谢您的解释

标签: pointers opencv null return iplimage


【解决方案1】:

你不需要返回任何东西,但是你肯定需要检查失败!

问题是您没有安全地编码。在调用 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);
}

【讨论】:

  • 是的,在尝试查找潜在错误时进行更多检查可能会有所帮助。感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多