OpenCv实时设置摄像头参数/获得摄像头参数值的方法论

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 
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()函数。应该就差不多掌握了。有这个例子我想,应该其他所有相关参数都可以这样实时修改了。

这个是程序运行的界面:

OpenCv实时设置摄像头参数/获得摄像头参数值的方法论_第1张图片

以下是一些相机参数,具体哪些能修改建议还是实践一下,我之后再过来更新一波。

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

你可能感兴趣的:(oepncv,机器视觉)