一、读取视频方法
(1)实例化 VideoCapture
类的对象 capVideo
并打开指定路径的视频文件。
(2)示例:VideoCapture capVideo("C:\\Users\\86173\\Desktop\\TI\\cat.mp4");
(3)使用capVideo.open("C:\\Users\\86173\\Desktop\\TI\\cat.mp4");也可以打开视频。
(4)如果 capVideo.open(0)则打开默认摄像头,参数0为摄像头的id。
(5)OpenCV可以读取本地视频文件,摄像头,及连续的图像文件。
(6)VideoCapture
类是 OpenCV 中用于捕获视频数据的类。
(7)VideCapture为opencv定义的视频数据的类,实际是底层对ffmpeg的封装实现的。
二、get
函数用于查询或获取 VideoCapture
对象的特定属性:
(1)函数原型:
CV_WRAP virtual double get(int propId) const;
(2)参数propId
:
属性标识符,可以是 cv::VideoCaptureProperties
枚举中的一个值(例如,cv::CAP_PROP_POS_MSEC
,cv::CAP_PROP_POS_FRAMES
等),或者是 @ref videoio_flags_others
中定义的其他标志。
(3)VideoCaptureProperties
枚举:
CAP_PROP_POS_MSEC
:视频文件的当前位置(毫秒)。CAP_PROP_POS_FRAMES
:下一个要解码/捕获的帧的0-based索引。CAP_PROP_POS_AVI_RATIO
:视频文件的相对位置:0=电影开始,1=电影结束。CAP_PROP_FRAME_WIDTH
:视频流中帧的宽度。CAP_PROP_FRAME_HEIGHT
:视频流中帧的高度。CAP_PROP_FPS
:帧率。CAP_PROP_FOURCC
:编解码器的4字符代码,查看VideoWriter::fourcc
。CAP_PROP_FRAME_COUNT
:视频文件中的帧数。CAP_PROP_FORMAT
:VideoCapture::retrieve()
返回的%Mat
对象的格式(见Mat::type()
)。设置为 -1 可获取未解码的 RAW 视频流(作为Mat 8UC1
)。CAP_PROP_MODE
:后端特定的值,表示当前捕获模式。CAP_PROP_BRIGHTNESS
:图像的亮度(只对支持的相机有效)。CAP_PROP_CONTRAST
:图像的对比度(只对相机有效)。CAP_PROP_SATURATION
:图像的饱和度(只对相机有效)。CAP_PROP_HUE
:图像的色调(只对相机有效)。CAP_PROP_GAIN
:图像的增益(只对支持的相机有效)。CAP_PROP_EXPOSURE
:曝光(只对支持的相机有效)。CAP_PROP_CONVERT_RGB
:布尔标志,指示是否应将图像转换为 RGB。CAP_PROP_WHITE_BALANCE_BLUE_U
:目前不支持。CAP_PROP_RECTIFICATION
:立体相机的校正标志(目前仅 DC1394 v 2.x 后端支持)。CAP_PROP_MONOCHROME
:单色。CAP_PROP_SHARPNESS
:锐度。CAP_PROP_AUTO_EXPOSURE
:相机自动曝光控制,用户可以使用此功能调整参考级别。CAP_PROP_GAMMA
:伽马校正。CAP_PROP_TEMPERATURE
:温度。CAP_PROP_TRIGGER
:触发。CAP_PROP_TRIGGER_DELAY
:触发延迟。CAP_PROP_WHITE_BALANCE_RED_V
:红色通道的白平衡。CAP_PROP_ZOOM
:缩放。CAP_PROP_FOCUS
:对焦。CAP_PROP_GUID
:全局唯一标识符。CAP_PROP_ISO_SPEED
:ISO 速度。CAP_PROP_BACKLIGHT
:逆光补偿。CAP_PROP_PAN
:水平旋转。CAP_PROP_TILT
:垂直倾斜。CAP_PROP_ROLL
:翻滚。CAP_PROP_IRIS
:光圈。CAP_PROP_SETTINGS
:弹出视频/相机过滤器对话框(目前仅 DSHOW 后端支持)。CAP_PROP_BUFFERSIZE
:缓冲区大小。CAP_PROP_AUTOFOCUS
:自动对焦。CAP_PROP_SAR_NUM
:样本纵横比的分子。CAP_PROP_SAR_DEN
:样本纵横比的分母。CAP_PROP_BACKEND
:当前后端(枚举VideoCaptureAPIs
)。只读属性。CAP_PROP_CHANNEL
:视频输入或信道号(只对支持的相机有效)。CAP_PROP_AUTO_WB
:启用/禁用自动白平衡。CAP_PROP_WB_TEMPERATURE
:白平衡色温。CAP_PROP_CODEC_PIXEL_FORMAT
:编解码器的像素格式(只读)。CAP_PROP_BITRATE
:视频比特率(只读)。CAP_PROP_ORIENTATION_META
:帧旋转(由流元数据定义,仅适用于 FFmpeg 和 AVFoundation 后端)。CAP_PROP_ORIENTATION_AUTO
:如果为 true,则根据视频文件的元数据旋转输出帧(适用于 FFmpeg 和 AVFoundation 后端)。CAP_PROP_HW_ACCELERATION
:硬件加速类型(见VideoAccelerationType
)。CAP_PROP_HW_DEVICE
:硬件设备索引。CAP_PROP_HW_ACCELERATION_USE_OPENCL
:如果非零,则创建新的 OpenCL 上下文并将其绑定到当前线程。CAP_PROP_OPEN_TIMEOUT_MSEC
:打开视频捕获的超时时间(毫秒)。CAP_PROP_READ_TIMEOUT_MSEC
:从视频捕获中读取的超时时间(毫秒)。CAP_PROP_STREAM_OPEN_TIME_USEC
:自1970年1月1日以来流打开的时间(微秒)。CAP_PROP_VIDEO_TOTAL_CHANNELS
:视频通道总数。CAP_PROP_VIDEO_STREAM
:指定视频流的索引。CAP_PROP_AUDIO_STREAM
:在多语言媒体文件中指定流。CAP_PROP_AUDIO_POS
:音频位置(样本数)。CAP_PROP_AUDIO_SHIFT_NSEC
:音频流和视频流之间的时间差(纳秒)。CAP_PROP_AUDIO_DATA_DEPTH
:位深的替代定义。CAP_PROP_AUDIO_SAMPLES_PER_SECOND
:音频样本率。CAP_PROP_AUDIO_BASE_INDEX
:第一个音频通道的索引。CAP_PROP_AUDIO_TOTAL_CHANNELS
:选定音频流中的音频通道数。CAP_PROP_AUDIO_TOTAL_STREAMS
:音频流总数。CAP_PROP_AUDIO_SYNCHRONIZE
:启用音频同步。CAP_PROP_LRF_HAS_KEY_FRAME
:最后原始帧是否包含关键帧的数据。CAP_PROP_CODEC_EXTRADATA_INDEX
:返回额外数据的索引。CAP_PROP_FRAME_TYPE
:最近读取帧的类型。CAP_PROP_N_THREADS
:设置最大线程数。
(4)返回值:函数返回指定属性的值。
- 如果查询的属性不被
VideoCapture
实例使用的后端支持,则返回0。
三、示例代码:
#include <opencv2/core/utils/logger.hpp>//隐藏日志
#include <opencv2/highgui/highgui_c.h>
#include<opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/objdetect.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() //int main(int argc, char** argv)通过OpenCV读取视频
{
utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);
cout << "-----------start to read Video-------------" << endl;
//也可以使用capVideo.open("C:\\Users\\86173\\Desktop\\TI\\cat.mp4");
VideoCapture capVideo("C:\\Users\\86173\\Desktop\\TI\\cat.mp4");
//读取视频的一些属性,更多参数可参考videoio_c.h中得定义
cout << "parameters" << endl;
//视频流中帧的宽度
cout << "width:" << capVideo.get(CAP_PROP_FRAME_WIDTH) << endl;
//视频流中帧的高度
cout << "heigth:" << capVideo.get(CAP_PROP_FRAME_HEIGHT) << endl;
//视频文件中的帧数
cout << "frames:" << capVideo.get(CAP_PROP_FRAME_COUNT) << endl;
cout << "fps:" << capVideo.get(CAP_PROP_FPS) << endl;//帧率
if (!capVideo.isOpened()) {//用于检查视频捕获设备或文件是否已经成功打开
cout << "Unable to open video!" << endl;
return -1;
}
Mat frame; //视频序列中的单个图像或视频帧,即逐帧读取视频
while (capVideo.read(frame)) {
// 检查帧是否正确读取
if (frame.empty()) {
break;
}
//在这里处理帧(例如显示帧)显示视频
imshow("Video Frame", frame);
if (waitKey(30) == 'q') {
break; // 如果用户按下 'q',则退出循环
}
}
capVideo.release();// 释放 VideoCapture 资源
return 0;
}
四、运行结果:
(该视频时长:frames/fps=3.73s)