2013-05-15 50 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