OpenCV3历程(1)——VideoCapture、视频的处理

一、使用cv::VideoCapture对象读取视频流

根据数据源的不同,我们需要以不同的调用方式来构建一个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弹出一个选择窗口,让你能够手动选择希望使用的相机。

二、相机属性cv::VideoCapture::get()和cv::VideoCapture::set()

视频文件通常不仅仅包含一帧一帧的图像,还包含许多重要的元数据(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立体相机整流标志

三、视频操作的实例

1、从摄像头获取视频

Python:

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()

C++:

#include<opencv2/opencv.hpp>
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();//关闭所有窗口
}

2、操作视频文件

Python:

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()

C++:

#include<opencv2/opencv.hpp>
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();//释放资源
}

3、写入视频

Python:

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()

C++:

#include<opencv2/opencv.hpp>
#include<iostream>
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<<frame;//等同于writer.write(frame);
        imshow("video", frame);
        if(waitKey(10)>0)
            break;
    }
    cout<<"write end!";
    cap.release();
    destroyAllWindows();
}

4、获取视频相关参数信息

转载自:https://www.cnblogs.com/little-monkey/p/7162340.html

#include<opencv2/opencv.hpp>
#include<iostream>
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<<"视频宽度="<<width<<endl;
    cout<<"视频高度="<<height<<endl;
    cout<<"视频总帧数="<<totalFrames<<endl;
    cout<<"帧率="<<frameRate<<endl;

    Mat frame;
    while(1)
    {
        cap>>frame;//等价于cap.read(frame);
        if(frame.empty())
            break;
        imshow("video", frame);
        if(waitKey(20)>0)
            break;
    }
    cap.release();
}

  • 4
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值