用opencv顯示一張影象和播放一段視訊,寫入視訊到檔案
阿新 • • 發佈:2019-01-30
#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();
}
寫入視訊到檔案
/*
* 寫入一段視訊到檔案*/
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 );