根据数据源的不同,我们需要以不同的调用方式来构建一个cv::VideoCapture对象:
cv::VideoCapture::VideoCapture(const string& filename); //input filename
cv::VideoCapture::VideoCapture(int device); //video capture denice id
cv::VideoCapture::VideoCapture();
在第一个构造函数中,我们只需要给出视频文件的文件名即可(.MPG、.AVI等),OpenCV将会打开对应的视频文件,并准备进行后续的读取操作。如果打开成功,呢么便可以从中获取图像帧。成员函数cv::VideoCapture::isOpened()会返回true。
输入参数为整型变量的情况下,我们给出一个标识符来表明我们希望使用哪个摄像机以及我们希望操作系统以何种方式与该摄像机通信。对于摄像机来说,他只是一个标识码,如果在当前系统下只有一个摄像机时参数为0,当有多个摄像机同时处于当前系统之中时,参数随之递增即可。还有一件事:在某些平台上,你可以传入参数-1,这会使OpenCV弹出一个选择窗口,让你能够手动选择希望使用的相机。
视频文件通常不仅仅包含一帧一帧的图像,还包含许多重要的元数据(meta data),这对于正确处理文件有着重要的意义。通常,如果能够实现对该数据区参数的读取或者写入将会对我们非常有帮助,OpenCV提供了函数实现上述功能:
double cv::VideoCapture::get(int propid); //property identfier(see table)
bool cv::VideoCapture::set(int propid, double value);
常用的属性见table:
视频捕获属性 | camera only | 含义 |
---|---|---|
cv::CAP_PROP_POS_MSEC | 视频文件中的当前位置(毫秒)或视频捕获时间戳 | |
cv::CAP_PROP_POS_FRAMES | 从零开始下一帧索引 | |
cv::CAP_PROP_POS_AVI_RATIO | 视频中的相对位置(范围为0.1到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_MODE | 表示捕捉模式:值是特定于正在使用的视频后端(例如,DC1394) | |
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 | √ | 如果非零,捕获的图像将被转换为具有三个通道 |
cv::CAP_PROP_WHITE_BALANCE | √ | 相机的白平衡设置(支持时) |
cv::CAP_PROP_RECTIFICATION | √ | 立体相机整流标志 |
import numpy as np
import cv2 as cv
# 创建VideoCapture,传入0即打开系统默认摄像头
cap = cv.VideoCapture(0)
while(True):
# 读取一帧,read()方法是其他两个类方法的结合,具体文档
# ret为bool类型,指示是否成功读取这一帧
ret, frame = cap.read()
# 就是个处理一帧的例子,这里转为灰度图
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 不断显示一帧,就成视频了
# 这里没有提前创建窗口,所以默认创建的窗口不可调整大小
# 可提前使用cv.WINDOW_NORMAL标签创建个窗口
cv.imshow('frame',gray)
# 若没有按下q键,则每1毫秒显示一帧
if cv.waitKey(1) & 0xFF == ord('q'):
break
# 所有操作结束后不要忘记释放
cap.release()
cv.destroyAllWindows()
#include
using namespace cv;
void main(){
VideoCapture cap;
cap.open(0); //打开摄像头
if(!cap.isOpened())
return;
Mat frame;
while(1)
{
cap>>frame;//等价于cap.read(frame);
Canny(frame, frame, 30, 100);//canny边缘检测,去掉这一行就是纯粹的读取摄像头了
//cvtColor(frame, frame, CV_BGR2HSV);//BGR空间转为HSV颜色空间,注意,两者不能同时对同一张图片(在此为frame)进行处理,否则报错
if(frame.empty())
break;
imshow("video", frame);
if(waitKey(20)>0)//按下任意键退出摄像头 因电脑环境而异,有的电脑可能会出现一闪而过的情况
break;
}
cap.release();
destroyAllWindows();//关闭所有窗口
}
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while(cap.isOpened()):
ret, frame = cap.read()
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('frame',gray)
if cv.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv.destroyAllWindows()
#include
using namespace cv;
void main(){
VideoCapture cap;
cap.open("E://2.avi"); //打开视频,以上两句等价于VideoCapture cap("E://2.avi");
//cap.open("http://www.laganiere.name/bike.avi");//也可以直接从网页中获取图片,前提是网页有视频,以及网速够快
if(!cap.isOpened())//如果视频不能正常打开则返回
return;
Mat frame;
while(1)
{
cap>>frame;//等价于cap.read(frame);
if(frame.empty())//如果某帧为空则退出循环
break;
imshow("video", frame);
waitKey(20);//每帧延时20毫秒
}
cap.release();//释放资源
}
import numpy as np
import cv2 as cv
cv.namedWindow('frame', cv.WINDOW_NORMAL)
cap = cv.VideoCapture(0)
# 这里如果不设置窗口大小的话
# 存储视频文件时会出错
cap.set(cv.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 480)
fourcc = cv.VideoWriter_fourcc(*'MJPG')
out = cv.VideoWriter('output.mp4',fourcc, 20.0, (640,480))
while cap.isOpened():
ret, frame = cap.read()
if ret==True:
frame = cv.flip(frame,1)
out.write(frame)
cv.imshow('frame',frame)
if cv.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
cv.destroyAllWindows()
#include
#include
using namespace cv;
using namespace std;
void main(){
VideoCapture cap;
cap.open("E://2.avi");
Size size0=Size(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
VideoWriter writer("E://out.avi",-1,cap.get(CV_CAP_PROP_FPS),size0,false);
if(!cap.isOpened())
return;
Mat frame;
while(1)
{
cap>>frame;
Canny(frame,frame,30,100);
if(frame.empty())
break;
writer<0)
break;
}
cout<<"write end!";
cap.release();
destroyAllWindows();
}
转载自:https://www.cnblogs.com/little-monkey/p/7162340.html
#include
#include
using namespace cv;
using namespace std;
void main(){
VideoCapture cap;
cap.open("E:\\2.avi"); //打开视频,等价于 VideoCapture cap("E://2.avi");
if(!cap.isOpened())
return;
int width = cap.get(CV_CAP_PROP_FRAME_WIDTH); //帧宽度
int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
int frameRate = cap.get(CV_CAP_PROP_FPS); //帧率 x frames/s
int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
cout<<"视频宽度="<>frame;//等价于cap.read(frame);
if(frame.empty())
break;
imshow("video", frame);
if(waitKey(20)>0)
break;
}
cap.release();
}