windows下使用camera(opencv方式)

  一.  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();
    }
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章