1.VideoCapture对象
cv::VideoCapture根据数据来源的不同,有三种构建方式:
cv::VideoCapture::VideoCapture(const string& filename); //从视频文件获取数据
cv::VideoCapture::VideoCapture(int device); //从设备中获取
cv::VideoCapture::VideoCapture();
如果打开成功cv::VideoCapture::isOpened()
会返回true。请在每次打开文件或者设备
时,使用isOpened()检查是否打开成功。
1.1 相机的域
相机的域指示HighGUI应该如何匹配相机。
相机捕捉常数 | 对应数值 |
---|---|
cv::CAP_ANY | 0 |
cv::CAP_MIL | 100 |
cv::CAP_VFM | 200 |
cv::CAP_V4L | 200 |
cv::CAP_V4L2 | 200 |
cv::CAP_FIREWIRE | 300 |
cv::CAP_IEEE1394 | 300 |
cv::CAP_DC1394 | 300 |
cv::CAP_CMU1394 | 300 |
cv::CAP_QT | 500 |
cv::CAP_DSHOW | 700 |
cv::CAP_PVAPI | 800 |
cv::CAP_OPENNI | 900 |
cv::CAP_ANDROID | 1000 |
cv::VideoCapture cap;
cap.open("my_video.avi");
//等效于
cv::VideoCapture cap("my_video.avi");
2.从视频流中读取图像
2.1 read()函数读取数据
bool cv::VideoCapture::read(cv::OutputArray image);
- image: 从视频流中读取的一帧数据
- return: 成功返回true,失败或者已读取完文件最后一帧,返回false。
2.2 重载符>>读取数据
cv::VideoCapture& cv::VideoCapture::operator>>(cv::Mat& image);
由于这是一个流操作符,所以无论读取成功与否,它都会返回一个对最初的cv::Capture对象的引用。除此之外,它与read()函数的功能完全相同。
2.3 grab()和retrieve()读取
在多相机数据读取时,我们希望获取每个相机数据时,尽可能的快,从而减少相机直接的时间差。所以出现了捕获(grab)和恢复(retrieve)分开的应用场景。read()
函数就是一次完整的
grab()和retrieve()过程。
bool cv::VideoCapture::grab(void);
bool cv::VideoCapture::retrieve(cv::OutputArray image, int channel=0);
params:
- image 获取的帧数据
- channel 在多相机时,指定相机的设备号
return:
- ture 获取数据成功
- false 获取数据失败
3.相机属性
3.1 获取相机属性
视频文件不仅包含一帧一帧的图像,还有许多元数据(meta data),这些数据会被拷贝到cv::VideoCapture对象内部的数据区。
double cv::VideoCapture::get(int propid); //Property identifier
常见的属性ID表如下:
视频捕获属性 | 是否只有在摄像头模式下可以使用 | 含义 |
---|---|---|
cv::CAP_PROP_POS_MSEC | 视频文件中的当前位置(毫秒)或视频捕获的时间戳 | |
cv::CAP_PROP_POS_FRAMES | 从零开始下一帧的索引 | |
cv::CAP_PROP_POS_AVI_RATIO | 视频中的相对位置(范围0.0到1.0),滑动条调整时需要用到。 | |
cv::CAP_PROP_FRAME_WIDTH | 视频帧的像素宽度 | |
cv::CAP_PROP_FRAME_HEIGHT | 视频帧的像素高度 | |
cv::CAP_PROP_FPS | 录制视频的帧速率 | |
cv::CAP_PROP_FOURCC | 四个字符代码指示编解码 | |
cv::CAP_PROP_FRAME_COUNT | 视频文件中的帧总数,并不完全可靠。 | |
cv::CAP_PROP_FORMAT | 返回的Mat对象格式(如:CV_8UC3) | |
cv::CAP_PROP_PROP_MODE | 表示捕捉模式(如:DC1394) | |
cv::CAP_PROP_PROP_BRIGHTNESS | 是 | 相机的亮度 |
cv::CAP_PROP_PROP_COUNTRAST | 是 | 相机的对比度 |
cv::CAP_PROP_PROP_SATURATION | 是 | 相机的饱和度 |
cv::CAP_PROP_PROP_HUE | 是 | 相机的色调 |
cv::CAP_PROP_PROP_GAIN | 是 | 相机的增益设定 |
cv::CAP_PROP_PROP_EXPOSURE | 是 | 相机曝光设置 |
cv::CAP_PROP_PROP_CONVERT_RGB | 是 | 如果非0,捕获的图像将被转换为3通道数据 |
cv::CAP_PROP_PROP_WHITE_BALANCE | 是 | 相机白平衡设置 |
cv::CAP_PROP_PROP_RECTIFICATION | 是 | 立体相机标志(仅适用于DC1394-2.X) |
FOURCC转换为char类型
cv::VideoCapture cap("my_video.avi");
unsigned f = (unsigned)cap.get(cv::CAP_PROP_FOURCC);
char fourcc[] = {
(char)f,
(char)(f >> 8),
(char)(f >> 16),
(char)(f >> 24),
'\0'
};
3.2 设置相机属性
bool cv::VideoCapture::set(int propid, double value);