1.视频处理

视频中包含的信息要远远大于图片,对视频的分析也成为计算机视觉的主流,而本质上视频是由一帧帧的图像组成,所以视频处理最终还是要归结于图像处理,但在视频处理中,有更多的时间维的信息可以利用。

1.1视频帧的读取

OpenCV为视频的读入提供了一个类VideoCapture,下面我们说明一下类的几个重要的方法:
1,打开一段视频或默认的摄像头
有两种方法,一种是在定义类的时候,一种是用open()方法。
VideoCapture capture("../video.avi"); // 方法1
capture.open("../video.avi"); // 方法2

如果把文件名换为设置ID,则可打开摄像头,默认摄像头为0。
2,获取视频帧
获取视频帧可以有多种方法:

capture.read(frame);// 方法一
capture.grab();// 方法二
capture.retrieve(frame);
capture>>frame;// 方法三

3,获取视频的参数
一个视频有很多参数,比如:帧率、总帧数、尺寸、格式等,VideoCapture的get方法可以获取大量这些参数。

double rate=capture.get(CV_CAP_PROP_FPS); // 获取
long nFrame=static_cast<long>(capture.get(CV_CAP_PROP_FRAME_COUNT)); 

更加相关的参数可以参考手册。
4,设置视频帧的读取位置
VideoCapture类的set方法可以允许我们取出视频中某个位置的帧,它有一些参数,可以按时间,也可以按帧号,还可以按视频长短的比例。

// 第100帧
double position=100.0;
capture.set(CV_CAP_PROP_POS_FRAMES,position);
// 第1e6毫秒
double position=1e6;
capture.set(CV_CAP_PROP_POS_MSEC,position);
// 视频1/2位置
double position=0.5;
capture.set(CV_CAP_PROP_POS_AVI_RATIO,position);

当然,set方法仅用于取视频帧的位置,还可以设置视频的帧率、亮度。
下面是一个将canny边缘检测应用于视频的程序:

int main()
{VideoCapture capture("../track.avi"); if(!capture.isOpened())return 1;double rate=capture.get(CV_CAP_PROP_FPS);bool stop(false);Mat frame;namedWindow("Canny Video");int delay=1000/rate;while(!stop){if(!capture.read(frame))break;Mat result;Canny(frame,result,100,200);threshold(result,result,128,255,THRESH_BINARY);imshow("Canny Video",result);if(waitKey(delay)>=0)stop=true;}capture.release();
}

1.2视频的写入

视频的写入与读取类似,OpenCV中是使用VideoWriter类来实现的,这个类有几个方法,都很简单。除了构造函数外,提供了open、IsOpen、write、和重载操作符<<
值得注意的是OpenCV里对视频的编码解码等支持并不是很良好,所以不要希望用这个类去实现摄像头图像的获取与转码,有兴趣的可以参考FFmpeg库。

VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);
bool VideoWriter::open(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);

上面是类的构造函数与open方法,它们的参数相同,首先指定文件名,第二个参数是编码格式,OpenCV里提供了很多种的编码格式,如CV_FOURCC(‘P’,’I’,’M’,’1’)是MPEG-1格式,CV_FOURCC(‘M’,’G’,’P’,’G’)为motion-jpeg格式。第三个参数为帧率,第4个参数为视频的尺寸大小。

VideoCapture capture("../track.avi");
double rate=capture.get(CV_CAP_PROP_FPS);
Size videoSize(capture.get(CV_CAP_PROP_FRAME_WIDTH),capture.get(CV_CAP_PROP_FRAME_HEIGHT));
VideoWriter writer;
writer.open("../result.avi",CV_FOURCC('P','I','M','1'),rate, videoSize);
Mat frame;
capture>>frame;
writer<<frame;

2.图像转换(彩色通道转换、垂直方向变换)

#include <cv.h>
#include <highgui.h>int main( int argc, char** argv )
{  IplImage* pImg; //声明IplImage指针  //colorful->grayscaleif( argc == 2 && (pImg = cvLoadImage( argv[1], CV_LOAD_IMAGE_UNCHANGED)) != 0 )  {  IplImage* pImg2 = cvCreateImage(cvGetSize(pImg), pImg->depth, pImg->nChannels); //CV_CVTIMG_FLIP 垂直翻转     //CV_CVTIMG_SWAP_RB 交换红蓝通道  cvConvertImage(pImg, pImg2, CV_CVTIMG_FLIP);  cvNamedWindow( "Image", 1 );  cvShowImage( "Image", pImg );   cvWaitKey(0);      cvShowImage( "Image", pImg2 );   cvWaitKey(0);      cvDestroyWindow( "Image" );   cvReleaseImage( &pImg );   cvReleaseImage( &pImg2 ); return 0;  }  return -1;
}

实验结果:

    

openCV视频处理与图像转换相关推荐

  1. C++ OpenCV视频操作之图像输出文字

    前言 当我们视频分析时可能图像中需要有一个文字说明,OpenCV中本身也有这个API,我们就来看看OpenCV中的图像文字输出. 视频效果 函数API void putText( Mat& i ...

  2. OpenCV3 和 Qt5 计算机视觉 学习笔记 - 图像转换

    插件界面 void Transform_Plugin::setupUi(QWidget *parent) {ui = new Ui::PluginGui;ui->setupUi(parent); ...

  3. 【opencv】(1) 基础操作:图像视频读取、图像截取、颜色通道

    主要内容有:图像及视频的读取和保存.图像显示.转换灰度图.图像截取.颜色通道提取和组合 那我们开始吧. 1. 图像操作 首先我们导入opencv库,彩色图像一般都是由RGB(红绿蓝)三颜色通道构成,灰 ...

  4. OpenCV的图像处理——iOS与OpenCV之间图像转换

    前言 1.OpenCV有专门的iOS平台的包,可以真接下载导入工程,也可以用cmake把OpenCV源码编成.a文件,以静态库的形式导入工程. 2.我这里用的Xcode11,OpenCV用的是最4.2 ...

  5. python3 opencv 视频格式转换

    python3 opencv 视频格式转换: import cv2 #获得视频的格式 videoCapture = cv2.VideoCapture('ad3.avi') #获得码率及尺寸 fps = ...

  6. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  7. OpenCV中的图像处理 —— 图像阈值+图像平滑+形态转换

    OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 目录 OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 1. 图像阈值 1.1 简单阈值 1.2 自适应阈值 1.3 Otsu ...

  8. opencv视频处理和检测学习总结

    基于opencv的视频处理--基础数据结构 在一个封装的还算比较好的库中,一般都不会直接采用那些基本的数据结构像char, int 之类,一是 不具有可读性,二是不方便修改移植.通常是通过typede ...

  9. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))

    Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...

最新文章

  1. log4j2配置文件的故事
  2. VC 使用SetCheck(TRUE)函数的注意事项
  3. python3 爬虫--Chrome以及 Chromedriver安装配置
  4. Silver Cow Party POJ - 3268(正反建图+dijkstra)
  5. 浅谈.NET 6 中 gRPC 的最新功能
  6. 穿山甲插屏广告居中_穿山甲跻身广告联盟头部阵营 如何实现增量创新?
  7. awk 系列Part7:awk 怎么从标准输入(STDIN)读取输入
  8. SpringBoot→初始化项目just run@SpringBootApplication、请求处理@RequestMapping、属性配置yml
  9. samba服务器_win10 更新导致无法连接samba服务器
  10. 简单介绍一下vue2.0
  11. 医疗搜索中的query词权重算法探索
  12. 计算机代码大全喜欢你,2020微信表白代码大全
  13. padavan路由器server酱设备下线快速响应。
  14. html正方形项目符号,html自定义项目符号
  15. KMP复习之poj 3461 Oulipo
  16. 使用Python实现批量PPT转图片,格式支持PNG、JPG,转后图片后批量重命名
  17. Android:适配器刷新数据无效
  18. 在宜家兼职收银员创收
  19. IIR数字低通滤波器
  20. 纽约大学计算机与科学,NYU的Computer Science and Engineering「纽约大学计算机科学与工程系」...

热门文章

  1. 如何挂载阿里云Linux服务器的“数据盘”(新购买)
  2. Chrome插件会干坏事儿的
  3. 阔步向前冲,拥抱云计算-【软件和信息服务】2012.10
  4. Windows Phone 7知识锦分享
  5. 如何利用jquery实现一句话全选/取消全选的实例代码
  6. bzoj4665: 小w的喜糖
  7. 使用Picasso实现图片圆角和图片圆形
  8. ARC 100 C - Linear Approximation题解---三分法
  9. (转)Mat, vectorpoint2f,Iplimage等等常见类型转换
  10. Android 屏幕常亮、低电量监听