2013-12-16 60 views
2

這是我的代碼我複製/粘貼here無法從凸輪捕捉視頻2.4.7

#include "opencv2/opencv.hpp" 

using namespace cv; 

int main(int, char**) 
{ 
    VideoCapture cap(0); // open the default camera 
    if(!cap.isOpened()) // check if we succeeded 
     return -1; 

    Mat edges; 
    namedWindow("edges",1); 
    for(;;) 
    { 
     Mat frame; 
     cap >> frame; // get a new frame from camera 
     cvtColor(frame, edges, CV_BGR2GRAY); 
     GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
     Canny(edges, edges, 0, 30, 3); 
     imshow("edges", edges); 
     if(waitKey(30) >= 0) break; 
    } 
    // the camera will be deinitialized automatically in VideoCapture destructor 
    return 0; 
} 

但我得到這個錯誤:


OpenCV error: Assertion failed (scn==3 || scn==4) 
in unknown function, file ..\..\..\..\opencv\modules\imgproc\src\color.cpp, line 3737 

我使用的是Windows 7 x64,Visual Studio 2008,OpenCV 2.4.7

可能是什麼問題?

編輯:

它有時它的工作原理,有時沒有。

編輯2:

我編輯VideoCapture帽(0);cv :: VideoCapture cap(0);然後,我重建我的解決方案並運行它。它第一次工作,我試圖第二次運行,它給了我同樣的錯誤。

EDIT 3:

我甚至已編輯爲(;;)

for(;;) 
    { 
     Mat frame; 
     cap >> frame; // get a new frame from camera 
     imshow("edges", frame); 
     if(waitKey(30) >= 0) break; 
    } 

這次我得到另一個錯誤:


OpenCV error: Assertion failed (size.width>0 && size.height>0) 
in unknown function, file ..\..\..\..\opencv\modules\highgui\src\window.cpp, line 261 

我想問題是imshow

+0

您能告訴我程序中發生了什麼錯誤嗎?如在,它是否出現在'cap >> frame'或'cvtColor'之後?請放下斷點並回到我身邊。 – scap3y

+0

@ scap3y我把cout <<「aaaaa」<< endl;後蓋>>框架;和cout <<「bbbb」<< endl;在cvtColort之後,它會打印「aaaaa」,然後停止:) – torayeff

+0

@ scap3y還有另一個錯誤(size.width> 0 && size.height> 0) – torayeff

回答

-2

我在我的環境中測試了你的代碼(Win XP 32位操作系統,VS2008,OpenCV2.4.7)。它每次都能正常工作。你也可以這樣做:

IplImage* frame,*edges; 
CvCapture* pcapture = cvCreateCameraCapture(0); 
cvNamedWindow("edges",CV_WINDOW_AUTOSIZE); 
while (1) 
{ 
    frame = cvQueryFrame(pcapture); 
    if (!frame) break; 
    edges = cvCreateImage(cvGetSize(frame),8,1); 
    cvCvtColor(frame, edges, CV_BGR2GRAY); 
    cvSmooth(edges,edges,CV_GAUSSIAN,7,7,1.5,1.5); 
    cvCanny(edges,edges,0,30,3); 
    cvShowImage("edges",edges); 
    cvReleaseImage(&edges); 
    if (cvWaitKey(30)>=0) break; 
} 
cvReleaseCapture(&pcapture); 
cvDestroyWindow("edges"); 

你可以嘗試一下,不管你的環境是否也有問題。 希望對你有一點幫助!

+2

哦,請求*不要*指出任何人過時的c-api,請甚至停止使用它! – berak

2

我得到類似的問題。我通過將cap >> frame之後的所有內容放入if語句來解決此問題:

for(;;) 
    { 
     Mat frame; 
     cap >> frame; // get a new frame from camera 
     if (!frame.empty()) { 
      cvtColor(frame, edges, CV_BGR2GRAY); 
      GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
      Canny(edges, edges, 0, 30, 3); 
      imshow("edges", edges); 
     } 
     if(waitKey(30) >= 0) break; 
    }