1. 程式人生 > >用opencv顯示一張影象和播放一段視訊,寫入視訊到檔案

用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(); }

寫入視訊到檔案


    /*
     * 寫入一段視訊到檔案*/
    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 );