windows下使用camera(opencv方式)

news/2024/9/19 10:43:05

  一.  opencv支持读取摄像头,支持视频录制或显示, 具体代码

    //1. 初始化视频录制文件
    String recFileName = std::to_string(count) + "_rec.avi";
    int wfourcc = VideoWriter::fourcc('M', 'J', 'P', 'G');
    writer = VideoWriter(recFileName, wfourcc, CAP_FPS, Size(CAP_WIDTH, CAP_HEIGHT));

    //2. 初始化摄像头
    int apiBackend = CAP_DSHOW;
    cap = VideoCapture(count + apiBackend);

    //cap.set(CAP_PROP_SETTINGS, 1);
    int w = cap.get(CAP_PROP_FRAME_WIDTH);
    int h = cap.get(CAP_PROP_FRAME_HEIGHT);    
    int fourcc = cap.get(CAP_PROP_FOURCC);
    qDebug() << "camera origin parameters: fourcc:" << fourcc<<", width: "<<w<<", height:"<< h;

    cap.set(CAP_PROP_FRAME_WIDTH, CAP_WIDTH);
    cap.set(CAP_PROP_FRAME_HEIGHT, CAP_HEIGHT);
    cap.set(CAP_PROP_FOURCC, VideoWriter::fourcc('M', 'J', 'P', 'G'));
    //cap.set(CAP_PROP_FOURCC, VideoWriter::fourcc('H', '2', '6', '4'));
    
    w = cap.get(CAP_PROP_FRAME_WIDTH);
    h = cap.get(CAP_PROP_FRAME_HEIGHT);
    fourcc = cap.get(CAP_PROP_FOURCC);
    qDebug() << "camera modified parameters: fourcc:" << fourcc << ", width: " << w << ", height:" << h;
    
    cap.set(CAP_PROP_FOCUS, 0);
    //cap.set(CAP_PROP_FPS, CAP_FPS);    
    //cap.set(CAP_PROP_BACKLIGHT, 1);
    
    if (!cap.isOpened())
    {
        QString massage = QString("camera %1 opens fail!").arg(count);
        qDebug() << massage;
        return;
    }
    else {
        qDebug() << "camera " << count << " start successfully!";
    }

   //3. 循环读取摄像头帧内容,并用opencv的imshow展示

    while (cap.isOpened() && captureEnabled) {                
        Mat img;
        QString begin_time = QDateTime::currentDateTime().toString("hh:mm:ss.zzz");

        cap >> img;
        QString captured_time = QDateTime::currentDateTime().toString("hh:mm:ss.zzz");

        if (!img.cols || !img.rows) {
            qDebug() << "Error thread " << count << ", begin time: " << begin_time << ", captured_time: " << captured_time;
            continue;
        }

        if (recordEnabled) {
            writer << img;
        }

        QString write_time = QDateTime::currentDateTime().toString("hh:mm:ss.zzz");

        Mat img_dst;
        cv::resize(img, img_dst, cv::Size(CAP_WIDTH / 2, CAP_HEIGHT / 2), 0, 0, cv::INTER_AREA);

#if 0   //4. 发送到其它UI线程做显示
        QImage image = Mat2QImage(img_dst);
        emit thread_update_image(count, image);
#else //4. 直接用opencv的imshow做显示
        String captureWindow = "capture_win_" + std::to_string(count);
        imshow(captureWindow, img_dst);
        int waitTimeMs = 1000 / CAP_FPS - 10;  //encode consume 10 ms
        waitKey(waitTimeMs);
#endif
    }

    //5. 关闭摄像头,释放recorder

    if (!captureEnabled) {
        QString current_time = QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
        qDebug() << "thread " << count << ", close capture and writer, at time : " << current_time;
        writer.release();
        cap.release();
    }
 


http://www.niftyadmin.cn/n/4598700.html

相关文章

JS TypeError:*is undefined

JS在解析JSON数据时&#xff0c;操作生疏可能犯的错误。 success:function(data){ if(data "failure"){ alert("请求出错,请刷新页面再操作"); } var res eval(data); var msgList res[0].msgList; var pgInfo res[0].pageInfo; var page ""…

windows下使用camera (ffmpeg dshow方式)

方法概要&#xff1a;先读取camera支持的mode&#xff0c;然后用ffmpeg dshow打开camera并解码压缩流 一. 用相关代码读取本地camera当前支持的输出mode&#xff0c;方便后续选择mode来打开camera&#xff1a; bool EnumerateCameras(vector<int>& camIdx) { …

根据匹配词个数排序

法一&#xff1a; select title,(case when CHARINDEX(Log4net,title)>0 then 1 else 0 end )(case when CHARINDEX(oracle,title)>0 then 1 else 0 end ) counts from T_KNOWLEDGE where title like %Log4net% or title like %oracle% order by counts desc 法二&#x…

流媒体服务器原理和架构解析

原文&#xff1a; https://blog.csdn.net/xuheazx/article/details/52020933 一个完整的多媒体文件是由音频和视频两部分组成的&#xff0c;H264、Xvid等就是视频编码格式&#xff0c;MP3、AAC等就是音频编码格式&#xff0c;字幕文件只是附加文件。目前大部分的播放器产品对于…

ffmepg 音频重采样

因为业务需要&#xff0c;直播推流过程中&#xff0c;pcm的音频需要从48k采样率&#xff0c;重采样到44.1k&#xff0c;然后再编码程aac&#xff0c;封装成rtmp推送出去。这里只描述如何做pcm数据的重采样。 整个过程中&#xff0c;音频输入&#xff1a;PCM/S16/48000/2 重采…

webrtc 学习要点

总结一下webrtc的关键技术&#xff0c;如果搞懂了以下问题&#xff0c;webrtc应该算基本掌握了 1. 通话建立的大概流程。 a&#xff09;收集建立点对点的 IP candidates &#xff08;local&#xff0c; srvReflex&#xff0c;peerReflex&#xff0c; relay&#xff09;&#…

linux bash启动停止脚本,第二弹

本文是之前的watchdate的shell脚本的改进wdate,同样先上图:1)脚本加入chkconfig管理head -5 /etc/init.d/wdate #!/bin/bash #auth:chentp0601qq.com # #wdate Start/Stop the watchdate daemon # # chkconfig: 2345 71 55chkconfig --add wdate2)开始贴代码#!/bin/bas…

《实时控制软件设计》第一个编程作业

题目&#xff1a; 第一步&#xff1a; 写一个根据输入坐标生成一个平面图形&#xff08;点、线段和三角形&#xff09;并能对该几何图形进行平移和旋转操作的命令行 “软件”&#xff0c;要求&#xff1a;a) 通过命令行输入图形的名称&#xff0c;端点数&#xff08;1为点&…