使用OpenCV从相机捕获灰色屏幕

我从网络摄像头捕获图像时出现问题(内置于hp dv5)。 唯一的结果是灰屏。 这是代码:

#include "StdAfx.h" #include "cv.h" #include "highgui.h" #include  // A Simple Camera Capture Framework int main() { CvCapture* capture; for (int i = -1;i < 100;i++) { capture = cvCaptureFromCAM( i ); if( !capture ) { fprintf( stderr, "ERROR: capture is NULL \n" ); } else { break; } } //cvSetCaptureProperty( capture, CV_CAP_PROP_FPS,15); //cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 160 ); //cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 120 ); // Create a window in which the captured images will be presented cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE ); // Show the image captured from the camera in the window and repeat while( 1 ) { // Get one frame IplImage* frame = cvQueryFrame( capture ); cvGrabFrame(capture); frame = cvRetrieveFrame(capture); if( !frame ) { fprintf( stderr, "ERROR: frame is null...\n" ); getchar(); break; } else { fprintf( stderr, "OK\n" ); } cvShowImage( "mywindow", frame ); // Do not release the frame! //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version), //remove higher bits using AND operator int c = cvWaitKey(100); } // Release the capture device housekeeping cvReleaseCapture( &capture ); cvDestroyWindow( "mywindow" ); return 0; } 

它是来自OpenCV维基的修改代码。 我知道以这种方式找到相机很疯狂,但它不能用-1或0.我添加了一些额外的属性(已经注释)但是它无论如何都没有用。 在此先感谢:)问候,克里斯

我将图像捕获封装到“捕获”类中,也许你可以尝试一下。 下面是main.cpp,capture.h和capture.cpp,尽情享受:)

main.cpp中

 #include "capture.h" #include  using namespace std; int main(int argc, char* argv[]) { // --- read file --- // //Capture capture("test.wmv", windowSize, windowSize); // --- read camera --- // CvSize windowSize = cvSize(640, 480); Capture capture(2, windowSize, windowSize); while (1) { capture.captureNext(); for (int i = 0; i < capture.channelNum; ++i) { ostringstream oss; oss << i; string winName = "WINDOW-" + (oss.str()); cvShowImage(winName.c_str(), capture.channelframeList[i]); } int c = cvWaitKey(30); if ( (char) c == 27 ) { // 'Esc' to terminate break; } } return 0; } 

caputure.h

 #ifndef _CAPTURE_H_ #define _CAPTURE_H_ #include  #include  #include  #include  #include  #include  using namespace std; enum VIDEO_TYPE { CAMMERA = 0, VIDEOFILE }; class Capture { public: Capture(int num, CvSize dispSize, CvSize resolutionSize); Capture(string fileName, CvSize dispSize, CvSize resolutionSize); int channelNum; vector channelframeList; void captureNext(); ~Capture(); private: string m_fileName; vector m_channelList; CvSize m_resolutioSize; CvSize m_displaySize; void initChannelList(VIDEO_TYPE type); void initChannelImgList(CvSize sz); IplImage* getNextVideoFrame(CvCapture* pCapture); }; #endif 

capture.cpp

 #include "capture.h" Capture::Capture(int num, CvSize dispSize, CvSize resolutionSize) { channelNum = num; m_fileName = ""; m_resolutioSize = resolutionSize; m_channelList.resize(channelNum); channelframeList.resize(channelNum); initChannelList(CAMMERA); initChannelImgList(dispSize); } Capture::Capture(string fileName, CvSize dispSize, CvSize resolutionSize) { channelNum = 1; m_fileName = fileName; m_resolutioSize = resolutionSize; m_channelList.resize(channelNum); channelframeList.resize(channelNum); initChannelList(VIDEOFILE); initChannelImgList(dispSize); } void Capture::captureNext() { for (int i = 0; i < channelNum; ++i) { IplImage* nextFrame = getNextVideoFrame(m_channelList[i]); IplImage* channelFrame = channelframeList[i]; cvResize(nextFrame, channelFrame); } } void Capture::initChannelList(VIDEO_TYPE type) { if (type == CAMMERA) { for (int i = 0; i < channelNum; ++i) { m_channelList[i] = cvCreateCameraCapture(i); //set resolution cvSetCaptureProperty(m_channelList[i], CV_CAP_PROP_FRAME_WIDTH, m_resolutioSize.width); cvSetCaptureProperty(m_channelList[i], CV_CAP_PROP_FRAME_HEIGHT, m_resolutioSize.height); if ( !(m_channelList[i]) ) { cout << "failed to initialize video capture" << endl; exit(EXIT_FAILURE); } } } else if (type == VIDEOFILE) { const char* fileNameChar = m_fileName.c_str(); m_channelList[0] = cvCreateFileCapture(fileNameChar); if ( !(m_channelList[0]) ) { cout << "failed to initialize video capture" << endl; exit(EXIT_FAILURE); } } } void Capture::initChannelImgList(CvSize sz) { for (int i = 0; i < channelNum; ++i) channelframeList[i] = cvCreateImage(sz, 8, 3); } IplImage* Capture::getNextVideoFrame(CvCapture* pCapture) { IplImage* nextFrame = cvQueryFrame(pCapture); if (!nextFrame) { cout << "failed to get a video frame" << endl; exit(EXIT_FAILURE); } return nextFrame; } Capture::~Capture() { for (int i = 0; i < channelNum; ++i) { cvReleaseImage( &(channelframeList[i]) ); cvReleaseCapture(&m_channelList[i]); } } 

当我试图在Windows中使用相机和OpenCV的Python包装器时,我得到一个灰色屏幕。

通过调试器进行跟踪,发现它发现了2个名为“Google Camera Adapter 0”和“Google Camera Adapter 1”的摄像头接口。

我能够通过以下方式修复相机输入:

  1. 转到“添加/删除程序”并卸载“Google Talk插件”
  2. 拔下网络摄像头并重新插入,以便安装新的驱动程序。

它现在对我来说很好。

(请注意,我不知道第1步是否重要,可能会导致其他因素中断,所以我建议您先尝试第2步…)

这是解决问题的错误方法。 所以我在这里:首先,确定哪个camera_id当前正在工作。 哪一个? -1,0,1?

第二:请检查function的返回,求求你! 如果出现问题,你永远不会知道。

 CvCapture* capture = NULL; if ((capture = cvCaptureFromCAM(-1)) == NULL) { fprintf(stderr, "ERROR: capture is NULL \n"); return -1; } cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE); cvQueryFrame(capture); // Sometimes needed to get correct data while (1) { IplImage* frame = cvQueryFrame(capture); // check return { fprintf( stderr, "ERROR: cvQueryFrame failed\n"); break; } // At this point you already have the frame! There's no need to // repeat the thing 10x with cvGrabFrame and cvRetrieveFrame. // You are probably sabotaging yourself doing this multiple times. cvShowImage("mywindow", frame); // Do not release the frame! int key = cvWaitKey(10); if (key == 0x1b) break; } cvReleaseCapture(&capture); cvDestroyWindow("mywindow"); return 0;