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不久,如有错误,还请各位前辈指导。感觉我写的有用的可以关注一下我的博客哦。