Capturing a gray screen from a camera using OpenCV

I have a problem capturing images from my webcam (integrated in hp dv5). The only result is a gray screen. Here is the code:

#include "StdAfx.h" #include "cv.h" #include "highgui.h" #include <stdio.h> // 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; } 

He modified the code from the OpenCV wiki. I know that finding the camera this way is crazy, but it doesn’t work with -1 or 0. I added some additional properties (already commented), but it still didn’t work. Thanks in advance :) Greetings, Chris

+4
source share
3 answers

I encapsulate image capture in the 'Capture' class, maybe you can try. Below are main.cpp, capture.h and capture.cpp, enjoy it :)

main.cpp

 #include "capture.h" #include <string> 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 <cv.h> #include <cxcore.h> #include <highgui.h> #include <string> #include <vector> #include <iostream> 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<IplImage*> channelframeList; void captureNext(); ~Capture(); private: string m_fileName; vector<CvCapture*> 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]); } } 
+1
source

I was getting a gray screen when trying to use the camera and Python shell for OpenCV inside Windows.

Tracing with the debugger, I found that he discovered two camera interfaces called “Google Camera Adapter 0” and “Google Camera Adapter 1”.

I managed to fix the camera input:

  • Going to Add or Remove Programs and Uninstall the Google Talk Plugin
  • Disconnect the webcam and reconnect it so that new drivers are installed.

Now it works great for me.

(Note that I don’t know if there was an important step 1, and this could lead to a break in other things, so I would recommend you try the second step first ...)

+1
source

This is the wrong approach to solve your problem. So I'm going: first, isolate which camera you are currently working with. Which one? -1, 0, 1?

Second: please check the return function, please! If something is wrong, you will never know.

 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 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; 
0
source

Source: https://habr.com/ru/post/1344686/


All Articles