本節介紹基于OpenCV HighGUI撰寫視頻播放器的寫法,主要實作播放進度條、滑鼠控制播放暫停等功能,此處給出思路和許多功能模塊的呼叫方法,完整代碼可以在恰當的時機放出,
使用OpenCV處理視頻的基本模板
以下代碼是大家常用的OpenCV打開電腦攝像頭的操作,本文將在假設大家學會以下基本操作的基礎上展開,
#include<opencv2\highgui\highgui.hpp>
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
VideoCapture cap;
cap.open(0); //打開攝像頭
if (!cap.isOpened())
return -1;
Mat frame;
while (1)
{
cap >> frame;//等價于cap.read(frame);
if (frame.empty())
break;
imshow("video", frame);
if (waitKey(20) > 0)//按下任意鍵退出攝像頭 因電腦環境而異,有的電腦可能會出現一閃而過的情況
break;
}
cap.release();
destroyAllWindows();//關閉所有視窗
return 0;
}
若要打開電腦上已有視頻,只需要改動一個地方:
cap.open(0); //打開攝像頭
//改成視頻路徑即可,注意Windows下反斜杠要轉義
cap.open("C:\\Users\\xxx\\1.mp4");
實作視頻播放與暫停
這里我們主要捕捉滑鼠單擊事件,所以可以新建一個全域變數表示播放/暫停狀態,滑鼠單擊事件的回呼函式修改此變數,
使用以下代碼系結滑鼠事件到表單
setMouseCallback(windows_name, on_mouse_event, NULL);//第二個引數是回呼函式句柄,第三個引數是向回呼函式傳遞的引數指標,不用的話可以設定NULL
回呼函式可以這樣寫,這里我們只關注滑鼠單擊鍵位情況,不關心單擊位置等資訊,所以說哪些引數也沒有使用
void on_mouse_event(int event, int x, int y, int flags, void* param) {
if (event == 1) {
if (is_play == 1) {
is_play = 0;
}
else {
is_play = 1;
}
}
}
將視頻播放狀態與幀的更新相聯系,十分巧妙
if (is_play == 1) {
cap >> frame;
}
實作視頻進度條
對視頻進度的調整,我們可以使用VideoCapture物件的set方法設定下一幀,get方法獲取當前播放幀等,
首先我們獲取最大幀數,作為進度條最大值
int max_frame = cap.get(CAP_PROP_FRAME_COUNT);//獲取最大幀數
創建一個進度條 關于進度潭訓礎知識可以看這里
createTrackbar(progressBar_name, windows_name, &video_progress, max_frame, on_progress_change, &cap);
在播放程序中恰當位置更新進度條
setTrackbarPos(progressBar_name, windows_name, cap.get(CAP_PROP_POS_FRAMES));
設定進度條更新時的回呼函式
void on_progress_change(int pos, void* cap) {
VideoCapture this_cap = *(VideoCapture*) cap;
this_cap.set(CAP_PROP_POS_FRAMES, pos);
return;
}
恰當組合起來就好啦
其他問題
當然還有許多可以優化的地方,比如播放速率問題,這個可以獲取視頻幀速率來計算延時,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317726.html
標籤:其他
上一篇:深度學習--TensorFlow(專案)識別自己的手寫數字(基于CNN卷積神經網路)
下一篇:影像基本處理——影像閾值和平滑
