最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Qt+opencv開(kāi)發(fā)的視頻播放器示例詳解

 更新時(shí)間:2023年08月24日 09:55:07   作者:coder_Alaric  
這篇文章主要為大家介紹了基于Qt+opencv開(kāi)發(fā)的視頻播放器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1、開(kāi)發(fā)環(huán)境

Qt:Qt5.14

opencv:4.5.5

2、效果展示

可以實(shí)現(xiàn)播放、暫停、快進(jìn)、后退、重新播放、停止、拖動(dòng)進(jìn)度條等功能;

3、代碼功能解析

3.1 opencv庫(kù)加載

因?yàn)槭褂昧薿pencv的VideoCapture來(lái)加載視頻,這里需要添加opencv的庫(kù),右鍵項(xiàng)目工程添加外部庫(kù),填入opencv的庫(kù)和頭文件路徑,或者直接在皮肉文件下添加庫(kù)的文件路徑。

win32:CONFIG(release, debug|release): LIBS += -LD:/opencv/build/x64/vc15/lib/ -lopencv_world455
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/opencv/build/x64/vc15/lib/ -lopencv_world455d

INCLUDEPATH += D:/opencv/build/include
DEPENDPATH += D:/opencv/build/include

這里我的opencv路徑在D盤對(duì)應(yīng)路徑下。

3.2 重寫horizontalSlider點(diǎn)擊事件

這里需要點(diǎn)擊進(jìn)度條實(shí)現(xiàn)視頻跳轉(zhuǎn)到當(dāng)前進(jìn)度的功能,這里需要對(duì)horizontalSlider的點(diǎn)擊事件函數(shù)進(jìn)行重寫。實(shí)現(xiàn)點(diǎn)擊后獲取點(diǎn)擊處的進(jìn)度值并更新進(jìn)度條。

#include "newqslider.h"
newqslider::newqslider(QWidget *parent) : QSlider(parent)
{
}
/*****************************************************************
* 函數(shù)名稱:mousePressEvent(QMouseEvent *ev)
* 功能描述:重寫鼠標(biāo)點(diǎn)擊事件,實(shí)現(xiàn)進(jìn)度條點(diǎn)擊哪跳到哪
* 參數(shù)說(shuō)明: 無(wú)
* 返回值:   無(wú)
******************************************************************/
void newqslider::mousePressEvent(QMouseEvent *ev)
{
    //先調(diào)用父類的鼠標(biāo)點(diǎn)擊處理事件,這樣可以不影響拖動(dòng)的情況
    QSlider::mousePressEvent(ev);
    //獲取鼠標(biāo)的位置,這里并不能直接從ev中取值(因?yàn)槿绻峭蟿?dòng)的話,鼠標(biāo)開(kāi)始點(diǎn)擊的位置沒(méi)有意義了)
    double pos = ev->pos().x() / (double)width();
    setValue(pos * (maximum() - minimum()) + minimum());
    //發(fā)送自定義的鼠標(biāo)單擊信號(hào)
    emit costomSliderClicked();
}

3.3 opencv采集線程

videothread.h
#include <QObject>
#include <QThread>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <QDebug>
#include <QDateTime>
using namespace  std;
using namespace  cv;
class videothread : public QThread
{
    Q_OBJECT
public:
    videothread(const char* filename);
    void run();
    //釋放視頻采集對(duì)象
    void releaseCap();
    //獲取視頻總幀數(shù)
    int getVideoAllFramecount();
    //設(shè)置當(dāng)前進(jìn)度條
    void setCurrentFrame(int value);
    bool getStop() const;
    //設(shè)置視頻結(jié)束標(biāo)識(shí)
    void setStop(bool value);
    bool getIsrun() const;
    void setIsrun(bool value);
    //暫停
    void pauseThread();
    //繼續(xù)
    void resumeThread();
    //停止
    void stopThread();
signals:
    //發(fā)送當(dāng)前幀和 幀數(shù)
    void sendFrame(int currentFrame,Mat frame);
private:
    //視頻對(duì)象
    VideoCapture cap;
    Mat frame;
    //視頻當(dāng)前幀數(shù)
    int currentFramecount;
    //總幀數(shù)
    int allFramecount;
    //視頻幀率
    int fps;
    //錄制視頻幀
    int videoWriterFrame;
    //線程結(jié)束標(biāo)識(shí)位
    bool stop;
    //視頻暫停標(biāo)識(shí)位
    bool isrun;
};

采集線程中設(shè)置了暫停、繼續(xù)播放、停止,并可以獲取幀率和幀率數(shù)量;

videothread.cpp
#include "videothread.h"
videothread::videothread(const char* filename)
{
    this->stop = false;
    this->isrun =false;
    this->currentFramecount=0;
    this->videoWriterFrame=0;
    if(cap.open(filename));//創(chuàng)建視頻對(duì)象
    {
        this->allFramecount=cap.get(CAP_PROP_FRAME_COUNT);//獲取視頻文件中的總幀數(shù)
        this->fps=int(round(cap.get(CAP_PROP_FPS)));//獲取視頻幀率
    }
}
void videothread::run()
{
    while(stop==false)//線程運(yùn)行和停止  卡住線程 暫停時(shí)不退出線程
    {
        while(isrun==true)//視頻運(yùn)行和暫停
        {
            if(cap.read(frame))//捕獲視頻幀
            {
                this->currentFramecount++;
                cvtColor(frame, frame, COLOR_BGR2RGB);//opencvBGR格式轉(zhuǎn)成Image用到的RGB
                emit sendFrame(currentFramecount,frame);//發(fā)送幀數(shù)據(jù)
            }
            msleep(40);//延時(shí)
        }
    }
    cap.release();//釋放打開(kāi)的視頻
}
int videothread::getVideoAllFramecount()
{
    return allFramecount;
}
void videothread::setStop(bool value)
{
    stop = value;
}
void videothread::setCurrentFrame(int value)
{
    this->currentFramecount=value;//當(dāng)前幀數(shù)
    cap.set(CAP_PROP_POS_FRAMES,currentFramecount);//進(jìn)度條跳轉(zhuǎn)對(duì)應(yīng)幀
}
bool videothread::getIsrun() const
{
    return isrun;
}
void videothread::setIsrun(bool value)
{
    isrun = value;
}
void videothread::pauseThread()//這兩個(gè)函數(shù)用于確保是在運(yùn)行情況下才能切換狀態(tài)
{
    if(this->isRunning()&&this->isrun==true)//當(dāng)前線程運(yùn)行且視頻運(yùn)行
    {
        this->isrun=false;
    }
}
void videothread::resumeThread()
{
    if(this->isRunning()&&this->isrun==false)//當(dāng)前線程運(yùn)行且視頻暫停
    {
        this->isrun=true;
    }
}
void videothread::stopThread()
{
    if(this->isRunning())//當(dāng)前線程運(yùn)行
    {
        this->stop=true;//結(jié)束線程
        //msleep(10);
        releaseCap();
        this->terminate();
    }
}
bool videothread::getStop() const
{
    return stop;
}
void videothread::releaseCap()
{
    if(cap.isOpened()){
        cap.release();
    }
}

總結(jié)

此視頻播放器只涉及到opencv加載視頻和對(duì)視頻幀的處理,以及進(jìn)度條管理等部分功能,包括加載視頻后線程發(fā)送視頻幀圖像和幀數(shù),再使用中需要注意線程指針的創(chuàng)建和釋放、opencv采圖對(duì)象的新建和釋放,不然頻繁停止和加載會(huì)出現(xiàn)野指針和內(nèi)存泄漏的bug。

源碼學(xué)習(xí)

最后附上源碼大家交流學(xué)習(xí),可以在倉(cāng)庫(kù)按需自取,倉(cāng)庫(kù)中代碼僅供學(xué)習(xí)使用。如果對(duì)自己有幫助,麻煩點(diǎn)個(gè)星支持一下。

videoPlay視頻播放器源碼

以上就是基于Qt+opencv開(kāi)發(fā)的視頻播放器示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Qt opencv視頻播放器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作示例

    基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作示例

    這篇文章主要介紹了基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作,結(jié)合實(shí)例形式分析了C++實(shí)現(xiàn)的哈夫曼編碼解碼相關(guān)定義與使用技巧,需要的朋友可以參考下
    2018-04-04
  • C語(yǔ)言結(jié)構(gòu)體指針引用詳解

    C語(yǔ)言結(jié)構(gòu)體指針引用詳解

    C語(yǔ)言中結(jié)構(gòu)體指針,可細(xì)分為指向結(jié)構(gòu)體變量的指針和指向結(jié)構(gòu)體數(shù)組的指針。本文將詳細(xì)為大家介紹一下這兩種結(jié)構(gòu)體指針如何引用,需要的小伙伴可以參考一下
    2021-12-12
  • C語(yǔ)言使用DP動(dòng)態(tài)規(guī)劃思想解最大K乘積與乘積最大問(wèn)題

    C語(yǔ)言使用DP動(dòng)態(tài)規(guī)劃思想解最大K乘積與乘積最大問(wèn)題

    Dynamic Programming動(dòng)態(tài)規(guī)劃方法采用最優(yōu)原則來(lái)建立用于計(jì)算最優(yōu)解的遞歸式,并且考察每個(gè)最優(yōu)決策序列中是否包含一個(gè)最優(yōu)子序列,這里我們就來(lái)展示C語(yǔ)言使用DP動(dòng)態(tài)規(guī)劃思想解最大K乘積與乘積最大問(wèn)題
    2016-06-06
  • C語(yǔ)言修煉之路數(shù)據(jù)類型悟正法?解析存儲(chǔ)定風(fēng)魔上篇

    C語(yǔ)言修煉之路數(shù)據(jù)類型悟正法?解析存儲(chǔ)定風(fēng)魔上篇

    使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2022-02-02
  • C++中allocator類使用示例

    C++中allocator類使用示例

    大家好,本篇文章主要講的是C++中allocator類使用示例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • C++20中的結(jié)構(gòu)化綁定類型示例詳解

    C++20中的結(jié)構(gòu)化綁定類型示例詳解

    這篇文章主要為大家介紹了C++20中的結(jié)構(gòu)化綁定類型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • C++實(shí)現(xiàn)矩陣原地轉(zhuǎn)置算法

    C++實(shí)現(xiàn)矩陣原地轉(zhuǎn)置算法

    這篇文章主要介紹了C++實(shí)現(xiàn)矩陣原地轉(zhuǎn)置算法,非常經(jīng)典的算法,需要的朋友可以參考下
    2014-08-08
  • windows下在vim中搭建c語(yǔ)言開(kāi)發(fā)環(huán)境的詳細(xì)過(guò)程

    windows下在vim中搭建c語(yǔ)言開(kāi)發(fā)環(huán)境的詳細(xì)過(guò)程

    這篇文章主要介紹了windows下在vim中搭建c語(yǔ)言開(kāi)發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • Qt拖放操作和打印操作的實(shí)現(xiàn)

    Qt拖放操作和打印操作的實(shí)現(xiàn)

    本文主要介紹了Qt拖放操作和打印操作的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • C/C++ 中memset() 函數(shù)詳解及其作用介紹

    C/C++ 中memset() 函數(shù)詳解及其作用介紹

    這篇文章主要介紹了C/C++ 中memset() 函數(shù)詳解及其作用介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論

天津市| 汕头市| 房山区| 兴文县| 古丈县| 阳山县| 南溪县| 平武县| 横山县| 延长县| 温宿县| 吐鲁番市| 嵊州市| 济源市| 桐城市| 浦县| 卢湾区| 建平县| 兴文县| 绥化市| 荃湾区| 富源县| 平昌县| 婺源县| 夹江县| 体育| 大庆市| 丽江市| 永年县| 利津县| 佛教| 临沂市| 泸定县| 博乐市| 东台市| 西林县| 江北区| 年辖:市辖区| 磐石市| 小金县| 麻城市|