若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/100799289
目录
OpenCV开发专栏
《OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境》
《OpenCV开发笔记(三):OpenCV图像的概念和基本操作》
《OpenCV开发笔记(四):OpenCV图片和视频数据的读取与存储》
《OpenCV开发笔记(五):OpenCV读取与操作摄像头》
《OpenCV开发笔记(六):OpenCV基础数据结构、颜色转换函数和颜色空间》
《OpenCV开发笔记(八):OpenCV常用操作之计时、缩放、旋转、镜像》
《OpenCV开发笔记(九):OpenCV区域图像(ROI)和整体、局部图像混合》
《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