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