OpenCV视频I/O(11)视频采集类VideoCapture之设置视频捕获设备的属性函数 set()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
在 VideoCapture 中设置一个属性。
在OpenCV中,cv::VideoCapture::set() 函数用于设置视频捕获设备的属性。这些属性可以包括分辨率、帧率等。
函数原型
virtual bool cv::VideoCapture::set
(
int propId,
double value
)
参数
- 参数propertyId (int):
- 描述:属性标识符,用于指定要设置的属性。
- 示例:cv::CAP_PROP_FRAME_WIDTH(设置帧宽度)
- 参数value (double):
- 描述:要设置的属性值。
- 示例:1280(设置宽度为1280像素)
属性标识符
propertyId 参数可以是以下常量之一(这里列出了一些常用的属性标识符):
cv::CAP_PROP_POS_MSEC:当前帧的位置(以毫秒为单位)
cv::CAP_PROP_POS_FRAMES:当前帧的位置(以帧数为单位)
cv::CAP_PROP_POS_AVI_RATIO:当前帧的位置(以比例为单位,范围0至1)
cv::CAP_PROP_FRAME_WIDTH:帧宽度(以像素为单位)
cv::CAP_PROP_FRAME_HEIGHT:帧高度(以像素为单位)
cv::CAP_PROP_FPS:帧率(每秒帧数)
cv::CAP_PROP_FOURCC:四字符代码(FourCC)
cv::CAP_PROP_FRAME_COUNT:视频中的总帧数
cv::CAP_PROP_FORMAT:格式(仅用于某些平台)
cv::CAP_PROP_MODE:模式(仅用于某些平台)
cv::CAP_PROP_BRIGHTNESS:亮度(仅适用于某些设备)
cv::CAP_PROP_CONTRAST:对比度(仅适用于某些设备)
cv::CAP_PROP_SATURATION:饱和度(仅适用于某些设备)
cv::CAP_PROP_HUE:色调(仅适用于某些设备)
cv::CAP_PROP_GAIN:增益(仅适用于某些设备)
cv::CAP_PROP_EXPOSURE:曝光(仅适用于某些设备)
cv::CAP_PROP_CONVERT_RGB:转换为RGB(布尔值)
返回值
类型:bool
描述:返回值指示设置是否成功。如果返回 true,则表示设置成功;如果返回 false,则表示设置失败。
注意
即使返回 true,这也不能保证属性值已被捕获设备接受。参见 VideoCapture::get() 中的注释。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
// 创建一个 VideoCapture 对象
cv::VideoCapture cap;
// 定义摄像头设备索引
int cameraIndex = 0; // 第一个摄像头设备
// 尝试打开摄像头设备
if ( !cap.open( cameraIndex, cv::CAP_ANY ) )
{
std::cout << "Failed to open camera at index: " << cameraIndex << std::endl;
return -1;
}
// 检查是否成功打开了摄像头设备
if ( !cap.isOpened() )
{
std::cout << "Error opening camera at index: " << cameraIndex << std::endl;
return -1;
}
// 设置帧宽度和高度
cap.set( cv::CAP_PROP_FRAME_WIDTH, 640 );
cap.set( cv::CAP_PROP_FRAME_HEIGHT, 480 );
// 设置亮度和对比度
cap.set( cv::CAP_PROP_BRIGHTNESS, 0.5 ); // 假设0到1之间的值
cap.set( cv::CAP_PROP_CONTRAST, 0.5 ); // 假设0到1之间的值
// 循环读取并显示视频帧
while ( true )
{
// 创建一个 Mat 对象来存储视频帧
cv::Mat frame;
// 从视频流中读取下一帧
if ( !cap.read( frame ) )
{
std::cout << "No frame grabbed." << std::endl;
break;
}
// 检查是否成功读取到了帧
if ( frame.empty() )
{
std::cout << "Frame is empty." << std::endl;
break;
}
// 显示视频帧
cv::imshow( "Camera Stream", frame );
// 按 'q' 键退出循环
if ( cv::waitKey( 1 ) == 'q' )
{
break;
}
}
// 释放资源
cap.release();
cv::destroyAllWindows();
return 0;
}