OpenCV 4.1 高速读取USB摄像头 1080P

#include "opencv2/core.hpp"
#include "opencv2/core/ocl.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/videoio/registry.hpp>
#include <string.h>
#include <iostream>
#include <thread>
#include "timetool.h"

//#define EN_OCL

using namespace std;
using namespace cv;

String windowTitle = "VGA Capture Demo";

void flush(VideoCapture& camera)
{
    int delay = 0;
    int framesWithDelayCount = 0;

    while (1)
    {
        high_resolution_clock::time_point start_point = high_resolution_clock::now();
        camera.grab();
        auto dulation = high_resolution_clock::now() - start_point;
        std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds> (dulation);
        delay = ms.count();
        std::cout <<  ms.count() << std::endl;
        if(delay > 30)
        {
        std::cout << "buffer is empty!" << std::endl;
            break;
        } else {
        std::cout << "buffer is not empty!" << std::endl;
    }
    }
}

int main(int argc, char** argv)
{
    VideoCapture cap;
    cap.open(0); //打开摄像头

    if(!cap.isOpened())
    {
        cout << "Open Camera Failed!" << endl;
        return -1;
    }

    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    std::cout << "fps=" << cap.get(CAP_PROP_FPS) << std::endl;
    cap.set(CAP_PROP_BUFFERSIZE, 3);

    cap.set(CAP_PROP_FRAME_WIDTH, 1920);
    cap.set(CAP_PROP_FRAME_HEIGHT, 1080);
    //cap.set(CAP_PROP_FOURCC, CAP_OPENCV_MJPEG); //次行设置无效,切记!!!使用下面的方式
    int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');
    cap.set(CAP_PROP_FOURCC, codec);
    int fourcc = cap.get(CAP_PROP_FOURCC);
    char tmp[5];
    memset(tmp, 0, 5);
    memcpy(tmp, &fourcc, 4);
    std::cout << "fourcc=" <<tmp << std::endl;
    cap.set(CAP_PROP_FPS, 30);
    std::cout << "fps=" << cap.get(CAP_PROP_FPS) << std::endl;
#ifdef EN_OCL
    ocl::setUseOpenCL(true);
    UMat image;
#else
    Mat image;
#endif

    namedWindow(windowTitle, WINDOW_NORMAL);
    moveWindow(windowTitle, 400, 300);

    flush(cap);
    bool endProgram = false;
    while (!endProgram)
    {
        cap >> image;
        imshow( windowTitle, image );
        char c = (char)waitKey( 1 );
        if ((c == 'q') | (c == 'Q') | (c == 27))
        {
            endProgram = true;
        }
        if ((c == 's') | (c == 'S'))
        {
            //save the picture
            static int index = 0;
            string image_name = to_string(index++) + ".png";
            imwrite(image_name, image);
        }
    }
    cap.release();

   destroyAllWindows();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值