OpenCv實時設定攝像頭引數/獲得攝像頭引數值的方法論
一、提醒:
在開始,攝像機修改之旅之前,出于負責任的態度,我想我需要提醒以下三點:
一、一旦你修改了這些引數,你的攝像頭就被改動了,這是永久的,
而相機初始值一般是公司相對當前找的相對綜合最優引數,所以最好先記住相機這項引數的初始值在修改,否則切勿隨意修改這些引數,
二、修改引數并不是你修改多少就是多少,這因為是修改底層硬體的引數,所以需要硬體支持你才能修改,比如:你就不能修改FPS=520,
三、有些引數你測驗的這部相機是不能修改的,道理同上,修改是需要硬體支持的,支持修改才能修改,
單獨一次的修改很常見,比如修改一下飽和度=50,就是capture.set(CAP_PROP_SATURATION,50);//注意:capture是實體化后的
這樣就修改成功了,
相關函式功能解釋:
capture.get(CAP_PROP_GAMMA)//只有一個引數
功能:回傳攝像機capture的GAMMA值,想要回傳其他值就修改里面的引數,一些引數在Opencv4中引數名在最下文給出了一部分,
capture.set(CAP_PROP_GAMMA, Gamma)
功能:將攝像機capture的GAMMA值修改為Gamma,
以上就是這兩個函式的格式
二、連續修改怎么辦呢?
這里我需要引入一個Opencv自帶函式:createTrackbar()
對這個函式不是很清楚的可以看這篇博客:https://blog.csdn.net/qq_51116518/article/details/119734918?spm=1001.2014.3001.5501
三、連續修改測驗程式
攝像機createTrackbar()連續修改模板:
第一步:全域定義相機和createTrackbar第三個引數也就是帶&引數的,
第二步:手敲回呼函式,
第三步:在回圈while(1)外執行createTrackbar()函式,
第四步:在回圈內初始化每一個onChange()函式為(0,0);
現在理論完備,“魔法”開始!
測驗程式的功能:
1、利用滑動條實時修改飽和度、Gramma、亮度,
2、摁1,列印當前程式飽和度、Gramma、亮度到控制臺
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#define WINDOW_NAME1 "【原始圖視窗】"
VideoCapture capture;//注意:多維同時控制需要相機和
int saturation = 60;
int Gamma = 72;
int light = 50;
void onSaturationChange(int , void* )
{
capture.set(CAP_PROP_SATURATION, saturation);
}
void onGammaChange(int , void* )
{
capture.set(CAP_PROP_GAMMA, Gamma);
}
void onLightChange(int, void*)//回呼函式
{
capture.set(CAP_PROP_BRIGHTNESS, light);
}
void show()
{
cout << "飽和度:" << capture.get(CAP_PROP_SATURATION) << endl;
cout << "Gamma值:" << capture.get(CAP_PROP_GAMMA) << endl;
cout << "Light:" << capture.get(CAP_PROP_BRIGHTNESS) << endl<<endl;
}
/*
滑動改變飽和度Gamma,Light值,
摁1列印當前相機值
*/
int main()
{
Mat frame;
namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);
capture.open(0);//這里默認打開你電腦內置攝像頭,如果有外置的可以設為1
if (! capture.isOpened())
{
return -1;
}
cout << "攝像機原本引數:" << endl;
show();
createTrackbar("飽和度", WINDOW_NAME1, &saturation, 128, onSaturationChange);//createTrackbar必須在外面
createTrackbar("Gamma", WINDOW_NAME1, &Gamma, 500, onGammaChange);
createTrackbar("Light", WINDOW_NAME1, &light, 100, onLightChange);
while (1)
{
capture >> frame; //讀取當前幀
flip(frame, frame,1);
if (frame.empty())
{
break;
}
onSaturationChange(0, 0);//里面每一個加上一個初始化
onGammaChange(0, 0);
onLightChange(0, 0);
imshow(WINDOW_NAME1, frame); //顯示當前幀
char c = waitKey(10);
if ( c== 27) break;
if (c == '1')//表示摁1顯示當前相機引數
{
cout << "調整后的引數:" << endl;
show();
}
}
return 0;
}
}
出于復雜度問題,測驗程式就不搞很多實時修改引數了,這個程式還是比較好理解,不是很理解的話看一下上面那個博客理解一下createTrackbar()函式,應該就差不多掌握了,有這個例子我想,應該其他所有相關引數都可以這樣實時修改了,
這個是程式運行的界面:

以下是一些相機引數,具體哪些能修改建議還是實踐一下,我之后再過來更新一波,
CAP_PROP_POS_MSEC //視頻檔案在以微秒為單位的當前的位置或者視頻抓取的時間戳, –
CAP_PROP_POS_FRAMES //解碼基于0索引的幀,然后自動抓取下一幀. –
CAP_PROP_POS_AVI_RATIO //相對于視頻檔案的位置: 0 表示視頻的開始, 1 表示視頻的結尾. –
CAP_PROP_FRAME_WIDTH //視頻流中幀的寬度. – CAP_PROP_FRAME_HEIGHT
//視頻流中幀的高度. – CAP_PROP_FPS //幀速率. – CAP_PROP_FOURCC
//4-character code of codec. – CAP_PROP_FRAME_COUNT //視頻檔案中幀的總數. –
CAP_PROP_FORMAT //通過 retrieve()來回傳Mat物件的格式 . – CAP_PROP_MODE
//Backend-specific 的值指示當前的拍攝模式 – CAP_PROP_BRIGHTNESS //影像的亮度
(only for cameras). – CAP_PROP_CONTRAST //影像的對比度 (only for
cameras). – CAP_PROP_SATURATION //影像的飽和度 (only for cameras). –
CAP_PROP_HUE //影像的色調 (only for cameras). – CAP_PROP_GAIN
//影像的增益 (only for cameras). – CAP_PROP_EXPOSURE //影像的曝光度(only
for cameras).
以上我個人全部通過實驗驗證過的,不過本人也是學習opencv不久,如有錯誤,還請各位前輩指導,感覺我寫的有用的可以關注一下我的博客哦,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294577.html
標籤:其他
