【西电|视觉媒体通信】摄像头采集(SDK采集)

目的

直接调用已有采集SDK,将采集数据进行存储,可改变分辨率、色彩空间。

工具

Visual Studio、OpenCV、C++。

代码

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <sstream>

using namespace std;
using namespace cv;

int main()
{
    cv::VideoCapture cameraCapture(0);
    cameraCapture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
    cameraCapture.set(cv::CAP_PROP_FRAME_WIDTH, 1920);
    cameraCapture.set(cv::CAP_PROP_FRAME_HEIGHT, 1080);
    // 打开设备索引为0的默认摄像头,编码格式为MJPG,画面尺寸为(1920, 1080)
    // MJPG将每一帧压缩为JPEG格式,在保持高质量图像的同时降低设备压力

    if (!cameraCapture.isOpened())
    {
        std::cerr << "ERROR!! Unable to open camera\n";
        return -1;
    }

    double fps = cameraCapture.get(cv::CAP_PROP_FPS);
    if (fps == 0.0)
    {
        fps = 30.0;
    }
    // 若无法获取帧率,则将帧率设置为30,增加稳健性

    cv::VideoWriter videoWriter;
    std::string filename = "写入文件位置";
    int fourcc = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
    bool isColor = true;
    videoWriter.open(filename, fourcc, fps, Size(1920, 1080), isColor);
    // 写入MJPG编码,AVI封装,30帧,1920x1080,彩色视频

    if (!videoWriter.isOpened())
    {
        std::cerr << "ERROR!! Unable to open video file for writing\n";
        return -1;
    }

    cv::Mat imageCaptured;

    while (true)
    {
        cameraCapture >> imageCaptured;

        if (imageCaptured.empty())
        {
            std::cerr << "ERROR!! Captured empty frame\n";
            break;
        }
        // 硬件问题、帧丢失、帧率不匹配都会导致空帧的产生

        cv::imshow("SDKCapture", imageCaptured);
        videoWriter.write(imageCaptured);

        if (cv::waitKey(1) >= 0)
        {
            break;
        }
    }

    cameraCapture.release();
    videoWriter.release();
    cv::destroyAllWindows();

    return 0;
}

原理

1、打开摄像头,设置编码格式和画面大小;

2、设置写入文件的编码格式和画面大小,本程序生成的是AVI格式视频文件;

3、显示摄像头采集到的画面,并写入指定的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值