2011-11-23 71 views
2

試圖對視頻上的幀執行灰度轉換,但當我到達cvCvtColor時不斷獲取As thesis失敗錯誤。 有沒有人看到我的錯誤在哪裏?Opencv視頻幀給我一個錯誤

IplImage *frame, *frame_copy = 0; 

// capture frames from video 
CvCapture *capture = cvCaptureFromFile("lightinbox1.avi"); 
//Allows Access to video propertys 
cvQueryFrame(capture); 

//Get the number of frames 
int nframe=(int) cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT); 

    //Name window 
cvNamedWindow("video:", 1); 

    //start loop 
for(int i=0;i<nframe;i++){ 
//prepare capture frame extraction 
cvGrabFrame(capture); 
cout<<"We are on frame "<<i<<"\n"; 
//Get this frame 
frame = cvRetrieveFrame(capture); 
con2txt(frame); 
    frame_copy = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U,frame->nChannels); 
//show and destroy frame 
    cvCvtColor(frame,frame,CV_RGB2GRAY); 

cvShowImage("video:",frame); 
cvWaitKey(33);} 
cvReleaseCapture(&capture); 

}

回答

5

實際上,問題是cvCvtColor()CV_RGB2GRAY預計輸出圖像與nChannels == 1

爲了解決這個問題,你必須調整你的複製過程:

frame_copy = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1); 
cvCvtColor(frame, frame_copy, CV_RGB2GRAY); 
+0

那是偉大的,但爲什麼當我添加frame_copy1 = cvCreateImage(cvSize(幀 - >寬度,幀 - >高),IPL_DEPTH_16S, 1); cvSobel(frame_copy,frame_copy1,2,2,3); cvShowImage( 「視頻」,frame_copy1);它是否顯示我一個空白屏幕 – user1016950

+0

這是另一個問題,我建議你在新線程中提問。但我懷疑它與圖像的深度有關,產生的圖像被存儲在'IPL_DEPTH_16S'上,但原始圖像可能是'IPL_DEPTH_8U'。 – karlphillip

2

你調用cvCvtColor具有相同幀的源和目標圖像。

這是不可能的,因爲cvCvtColor必須更改圖像中的通道數以便將rgb轉換爲灰色。

請撥打cvtColor將新圖片作爲目的地。