用opencv显示一张图像和播放一段视频,写入视频到文件

#include "mainwindow.h"
#include <QApplication>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"//读取各种类型的图像文件、视频内容以及摄像机输入
#include "opencv/cv.h"
using namespace cv;

//视频控制
int         g_slider_position   = 0;//滚动条位置
CvCapture*  g_capture           = NULL;

//CV_CAP_PROP_POS_FRAMES-->表示我们以帧数来设置读入位置
//如果我们想通过视频长度比例来设置读入位置,
//我们可以通过用AVI_RATIO代替FRAMES来实现
void onTrackbarSlide(int pos) {
    cvSetCaptureProperty(
        g_capture,
        CV_CAP_PROP_POS_FRAMES,
        pos
    );
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    /*
     * 用opencv显示一张图像--way1
    //将图像文件加载至内存
    IplImage* img = cvLoadImage("../Data/imagedata/me.jpg");
    //在屏幕上创建一个窗口
    //CV_WINDOW_AUTOSIZE-->根据图像的实际大小自动进行拉伸或缩放
    cvNamedWindow( "Hello", CV_WINDOW_AUTOSIZE );
    //显示该图像
    cvShowImage( "Hello", img );
    //使程序暂停,等待用户触发一个按键操作
    //设置该函数参数为0或负数时,程序将一直等待用户触发按键操作
    //设为一个正数,则程序将暂停一段时间,时间长为该整数值个毫秒单位
    cvWaitKey(0);
    //释放为该图像文件所分配的内存
    cvReleaseImage( &img );
    //销毁显示图像文件的窗口
    cvDestroyWindow( "Hello" );*/


    /*
     *用opencv显示一张图像--way2
    //读取原图像,并以矩阵格式存储图像
    Mat color = imread("../../Data/imagedata/me.jpg");
    //读取灰度图像
    Mat gray = imread("../../Data/imagedata/me.jpg",0);
    //写图像
    imwrite("grayme.jpg",gray);
    //通过opencv函数获取图像像素
    int myRow = color.rows -1;//图像行数
    int myCol = color.cols -1;//图像列数
    Vec3b pixel = color.at<Vec3b>(myRow,myCol);
    imshow("me rgb",gray);
    waitKey(0);*/

    /*
     * 打开视频--way 2
    VideoCapture cap;
    cap.open("../../Data/imagedata/chaplin.mp4");
    //检查是否打开成功
    if(!cap.isOpened()){
        return -1;
    }
    namedWindow("video",1);
    for(;;){
        Mat frame;
        //获取视频的每一帧
        cap>>frame;
        imshow("video",frame);
        if(waitKey(30) >=0){
            break;
        }
    }
    //释放资源
    cap.release();*/

    /*
     * 播放一段视频*/
    cvNamedWindow( "Video", CV_WINDOW_AUTOSIZE );
    g_capture = cvCreateFileCapture( "../Data/imagedata/chaplin.mp4" );

    //获得视频文件的总帧数以对滚动条进行设置
    int frames = (int) cvGetCaptureProperty(
        g_capture,
        CV_CAP_PROP_FRAME_COUNT
    );
    if( frames!= 0 ) {
        //创建滚动条
      cvCreateTrackbar(
          "Position",
          "Video",
          &g_slider_position,
          frames,
          onTrackbarSlide
     );
    }

    IplImage* frame;
    while(1) {
        //cvQueryFrame的参数为CvCapture结构的指针,用来将下一帧视频文件载入内存
        frame = cvQueryFrame( g_capture );
        if( !frame ) break;
        cvShowImage( "Video", frame );
        //设置滚动条位置
        cvSetTrackbarPos("Position","Video",g_slider_position);
        ++g_slider_position;
        //当前帧被显示后,我们会等待33 ms。 [11]如果其间用户触发了一个按键,
        //c会被设置成这个按键的ASCII码,否则,c会被设置成-1。
        //如果用户触发了ESC键(ASCII 27),循环被退出,读入视频停止。否则33 ms以后继续执行循环。
        char c = cvWaitKey(33);
        if( c == 27 ) break;
    }
    //释放为CvCapture结构开辟的内存空间
    cvReleaseCapture( &g_capture );
    cvDestroyWindow( "Video" );
    return a.exec();
}

原文地址:http://book.51cto.com/art/200912/172349.htm

写入视频到文件


    /*
     * 写入一段视频到文件*/
    CvCapture* capture = cvCreateFileCapture( "../../Data/imagedata/chaplin.mp4" );
    if(!capture){
         return -1;
    }
    //Init the video read
    IplImage *bgr_frame=cvQueryFrame(capture);
    double fps = cvGetCaptureProperty (
        capture,
        CV_CAP_PROP_FPS
    );
    CvSize size = cvSize(
       (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
       (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT)
    );
    //视频文件的名称,视频压缩的编码格式
    CvVideoWriter *writer = cvCreateVideoWriter(
        "../../Data/imagedata/writevideo.mp4",
        CV_FOURCC('M','J','P','G'),
        fps,
        size
    );
    IplImage* logpolar_frame = cvCreateImage(
        size,
        IPL_DEPTH_8U,
        3
    );
    while( (bgr_frame=cvQueryFrame(capture)) != NULL ) {
        cvLogPolar( bgr_frame, logpolar_frame,
                    cvPoint2D32f(bgr_frame->width/2,
                    bgr_frame->height/2),
                    40,
                    CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
        cvWriteFrame( writer, logpolar_frame );
    }
    cvReleaseVideoWriter( &writer );
    cvReleaseImage( &logpolar_frame );
    cvReleaseCapture( &capture );
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值