2013-05-15 56 views
1

我正在写一个简单的算法来将RGB图像从我的网络摄像头转换为HSV,它的编译良好,但执行.exe时崩溃。Dev C++与OpenCV崩溃

#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(帧),8,3);”该.exe的作品,但算法只显示我的形象。

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

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

+0

雅两者都是相同的。第二个图像doest知道帧的大小。请看看我的代码。 – 2vision2

回答

2
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

+0

感谢您的提示。 – renandame

+0

崩溃的问题是由于第二个映像的初始化。请看看.. – 2vision2

+0

@ 2vision2是真的,但这不是代码中唯一的问题。 – zakinster

0

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

#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"); 
} 
+0

您应该将您的答案专注于您在代码中实际*更改的内容。这将有助于看到OP中出现了什么问题。 – zakinster

+0

@zakinster同意!并修复。\ – 2vision2