OpenCV开发笔记(五):OpenCV读取与操作摄像头

若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/100799289

目录

前言

Demo演示

OpenCV读取摄像头

OpenCV设置属性

Demo函数源码

拓展:视频属性

工程模板:对应版本号v1.3.0


 

OpenCV开发专栏

OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境

OpenCV开发笔记(一):OpenCV介绍、编译

OpenCV开发笔记(二):cvui交互界面

OpenCV开发笔记(三):OpenCV图像的概念和基本操作

OpenCV开发笔记(四):OpenCV图片和视频数据的读取与存储

OpenCV开发笔记(五):OpenCV读取与操作摄像头

OpenCV开发笔记(六):OpenCV基础数据结构、颜色转换函数和颜色空间

OpenCV开发笔记(七):OpenCV基础图形绘制

OpenCV开发笔记(八):OpenCV常用操作之计时、缩放、旋转、镜像

OpenCV开发笔记(九):OpenCV区域图像(ROI)和整体、局部图像混合

OpenCV开发笔记(十):OpenCV图像颜色通道分离和图像颜色多通道混合

持续补充中…

 

    OpenCV开发笔记(五):OpenCV读取与操作摄像头

前言

       OpenCV读取摄像头。

 

Demo演示

  • 1/2调整亮度
  • 3/4调整对比度
  • 5/6调整饱和度
  • 7/8调整色调
  • 9/0调整增益
  • -/=调整曝光度

 

OpenCV读取摄像头

       OpenCV可以读取摄像头的图像,主要是流媒体,读取的类是cv::VideoCapture,输入参数为摄像头参数:

  • 当使用USB摄像头时,输入0,1,2…等对应参数
  • 当使用网络摄像头时,直接输入url地址。

OpenCV设置属性

       使用cv::VieoCapture时,先生成一个实例,然后设置属性,此时有一点要注意,当读取的图片原本只有400*300时,设置高宽800*600是无效的(即超过输入的尺寸设置是无效的),然后不断使用>>读取,读取就显示。

cv::VideoCapture capture; 
if(!capture.open(0))
{
    qDebug() << __FILE__ << __LINE__  << "Failed to open camera: 0";
}else{
    qDebug() << __FILE__ << __LINE__  << "Succeed to open camera: 0";
}
while(true)
{
    cv::Mat mat;
    capture >> mat;
    int keyValue = cv::waitKey(1)
}

       同时经过测试发现,此次打开的是上次的设置结果,所以可以判断opencv实际是直接操作了设备的相关属性,所以调整的属性需要摄像头设备支持(USB摄像头),并不是单纯的认为拿到图片后opencv自己对图像进行处理。

 

Demo函数源码

void OpenCVManager::testCamera()
{
    cv::VideoCapture capture;
    // 插入USB摄像头默认为0
    if(!capture.open(0))
    {
        qDebug() << __FILE__ << __LINE__  << "Failed to open camera: 0";
    }else{
        qDebug() << __FILE__ << __LINE__  << "Succeed to open camera: 0";
    }
    capture.set(cv::CAP_PROP_FRAME_WIDTH , 800);
    capture.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
    // 初始亮度为0,范围为-50 ~ 50,范围区间100
    double brightness = 0;
    double contrast = 0;
    double saturation = 0;
    double hue = 0;
    double gain = 0;
    double exposure = 0;
    brightness  = capture.get(cv::CAP_PROP_BRIGHTNESS);
    contrast    = capture.get(cv::CAP_PROP_CONTRAST);
    saturation  = capture.get(cv::CAP_PROP_SATURATION);
    hue         = capture.get(cv::CAP_PROP_HUE);
    gain        = capture.get(cv::CAP_PROP_GAIN);
    exposure    = capture.get(cv::CAP_PROP_EXPOSURE);
    qDebug() << "=========================";
    qDebug() << "初始亮度:" << brightness;
    qDebug() << "初始对比度:" << contrast;
    qDebug() << "初始饱和度:" << saturation;
    qDebug() << "初始色调:" << hue ;
    qDebug() << "初始增益:" << gain;
    qDebug() << "初始曝光度:" << exposure;
    qDebug() << "=========================";
    while(true)
    {
        cv::Mat mat;
        capture >> mat;
        if(!mat.empty())
        {
            cv::putText(mat, QString("brightness: %1").arg(brightness).toStdString(),
                     cvPoint(0, 30), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255));
            cv::putText(mat, QString("  contrast: %1").arg(contrast  ).toStdString(),
                    cvPoint(0, 60), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255));
            cv::putText(mat, QString("saturation: %1").arg(saturation).toStdString(),
                    cvPoint(0, 90), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255));
            cv::putText(mat, QString("       hue: %1").arg(hue       ).toStdString(),
                    cvPoint(0, 120), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255));
            cv::putText(mat, QString("      gain: %1").arg(gain      ).toStdString(),
                    cvPoint(0, 150), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255));
            cv::putText(mat, QString("  exposure: %1").arg(exposure  ).toStdString(),
                    cvPoint(0, 180), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255));
            cv::putText(mat, QString("press ESC out").toStdString(),
                    cvPoint(0, 210), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255));
            cv::imshow(_windowTitle.toStdString(), mat);
        }
        int keyValue = cv::waitKey(1);
        switch (keyValue)
        {
        case 27:    // ESC
            capture.release();
            return;
            break;
        case '1':       // 增加亮度
            brightness += 1;
            capture.set(cv::CAP_PROP_BRIGHTNESS, brightness);
            qDebug() << __FILE__ << __LINE__ << "调整亮度:" << brightness;
            break;
        case '2':       // 降低亮度
            brightness -= 1;
            capture.set(cv::CAP_PROP_BRIGHTNESS, brightness);
            qDebug() << __FILE__ << __LINE__ << "调整亮度:" <<  brightness;
            break;
        case '3':       // 增加对比度
            contrast += 1;
            capture.set(cv::CAP_PROP_CONTRAST, contrast);
            qDebug() << __FILE__ << __LINE__ << "调整对比度:" <<  contrast;
            break;
        case '4':       // 降低对比度
            contrast -= 1;
            capture.set(cv::CAP_PROP_CONTRAST, contrast);
            qDebug() << __FILE__ << __LINE__ << "调整对比度:" <<  contrast;
            break;
        case '5':       // 增加饱和度
            saturation += 1;
            capture.set(cv::CAP_PROP_SATURATION, saturation);
            qDebug() << __FILE__ << __LINE__ << "调整饱和度:" <<  saturation;
            break;
        case '6':       // 降低饱和度
            saturation -= 1;
            capture.set(cv::CAP_PROP_SATURATION, saturation);
            qDebug() << __FILE__ << __LINE__ << "调整饱和度:" <<  saturation;
            break;
        case '7':       // 增加色调
            hue += 1;
            capture.set(cv::CAP_PROP_HUE, hue);
            qDebug() << __FILE__ << __LINE__ << "调整色调:" <<  hue;
            break;
        case '8':       // 降低色调
            hue -= 1;
            capture.set(cv::CAP_PROP_HUE, hue);
            qDebug() << __FILE__ << __LINE__ << "调整色调:" <<  hue;
            break;
        case '9':       // 增加增益
            gain += 1;
            capture.set(cv::CAP_PROP_GAIN, gain);
            qDebug() << __FILE__ << __LINE__ << "调整增益:" <<  gain;
            break;
        case '0':       // 降低增益
            gain -= 1;
            capture.set(cv::CAP_PROP_GAIN, gain);
            qDebug() << __FILE__ << __LINE__ << "调整增益:" <<  gain;
            break;
        case '-':       // 增加曝光
            exposure += 1;
            capture.set(cv::CAP_PROP_EXPOSURE, exposure);
            qDebug() << __FILE__ << __LINE__ << "调整曝光:" <<  exposure;
            break;
        case '=':       // 降低曝光
            exposure -= 1;
            capture.set(cv::CAP_PROP_EXPOSURE, exposure);
            qDebug() << __FILE__ << __LINE__ << "调整曝光:" <<  exposure;
            break;
        default:
            break;
        }
    }
}

 

拓展:视频属性

       OpenCV中提供了一个函数,来获取视频文件的一些属性:

cvGetCaptureProperty(Capture* cap,int property_index);

       相机的画,可以直接使用cv::VedioCapture::get()。

       同样也提供了对应的设置函数:

int cvSetCaptureProperty(CvCapture* capture, int property_id, double value);

       相机的画,可以直接使用cv::VedioCapture::set()。

       注意:目前这个函数对视频文件只支持以下三个属性

  • CV_CAP_PROP_POS_MSEC:从文件开始的位置计算,单位为毫秒
  • CV_CAP_PROP_POS_FRAMES:当前帧的索引(基于0
  • CV_CAP_PROP_POS_AVI_RATIO视频文件的相对位置0=开始,1=结束)

       /写属性涉及许多层。沿着这条链可能会发生一些意想不到的结果。行为是否有效取决于设备硬件、驱动程序和api后端。

       以下是OpenCV中视频属性cv::VideoCaptureProperties的宏定义:

序号

属性枚举

描述

1

CAP_PROP_POS_MSEC

当前文件位置,单位为毫秒

2

CAP_PROP_POS_FRAMES

下一步要解码/捕获的帧的位置,基于0的索引

3

CAP_PROP_POS_AVI_RATIO

视频文件的相对位置:0=开始,1=结束

4

CAP_PROP_FRAME_WIDTH

视频流的帧宽度

5

CAP_PROP_FRAME_HEIGHT

视频流的帧高度

6

CAP_PROP_FPS

帧率

7

CAP_PROP_FOURCC

编解码器的4字符代码。请参阅

VideoWriter::fourcc

8

CAP_PROP_FRAME_COUNT

视频文件中的帧数

9

CAP_PROP_FORMAT

VideoCapture::Retrieve()返回的Mat对象的格式

10

CAP_PROP_MODE

表示当前捕获模式的后端特定值

11

CAP_PROP_BRIGHTNESS

图像的亮度(仅适用于支持的相机)

12

CAP_PROP_CONTRAST

图像对比度(仅适用于照相机)

13

CAP_PROP_SATURATION

图像饱和度(仅适用于相机)

14

CAP_PROP_HUE

图像的色调(仅适用于相机)

15

CAP_PROP_GAIN

图像增益(仅适用于支持的摄像机)

16

CAP_PROP_EXPOSURE

曝光(仅适用于支持的摄像机)

17

CAP_PROP_CONVERT_RGB

指示图像是否应转换为rgb的布尔标志

18

CAP_PROP_WHITE_BALANCE_BLUE_U

当前不受支持

19

CAP_PROP_RECTIFICATION

立体声摄像机的校正标志(注:目前仅受DC1394 V 2.x后端支持

20

CAP_PROP_MONOCHROME

 

21

CAP_PROP_SHARPNESS

 

22

CAP_PROP_AUTO_EXPOSURE

DC1394:由相机进行曝光控制,用户可以使用此功能调整参考水平

23

CAP_PROP_GAMMA

 

24

CAP_PROP_TEMPERATURE

 

25

CAP_PROP_TRIGGER

 

26

CAP_PROP_TRIGGER_DELAY

 

27

CAP_PROP_WHITE_BALANCE_RED_V

 

28

CAP_PROP_ZOOM

 

29

CAP_PROP_FOCUS

 

30

CAP_PROP_GUID

 

31

CAP_PROP_ISO_SPEED

 

32

CAP_PROP_BACKLIGHT

 

33

CAP_PROP_PAN

 

34

CAP_PROP_TILT

 

35

CAP_PROP_ROLL

 

36

CAP_PROP_IRIS

 

37

CAP_PROP_SETTINGS

弹出“视频/摄像机筛选器”对话框(注意:当前仅支持DShow后端。属性值被忽略)

38

CAP_PROP_BUFFERSIZE

 

39

CAP_PROP_AUTOFOCUS

 

40

CAP_PROP_SAR_NUM

样本纵横比:num/den(num)

41

CAP_PROP_SAR_DEN

样本纵横比:num/den(den)

42

CV__CAP_PROP_LATEST

未定义CV_DOXYGEN时可用

 

工程模板:对应版本号v1.3.0

       对应版本号v1.3.0


原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/100799289

发布了227 篇原创文章 · 获赞 237 · 访问量 40万+

猜你喜欢

转载自blog.csdn.net/qq21497936/article/details/100799289