OpenCV開發筆記(五):讀取與操作攝像頭

歡迎技術交流和幫助,提供IT相關服務,索要源碼請聯繫博主QQ: 21497936,若該文爲原創文章,未經允許不得轉載
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/100799289

目錄

前言

Demo演示

OpenCV讀取攝像頭

OpenCV設置屬性

Demo函數源碼

拓展:視頻屬性

工程模板:對應版本號v1.3.0


 OpenCV開發專欄

OpenCV開發筆記(一):OpenCV介紹、編譯

OpenCV開發筆記(二):cvui交互界面

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

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