opencv读取视频显示在窗口上,以及把视频的相关参数显示在窗口上

在学习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<opencv2\opencv.hpp>  
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();  
}

猜你喜欢

转载自blog.csdn.net/Code_R/article/details/81148496