【问题标题】:Dev C++ Crashing with OpenCV使用 OpenCV 导致 Dev C++ 崩溃
【发布时间】:2013-05-10 03:50:47
【问题描述】:

我正在编写一个简单的算法来将 RGB 图像从我的网络摄像头转换为 HSV,它可以正常编译,但是在执行 .exe 时会崩溃。

#include <cv.h>
#include <highgui.h>

int main(int argc, char** argv)
    {
     // Cria uma janela.
    cvNamedWindow("imagem", CV_WINDOW_AUTOSIZE);
    // Cria a conexão com a webcam.
    CvCapture *capture = cvCreateCameraCapture(0);
    // Variável que armazena o frame.
    IplImage *frame;
    IplImage* imghsv = cvCreateImage(cvGetSize(frame),8,3);
    while(1)
        {
        // Variável  recebe o frame.
        frame = cvQueryFrame(capture);
        if(!frame) break;
        cvCvtColor(frame, imghsv, CV_BGR2HSV);
        // Exibe o frame na janela.
        cvShowImage("imagem", frame);
        cvShowImage("hsv", imghsv);
        // Encerra o loop com uma tecla.
        if( cvWaitKey(100) == 27 ) break;
    }
    // Libera a memória utiliazada.
    cvReleaseImage(&frame);
    cvReleaseImage(&imghsv);
    cvReleaseCapture(&capture);
    // Fecha a janela.
    cvDestroyWindow("imagem");
    cvDestroyWindow("hsv");
}

没有“IplImage* imghsv = cvCreateImage(cvGetSize(frame),8,3);”行.exe 有效,但算法只显示我的图像。

我在 Windows XP SP3 中使用 Dev C++ 4.9.9.2 和 OpenCV 2.1。 对不起英语。 谢谢

问题已解决,将 IplImage *frame; 替换为 IplImage *frame=cvQueryFrame(capture);

【问题讨论】:

  • 你都一样..第二张图片不知道框架的大小。请看我的代码。

标签: c opencv windows-xp dev-c++


【解决方案1】:
IplImage *frame;
IplImage* imghsv = cvCreateImage(cvGetSize(frame),8,3);

您的frame 图像尚未分配,您不应在实际抓取帧之前创建 hsv 图像。

另请注意:

cvReleaseImage(&frame);

你不应该释放从cvQueryFrame() 抓取的图像,OpenCV 会处理它。

来自 OpenCV 文档:

函数 cvQueryFrame 从相机或视频文件中抓取一帧,解压缩并返回。这个函数只是 GrabFrame 和 RetrieveFrame 的组合,但在一次调用中。 用户不得发布或修改返回的图片。如果发生错误,返回值可能为 NULL。

CvCapture *capture = cvCreateCameraCapture(0);

您还应该检查cvCreateCameraCapture 的返回值,可能是NULL

IplImage* imghsv = cvCreateImage(cvGetSize(frame),8,3);

您应该使用IPL_DEPTH_8U 而不是8

【讨论】:

  • 崩溃的问题是因为第二张图片的初始化。请看看..
  • @2vision2 true,但这不是该代码中唯一的问题。
【解决方案2】:

此代码完美运行...您的代码中缺少一些行...看看。

#include <cv.h>
#include <highgui.h>

int main(int argc, char** argv)
    {
     // Cria uma janela.
    cvNamedWindow("imagem", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("hsv", CV_WINDOW_AUTOSIZE);  // added in orig code
    // Cria a conexão com a webcam.
    CvCapture *capture = cvCreateCameraCapture(0);
    // Variável que armazena o frame.
    IplImage *frame;
    IplImage* imghsv;
//    IplImage* imghsv = cvCreateImage(cvGetSize(frame),8,3);
    while(1)
        {
        // Variável  recebe o frame.
        frame = cvQueryFrame(capture);
        imghsv = cvCreateImage(cvGetSize(frame),8,3);  /// changed from orig code.
        if(!frame) break;
        cvCvtColor(frame, imghsv, CV_BGR2HSV);
        // Exibe o frame na janela.
        cvShowImage("imagem", frame);
        cvShowImage("hsv", imghsv);
        // Encerra o loop com uma tecla.
        if( cvWaitKey(100) == 27 ) break;
    }
    // Libera a memória utiliazada.
    cvReleaseImage(&frame);
    cvReleaseImage(&imghsv);
    cvReleaseCapture(&capture);
    // Fecha a janela.
    cvDestroyWindow("imagem");
    cvDestroyWindow("hsv");
}

【讨论】:

  • 您应该将答案集中在您在代码中实际更改的内容上。这将有助于了解 OP 中的问题。
  • @zakinster 同意!并修复。\
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2018-12-14
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2016-06-25
  • 2011-09-23
相关资源
最近更新 更多