#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 );