【问题标题】:Crash during running at cvCopyImage/cvResize在 cvCopyImage/cvResize 运行时崩溃
【发布时间】:2025-11-23 18:55:01
【问题描述】:

我正在使用 OpenCV 2.3 制作简单的网络摄像头程序,但被运行时错误卡住了。任何想法将不胜感激。

编译通过但在运行时出现以下错误(在下面代码中的“读取”函数中的 cvCopyImage/cvResize)。

错误:

OpenCV Error: Bad argument (Unknown array type) in cvarrToMat, file /usr/local/src/OpenCV/OpenCV-2.3.0/modules/core/src/matrix.cpp, line 641
terminate called after throwing an instance of 'cv::Exception'
  what():  /usr/local/src/OpenCV/OpenCV-2.3.0/modules/core/src/matrix.cpp:641: error: (-5) Unknown array type in function cvarrToMat

代码摘录:

#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

Mat* SampleClassA::dispImg = NULL;

int read()
{
    Mat* sharedImg;
    sharedImg = getFrame();
    if (sharedImg)
    {
        if (dispImg == NULL)
        {
            SampleClassA::dispImg = sharedImg;
        }
    cvCopyImage(sharedImg, SampleClassA::dispImg); // Crashes here.
    cvResize(sharedImg, SampleClassA::classifyImg); // Can crash here too when cvCopyImage is commented out.
    }
    sleep(100);
    return 1;
}

Mat* getFrame()
//IplImage* ReadRealTime::getFrame()
{
    if (!capture.isOpened()) // Actual capturing part is omitted here.
    {
        return NULL;
    }
    Mat frame;
    capture >> frame;
    return &frame;
}
</code>

我的猜测是我使用 Mat 或指针的方式有问题。我对 OpenCV 和 C/C++ 指针还是新手(我在另一个问题 Can't save an image captured from webcam (imwrite compile error with OpenCV 2.3) 中有一个有见地的评论,指出可能的“悬空指针”,但这次是一样的吗?)。

【问题讨论】:

    标签: c++ pointers opencv stack runtime-error


    【解决方案1】:

    问题是您返回一个指向堆栈分配变量的指针,该变量在函数结束时自动销毁。

      // ...
      Mat frame;
      capture >> frame;
      return &frame;
    } // frame destroyed is at the end of the function yet you return a pointer to it!
    

    您需要在堆上分配帧,以便它在函数结束后继续存在:

      // ...
      Mat* frame = new Mat(); // Maybe this needs parameters
      capture >> *frame;
      return frame;
    }
    

    请记住,您需要稍后再delete 帧,否则您的应用程序会泄漏内存。

    【讨论】: