在学习opencv使用中,写了一个读取视频的程序,并且加入了对视频帧的处理,将视频变为“灰度视频”。还有读取视频的相关参数,显示在视频窗口上。
其实就是读取每一帧图像,再对该帧图像进行灰度图像求取,再显示到窗口上。(如果不需要灰度,将代码中的cvtColor()函数删除即可)
VideoCapture capture("video.avi");
这是利用对象读取视频的方法。另外的读取方法是imread(“地址”)。
capture.get(type)通过get函数可以读取视频的相关参数,只需改变type。(cvGetCaptureProperty(capture,type)也可以实现)
type的类型为:
CV_CAP_PROP_POS_MSEC 视频当前点的毫秒值或视频捕捉的时间
CV_CAP_PROP_POS_FRAMES 下次将被捕获的0基索引的帧
CV_CAP_PROP_POS_AVI_RATIO 视频文件的相关位置: 0 - start of the film, 1 - end of the film.
CV_CAP_PROP_FRAME_WIDTH 视频流帧的宽度
CV_CAP_PROP_FRAME_HEIGHT 视频流帧的高.
CV_CAP_PROP_FPS 帧率.
CV_CAP_PROP_FOURCC 4字符编码的编码器.
CV_CAP_PROP_FRAME_COUNT 视频文件的帧数.
CV_CAP_PROP_FORMAT 由retrieve()返回矩阵对象的格式 .
CV_CAP_PROP_MODE 后端指定值指示当前捕捉的模式.
CV_CAP_PROP_BRIGHTNESS 图像亮度 (只对摄像头).
CV_CAP_PROP_CONTRAST 图像对比度 (only for cameras).
CV_CAP_PROP_SATURATION 图像饱和度 (only for cameras).
CV_CAP_PROP_HUE 色调 (only for cameras).
CV_CAP_PROP_GAIN 增益(only for cameras).
CV_CAP_PROP_EXPOSURE 曝光(only for cameras).
CV_CAP_PROP_CONVERT_RGB 布尔型标记图像是否应该被转换为RGB.
CV_CAP_PROP_WHITE_BALANCE 白平衡(目前不支持)
CV_CAP_PROP_RECTIFICATION 立体相机的矫正标记(note: only supported by DC1394 v 2.x backend currently)
sprintf函数:函数功能:格式化字符串,将格式化的数据写入字符串中。
函数原型:int sprintf(char buffer, const char format, [argument]...)
参数:
(1)buffer:是char类型的指针,指向写入的字符串指针;
(2)format:格式化字符串,即在程序中想要的格式;
(3)argument:可选参数,可以为任意类型的数据;
函数返回值:buffer指向的字符串的长度;
putText函数:在窗口上显示鼠标所在的坐标
void cv::putText(
cv::Mat& img, // 待绘制的图像
const string& text, // 待绘制的文字
cv::Point origin, // 文本框的左下角
int fontFace, // 字体 (如cv::FONT_HERSHEY_PLAIN)
double fontScale, // 尺寸因子,值越大文字越大
cv::Scalar color, // 线条的颜色(RGB)
int thickness = 1, // 线条宽度
int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)
bool bottomLeftOrigin = false // true='origin at lower left'
);
利用sprintf将数据写入数组中,再通过putText()函数写到图像上。
#include
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
VideoCapture capture("video.avi");
if(!capture.isOpened())
return 1; //判断是否成功打开视频
Mat frame,dst,gray;
namedWindow("Video");
float rate=capture.get(CV_CAP_PROP_FRAME_COUNT);
double fps=capture.get(CV_CAP_PROP_FPS);
char temp[16];
char tem[20];
bool stop(false);
int delay=1000/fps;
float i=0;
float j=0;
while(!stop)
{
if(!capture.read(dst))
break;
cvtColor(dst,gray,CV_BGR2GRAY,1);
sprintf(temp,"FPS=%.2f",fps);
sprintf(tem,"FRAME=%.2f",rate);
putText(frame,tem,Point(25,50),cv::FONT_HERSHEY_PLAIN,2,Scalar(0,255,0),1,8);
putText(frame,temp,Point(25,25),cv::FONT_HERSHEY_PLAIN,2,Scalar(0,255,0),1,8);
++i;
j=1.0*i/rate*100;
sprintf(tem,"W=%.2f%%",j);
putText(frame,tem,Point(25,75),cv::FONT_HERSHEY_PLAIN,2,Scalar(0,255,0),1,8);
imshow("Video",frame);
if(waitKey(delay)>=0)
stop=true;
}
capture.release();
}