国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Qt 多線程+opencv 讀取和顯示圖像】

這篇具有很好參考價(jià)值的文章主要介紹了【Qt 多線程+opencv 讀取和顯示圖像】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔


前言

提示:這里可以添加本文要記錄的大概內(nèi)容:

工程需要Qt多線程+opencv 結(jié)合信號(hào)與槽讀取和顯示圖像

提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

一、例程

加入了信號(hào)與槽機(jī)制來(lái)處理多線程中的圖像數(shù)據(jù):

  1. 創(chuàng)建工作線程類:首先創(chuàng)建一個(gè)工作線程類,它從QThread繼承并包含一個(gè)信號(hào)來(lái)發(fā)送圖像數(shù)據(jù)。
class WorkerThread : public QThread
{
    Q_OBJECT

public:
    void run() override {
        // 讀取圖像數(shù)據(jù)
        cv::Mat image = cv::imread("path_to_image.jpg");
        emit imageReady(image); // 發(fā)出信號(hào),傳遞圖像數(shù)據(jù)
    }

signals:
    void imageReady(const cv::Mat &image); // 信號(hào),傳遞圖像數(shù)據(jù)
};
  1. 創(chuàng)建主窗口類:創(chuàng)建一個(gè)主窗口類,其中包含一個(gè)槽函數(shù)來(lái)接收工作線程發(fā)出的信號(hào),并在主線程中顯示圖像。
class MainWindow : public QObject {
    Q_OBJECT

public:
    MainWindow() {
        // 創(chuàng)建工作線程實(shí)例并啟動(dòng)
        WorkerThread *thread = new WorkerThread();
        connect(thread, &WorkerThread::imageReady, this, &MainWindow::displayImage); // 連接信號(hào)和槽
        thread->start();
    }

public slots:
    void displayImage(const cv::Mat &image) {
        // 在主線程中顯示圖像
        cv::imshow("Image Display", image);
        cv::waitKey(0); // 等待用戶按鍵,保持顯示狀態(tài)
    }
};
  1. 連接信號(hào)和槽:在主窗口類的構(gòu)造函數(shù)中,我們使用connect函數(shù)將工作線程的imageReady信號(hào)連接到主窗口類的displayImage槽。這樣,當(dāng)工作線程完成圖像讀取并發(fā)出imageReady信號(hào)時(shí),displayImage槽函數(shù)將被自動(dòng)調(diào)用。
  2. 主函數(shù):最后,在主函數(shù)中創(chuàng)建主窗口類的實(shí)例并運(yùn)行應(yīng)用程序。
int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    MainWindow mainWindow;
    return a.exec();
}

這個(gè)例子展示了如何使用Qt的信號(hào)與槽機(jī)制在多線程環(huán)境中安全地處理圖像數(shù)據(jù)。工作線程讀取圖像數(shù)據(jù)并通過(guò)信號(hào)發(fā)送,主線程通過(guò)槽函數(shù)接收并顯示圖像,確保了線程安全和正確的同步。

二、線程的開(kāi)啟和關(guān)閉

在Qt中,線程的開(kāi)始和關(guān)閉可以通過(guò)以下方式實(shí)現(xiàn):

  1. 啟動(dòng)線程

    • 定義工作類:通常,你會(huì)創(chuàng)建一個(gè)類來(lái)繼承QThread,并重寫其run()函數(shù)。在這個(gè)函數(shù)中,你可以定義線程應(yīng)該執(zhí)行的代碼。
    • 實(shí)例化并啟動(dòng)線程:在主函數(shù)中,你可以實(shí)例化這個(gè)工作類,并調(diào)用其start()方法來(lái)啟動(dòng)線程。
  2. 關(guān)閉線程

    • 優(yōu)雅地關(guān)閉線程:在線程的run()函數(shù)中,你可以使用一個(gè)標(biāo)志變量(如volatile bool m_toStop)來(lái)判斷是否需要從run()函數(shù)返回。在線程運(yùn)行的過(guò)程中,你可以檢查這個(gè)標(biāo)志變量的值來(lái)決定是否需要停止線程。當(dāng)線程需要停止時(shí),設(shè)置這個(gè)標(biāo)志變量為true。在線程的run()函數(shù)結(jié)束時(shí),線程自然死亡。
    • 強(qiáng)制關(guān)閉線程:如果需要立即停止線程,可以使用thread->quit()thread->wait()方法。前者會(huì)嘗試停止正在運(yùn)行的線程,后者會(huì)等待線程結(jié)束。

請(qǐng)注意,關(guān)閉線程時(shí)需要確保線程已經(jīng)完成了其任務(wù),避免資源泄露或數(shù)據(jù)不一致的問(wèn)題。同時(shí),處理多線程時(shí)需要考慮到線程同步和互斥的問(wèn)題,確保線程安全地訪問(wèn)共享資源。

以下是一個(gè)使用Qt多線程的詳細(xì)例程:

#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include <QTimer>

class Worker : public QThread
{
    Q_OBJECT

public:
    Worker() {}
    void run() override {
        int i = 0;
        while (!isInterruptionRequested()) {
            qDebug() << "Thread is running" << ++i;
            QThread::sleep(1); // 模擬耗時(shí)操作
        }
    }
};

class MainWindow : public QObject {
    Q_OBJECT
public:
    MainWindow(QObject *parent = nullptr) : QObject(parent) {
        Worker *worker = new Worker();
        connect(worker, &Worker::started, this, &MainWindow::onWorkerStarted);
        connect(worker, &Worker::finished, this, &MainWindow::onWorkerFinished);
        worker->start(); // 啟動(dòng)線程
    }

public slots:
    void onWorkerStarted() { qDebug() << "Worker started"; }
    void onWorkerFinished() { qDebug() << "Worker finished"; }
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    MainWindow mainWindow;
    return a.exec();
}

這個(gè)例程中,我們創(chuàng)建了一個(gè)Worker類來(lái)繼承QThread,并重寫了其run()函數(shù)。在run()函數(shù)中,我們使用一個(gè)循環(huán)來(lái)模擬線程的持續(xù)運(yùn)行,并每隔1秒打印一條消息。我們還定義了一個(gè)MainWindow類,其中包含一個(gè)工作線程的實(shí)例。通過(guò)連接工作線程的startedfinished信號(hào)到主窗口類的槽函數(shù),我們可以在工作線程開(kāi)始和結(jié)束時(shí)執(zhí)行特定的操作。最后,在主函數(shù)中,我們創(chuàng)建了主窗口類的實(shí)例并運(yùn)行應(yīng)用程序。

三、判斷線程是否還在運(yùn)行

在Qt中,判斷線程是否仍在運(yùn)行可以通過(guò)檢查線程的狀態(tài)來(lái)實(shí)現(xiàn)。Qt提供了QThread::isRunning()函數(shù),該函數(shù)返回一個(gè)布爾值,表示線程是否正在運(yùn)行。

以下是一個(gè)簡(jiǎn)單的示例代碼,演示如何使用isRunning()函數(shù)來(lái)判斷線程是否仍在運(yùn)行:

#include <QCoreApplication>
#include <QThread>
#include <QDebug>

class MyThread : public QThread {
    Q_OBJECT
public:
    MyThread(QObject *parent = nullptr) : QThread(parent) {}

    void run() override {
        // 線程執(zhí)行的代碼
        qDebug() << "Thread started";
        // ...
        // 線程結(jié)束前的操作
        qDebug() << "Thread finished";
        exit(0); // 結(jié)束線程
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    MyThread thread;
    thread.start(); // 啟動(dòng)線程

    // 檢查線程是否仍在運(yùn)行
    while (thread.isRunning()) {
        qDebug() << "Thread is still running";
        QThread::sleep(1); // 等待一段時(shí)間,避免過(guò)度消耗CPU資源
    }
    qDebug() << "Thread has finished";

    return a.exec();
}

在上面的代碼中,我們創(chuàng)建了一個(gè)自定義的MyThread類,它繼承自QThread。在run()函數(shù)中,我們定義了線程要執(zhí)行的代碼。在主函數(shù)中,我們創(chuàng)建了MyThread的實(shí)例,并調(diào)用其start()方法來(lái)啟動(dòng)線程。然后,我們使用一個(gè)while循環(huán)來(lái)檢查線程是否仍在運(yùn)行。如果線程仍在運(yùn)行,循環(huán)會(huì)繼續(xù)執(zhí)行并打印消息。在每次循環(huán)迭代之間,我們使用QThread::sleep(1)來(lái)等待一段時(shí)間,以避免過(guò)度消耗CPU資源。當(dāng)線程結(jié)束時(shí),isRunning()函數(shù)將返回false,循環(huán)將停止執(zhí)行。最后,我們打印一條消息表示線程已經(jīng)完成。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-826158.html

總結(jié)

到了這里,關(guān)于【Qt 多線程+opencv 讀取和顯示圖像】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【基于Qt和OpenCV的多線程圖像識(shí)別應(yīng)用】

    【基于Qt和OpenCV的多線程圖像識(shí)別應(yīng)用】

    這是一個(gè)簡(jiǎn)單的小項(xiàng)目,使用Qt和OpenCV構(gòu)建的多線程圖像識(shí)別應(yīng)用程序,旨在識(shí)別圖像中的人臉并將結(jié)果保存到不同的文件夾中。這個(gè)項(xiàng)目結(jié)合了圖像處理、多線程編程和用戶界面設(shè)計(jì)。 用戶可以通過(guò)界面選擇要識(shí)別的文件夾和保存結(jié)果的文件夾。然后,啟動(dòng)識(shí)別進(jìn)程。圖像

    2024年02月05日
    瀏覽(23)
  • 3. QT環(huán)境下使用OPenCV操作圖像數(shù)據(jù)(讀取、保存、尺寸調(diào)節(jié)、色彩變換等)

    1. 說(shuō)明 圖像加載完成后,如果需要顯示出來(lái),需要使用 imshow 函數(shù),在QT框架下,可以不使用這個(gè)函數(shù)。本文的操作都是將讀取到的圖像數(shù)據(jù)繪制到一個(gè) QLabel 控件上即可。 使用opencv自帶的顯示函數(shù)示例:

    2024年02月09日
    瀏覽(25)
  • 【Qt】用QWidget顯示opencv采集的攝像頭圖像

    【Qt】用QWidget顯示opencv采集的攝像頭圖像

    本案例用QWidget容器重寫paintEvent函數(shù)來(lái)顯示OpenCv采集的攝像頭畫面,圖像還可以自適應(yīng)QWidget的大小,還可以檢測(cè)相機(jī)斷開(kāi)失聯(lián)的情況(可能是掉電、線被拔了等待)。在改變窗口大小時(shí)暫停顯示圖像,防止莫名其妙的卡頓奔潰錯(cuò)誤?。@示圖像的方式有很多種,可以用QLabel顯

    2024年02月13日
    瀏覽(43)
  • 4. QT環(huán)境下使用OPenCV(視頻或攝像頭讀取顯示在QLabel控件上)

    4. QT環(huán)境下使用OPenCV(視頻或攝像頭讀取顯示在QLabel控件上)

    1. 說(shuō)明 在用opencv處理圖像時(shí),圖像的來(lái)源大部分情況下是從視頻中讀取過(guò)來(lái)的,視頻可以是本地保存的視頻,也可以是本地?cái)z像頭或者網(wǎng)絡(luò)攝像頭實(shí)時(shí)拍攝的視頻。 效果展示: opencv讀取視頻 2. 具體操作 關(guān)于視頻的讀取,實(shí)際上也是從視頻中將每一幀圖像加載后,顯示到Q

    2024年02月04日
    瀏覽(25)
  • 5. QT環(huán)境下使用OPenCV(基于TCP實(shí)現(xiàn)攝像頭圖像數(shù)據(jù)的多線程傳輸)

    5. QT環(huán)境下使用OPenCV(基于TCP實(shí)現(xiàn)攝像頭圖像數(shù)據(jù)的多線程傳輸)

    1. 說(shuō)明 通常情況下對(duì)于圖像數(shù)據(jù)的采集可以放在后端進(jìn)行,采集到的圖像數(shù)據(jù)如果有需要可以通過(guò)通信將數(shù)據(jù)傳輸?shù)角岸诉M(jìn)行顯示,這其中需要使用到TCP數(shù)據(jù)傳輸協(xié)議和QT下的多線程開(kāi)發(fā)技術(shù)。 QT當(dāng)中主線程一般是界面層次的,在主線程中執(zhí)行耗時(shí)較長(zhǎng)的數(shù)據(jù)操作,會(huì)引起界

    2024年02月11日
    瀏覽(49)
  • openCV圖像讀取和顯示

    openCV圖像讀取和顯示

    運(yùn)行 imread是OpenCV圖像處理庫(kù)中的一個(gè)函數(shù),用于從文件中讀取圖像數(shù)據(jù)并將其存儲(chǔ)為一個(gè)Mat對(duì)象 其中,參數(shù)filename指定了要讀取的圖像文件的路徑和文件名;參數(shù)flags指定了讀取圖像時(shí)的標(biāo)志,它是一個(gè)可選參數(shù),默認(rèn)值為IMREAD_COLOR,表示讀取彩色圖像。 imread函數(shù)支持讀取多

    2024年02月14日
    瀏覽(19)
  • 如何使用OpenCV進(jìn)行圖像讀取和顯示?

    如何使用OpenCV進(jìn)行圖像讀取和顯示?

    使用OpenCV進(jìn)行圖像讀取和顯示是計(jì)算機(jī)視覺(jué)領(lǐng)域中的常見(jiàn)任務(wù)之一。下面是關(guān)于如何使用OpenCV進(jìn)行圖像讀取和顯示的簡(jiǎn)要步驟和示例代碼。?? ?首先,你需要安裝OpenCV庫(kù)并確保正確導(dǎo)入它。然后,按照以下步驟執(zhí)行圖像讀取和顯示操作: 導(dǎo)入OpenCV庫(kù): 讀取圖像文件: 在這個(gè)

    2024年02月06日
    瀏覽(24)
  • OpenCV讀取一張深度圖像并顯示

    OpenCV讀取一張深度圖像并顯示

    2024年02月12日
    瀏覽(24)
  • 加載美女圖片之OpenCV 圖像讀取與顯示

    加載美女圖片之OpenCV 圖像讀取與顯示

    ??作者介紹:22級(jí)樹(shù)莓人(計(jì)算機(jī)專業(yè)),熱愛(ài)編程<目前在c++和openCv階段——目標(biāo)Windows,MySQL,Qt,數(shù)據(jù)結(jié)構(gòu)與算法,openCv,Linux,多線程,會(huì)持續(xù)分享學(xué)習(xí)成果和小項(xiàng)目的 ??作者主頁(yè):熱愛(ài)編程的小K ??專欄鏈接:OpenCV ??歡迎各位→點(diǎn)贊?? + 收藏?? + 留言??? ??

    2023年04月15日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包