How to capture still image from webcam on linux

前端 未结 4 794
逝去的感伤
逝去的感伤 2021-02-04 08:24

I am trying to write a C++/Qt program for linux, where I take a still image photo from a webcam, make some transformations to a photo (cropping, resizing, etc.), and save it to

相关标签:
4条回答
  • 2021-02-04 09:01

    What about this program?

    #include<opencv2/opencv.hpp>
    using namespace cv;
    int main()
    {
        VideoCapture webcam;
        webcam.open(0);
        Mat frame;
        char key;
    
        while(true)
        {
            webcam >> frame;
            imshow("My Webcam",frame);
            key = waitKey(10);
    
            if(key=='s')
            break;
        }
        imwrite("webcam_capture.jpg", frame);
        webcam.release();
        return 0;
    }
    

    This will capture a picture of maximum size allowed by your webcam. Now you can add effects or resize the captured image with Qt. And OpenCV is very very easy to integrate with Qt, :)

    0 讨论(0)
  • 2021-02-04 09:07

    Unfortunately the C4V2 calls in opencv did not work for still image capture with any camera I have tried out of the box using the UVC driver.

    To debug the issue I have been playing with trying to accomplish this with c code calling c4v2 directly.

    I have been playing with the example code found here. It uses the method of pulling frames from the video stream.

    You can compile it with:

    gcc -O2 -Wall `pkg-config --cflags --libs libv4l2` filename.c -o filename
    

    I have experimented with 3 logitech cameras. The best of the lot seems to be the Logitech C910. But even it has significant issues.

    Here are the problems I have encountered trying to accomplish your same task with this code.

    It works pretty much every time with width and height set to 1920x1080.

    When I query other possibilities directly from the command line using for example:

    v4l2-ctl --list-formats-ext
    

    and I try some of the other "available" smaller sizes it hangs in the select waiting for the camera to release the buffer.

    Also when I try to set other sizes directly from the command line using for example:

    v4l2-ctl -v height=320 -v width=240 -v pixelformat=YUYV
    

    Then check with

    v4l2-ctl -V
    

    I find that it returns the correct pixel format but quite often not the correct size.

    Apparently this camera which is listed on the UVC site as being UVC and therefore v4l2 compatible is not up to snuff. I suspect it is just as bad for other cameras. The other two I tried were also listed as compatible on the site but had worse problems.

    I did some more testing on the LogitechC910 after I posted this. I thought I would post the results in case it helps someone else out.

    I wrote a script to test v4l2 grabber code mentioned above on all the formats the camera claims it supports when it is queried with v4l2 here are the results:

    640x480 => Hangs on clearing buffer
    160x120 => Works
    176x144 => Works
    320x176 => Works
    320x240 => Works
    432x240 => Works
    352x288 => Works
    544x288 => Works
    640x360 =>  Works
    752x416 => Hangs on clearing buffer
    800x448 => Hangs on clearing buffer
    864x480 => Works
    960x544 => Works
    1024x576 => Works
    800x600 => Works
    1184x656 => Works
    960x720 => Works
    1280x720 => Works
    1392x768 => Works
    1504x832 => Works
    1600x896 => Works
    1280x960 => Works
    1712x960 => Works
    1792x1008 => Works
    1920x1080 => Works
    1600x1200 => Works
    2048x1536 => Works
    2592x1944 => Hangs on clearing buffer.
    

    It turns out that the default setting of 640x480 doesnt work and that is what trapped me and most others who have posted on message boards.

    Since it is grabbing a video frame the first frame it grabs when starting up may have incorrect exposure (often black or close to it). I believe this is because since it is being used as a video camera it adjusts exposure as it goes and doesnt care about the first frames. I believe this also trapped me and other who saw the first frame as black or nearly black and thought it was some kind of error. Later frames have the correct exposure

    It turns out that opencv with python wrappers works fine with this camera if you avoid the land mines listed above and ignore all the error messages. The error messages are due to the fact while the camera accepts v4l2 commands it doesnt respond correctly. So if you set the width it actually gets set correctly but it responds with an incorrect width.

    To run under opencv with python wrappers you can do the following:

    import cv2
    import numpy
    
    cap = cv2.VideoCapture(0)  #ignore the errors
    cap.set(3, 960)        #Set the width important because the default will timeout
                           #ignore the error or false response
    cap.set(4, 544)        #Set the height ignore the errors
    r, frame = cap.read()
    cv2.imwrite("test.jpg", frame)
    
    0 讨论(0)
  • 2021-02-04 09:18
    **Download And Install 'mplayer'** 
    mplayer -vo png -frames 1 tv://
    
    0 讨论(0)
  • 2021-02-04 09:21
    mplayer -vo png -frames 1 tv://
    

    might give a green screen output as the camera is not yet ready.

    mplayer -vo png -frames 2 tv://
    

    You can try increasing the number of frames and choose a number from which the camera gives correct images.

    0 讨论(0)
提交回复
热议问题