1。第一回使用Opencv的目的是为了能采集笔记本的视频,想要做一个视频聊天的软件,大概思路是采集到的码流转成H.264,然后再加上转成TS或者PS通过RTP协议或者RTP在TCP上来发送给另外一个用户,另一个用户收到视频流后,反向得到码流,然后显示到软件上,最终实现视频聊天的目的。
2.最简单的代码如下:
首先定义一个采集的类对象VideoCapture inputVideo(0);
下面是显示部分,通过一个MFC的定时器,定时40ms来触发一次,最终在界面上显示,大概是1000/40ms=25帧,一秒25帧的数据。
void CMFCApplication1Dlg::OnBnClickedButton1()
{
SetTimer(1, 40, NULL);
return;
}
void CMFCApplication1Dlg::OnBnClickedButton2()
{
KillTimer(1);
}
void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
Mat src;
inputVideo >> src;
if (src.empty()) return;
imshow("view", src);
CDialogEx::OnTimer(nIDEvent);
}
最终就能出来视频了。大概界面效果如下:(比较宅,不晒本人照片了)
在学习调用opencv的过程中了解到下面的东西:
opencv是个图像处理库,它封装了大量图像处理算法,与视频采集没有关系,但这个库的使用者为了方便,把VFW(Video for windows)也集成到了opencv,已达到视频采集和图像处理的封装到一起的目的;
而DirectShow是微软公司在VFW的基础上推出了新一代基于COM的流媒体处理的开发包,在视频开发中,不论从效率还是实用性上都好于VFW。
编码,解码 把图像编制成视频流,或把视频流解码成图像的算法,H.264只是其中的一种,比较常用的编码器还有VCD,DVD,MEEG4,不过为了在网上传输,H.264算法基本已成为一种趋势了,它主要特点是编码后视频文件小而清晰;使用264通常可以使用现成封装好的库,同264库,也有好多种,有免费的,有收费的,也可以自己写,不过好像很难,没必要。
发送端:
directshow--》从摄像头采集图像--》发送h。264编码器压制成视频文件--》网络传输--》接收端
接收端:
directshow-》从网络采集图像--》通过H。264编码器在本地播放视频或保存视频。
directshow是由大量的fileter构成的,如果只是采集,通现成的fileter即可。
opencv简介:
Opencv(Open Source Computer Vision Library)是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux,Windows,android,ios等操作系统上,它轻量级而且高效--由一系列C语言和少量C++类构成,同时提供了Python,Ruby,MATLAB等语言的接口,实现了图像处理和计算机视觉方面的诸多通用算法。
【calib3d】--Calibration和3D,相机校准和三维重建相关
【contrib】--新增人脸识别,立体匹配,人工视网膜模型等技术
【core】--核心功能模块,包含Opencv基本数据结构和绘图函数等
【imgproc】--Image/Process,包含滤波,几何变换,直方图相关,特征检测,运动分析和形状描述等
【features2d】--2D功能框架,主要包含特征检测和描述及接口
【Flann】--高维的近似金邻快速搜索算法库
【gpu】--运用GPU加速的计算机视觉模块
【highgui】--高层图形用户界面,包含媒体输入输出,视频捕获,图像和视频的编码和解码,图形交互界面接口等
【legacy】--包含运动分析,平面细分,描述符提取等
【ml】--Machine learning,机器学习模块
【objdetect】--目标检测模块
【photo】--包含图像修复和图像去噪两部分
【。。。。】