日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中的类加多线程代码修炼之二

發布時間:2023/12/10 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中的类加多线程代码修炼之二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景:在上一篇文章中 寫到了我第一次使用C++使用多個類多個線程進行編程,由于是第一接手“這么大一個工程”,所以還是要有個參照物的,由于我呢之前好幾年一直在看的一個C++代碼工程就是ORB-SLAM了,這個工程使用C++語言,工程內有三個線程,多個類,代碼風格很好,通俗易懂,有很多值得我借鑒和學習的地方,所以我就按照ORB-SLAM工程的思路來組織我的代碼。

前情回顧:

我首先創建了四個類:

(1). Capturing類主要專注于相機相關的操作,比如相機的初始化,圖像獲取,開始,暫停等。

(2). Tracking類主要專注于目標跟蹤相關操作。

(3). System類相當于是一個管理者,就像ORB-SLAM中的System類,完成一些系統初始化的任務,其中我主要讓他完成,兩個線程的創建以及線程之間指針變量的設置(這一點很重要,我剛開始沒做相關設置,導致兩個線程之間數據傳輸時出了問題,下面會講到,嘻嘻)

(4). Frame類,這個類是我后來添加的,目前暫時封裝了“圖像本身”以及圖像的“時間戳”屬性。

兩個線程:我把主線程先保留了出來,又單獨創建了兩個線程

(1). 將Capturing中Run函數(用來實現連續從相機去圖像的工作)作為CaptureThread線程的線程入口。

(2). 將Tracking中Run函數(用來實現目標跟蹤的工作)作為TrackThread線程的線程入口。

我在上一篇文章中https://blog.csdn.net/weixin_38636815/article/details/112848772中講到了我完成了類的創建和線程的創建,并且測試兩個線程可以正常的同步工作,在這片文章中我主要解決的是我在兩個線程之間的數據傳輸過程中遇到的問題。

首先,我要明確我想要的什么,我需要將CaptureThread線程中從相機獲取的圖像傳給TrackingThread線程中去,繼續目標跟蹤處理,兩個線程,CaptureThread線程只負責獲取圖像數據,TrackingThread線程只負責目標跟蹤。但是最重點的是我要把CaptureThread線程中獲取的圖像傳給TrackingThread線程。

我學著ORB-SLAM的樣子,在Tracking類中創建了一個list變量,在Capturing中將獲取的圖像都插入到list中來,這樣在TrackingThread中就可以處理這些圖像了。

System.h

#ifndef SYSTEM_H #define SYSTEM_H #include <thread> #include "../include/Tracking.h" #include "../include/Capturing.h"namespace FDSST { class Tracking; class CaptureThread; class System { public:System();~System(); private:Tracking* mpTracker;Capturing* mpCapturer;bool mbCameraInited;//定義兩個線程std::thread* mptTrackThread;std::thread* mptCaptureThread; }; } #endif

System.cpp

#include <thread> #include "../include/System.h" namespace FDSST {System::System(){mbCameraInited = false;//創建相機獲取圖像線程mpCapturer = new Capturing();mptCaptureThread = new std::thread(&FDSST::Capturing::Run, mpCapturer);std::cout << "Capture thread has been created" << std::endl;//創建目標跟蹤線程mpTracker = new Tracking();mptTrackThread = new std::thread(&FDSST::Tracking::Run, mpTracker);std::cout << "Tracking thread has been created" << std::endl;}System::~System(){} }

Capturing.h

#ifndef Capturing_H #define Capturing_H #include <iostream>#include <opencv2/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp>#include <list> #include "../include/Tracking.h" #include "../include/Frame.h"using namespace std; using namespace cv;namespace FDSST { class System; class Tracking; class Frame; class Capturing { public:Capturing();~Capturing();void Run();void Stream();void Pause();void Stop();bool quit;public:Frame mCurrentFrame; protected:Tracking* mpTracker; }; }

Capturing.cpp

#include <iostream> #include <fstream> #include <string> #include <windows.h>#include "../include/Capturing.h"namespace FDSST { Capturing::Capturing(){} Capturing::~Capturing(){}void Capturing::Run() {//從本地讀入視頻來模擬從相機獲取圖像,要換成自己的視頻路徑呦std::string videoPath = "F:\\Programme\\object_detection\\fdsst\\data\\012.avi";cv::VideoCapture cap(videoPath);if (!cap.isOpened()){std::cout << "視頻打開失敗" << std::endl;return;}while (1){cv::Mat currentImg;double timestamp = (double)cv::getTickCount();cap >> currentImg;if (currentImg.rows <= 0 || currentImg.cols <= 0){break;}//將獲取的圖像實例化為Frame類的對象。Frame* pFrame = new Frame(currentImg, timestamp);//將Frame的指針對象插到在Tracking線程中創建的mlNewFrame的list中mpTracker->InsertFrames(pFrame);cv::imshow("test1", currentImg);cv::waitKey(1);}return; } void Capturing::Stream() {pause_status = false; }void Capturing::Pause() {pause_status = true; }void Capturing::Stop() {pause_status = true;quit = true; }

Tracking.h

#ifndef TRACKING_H #define TRACKING_H #include <mutex>#include "../include/Frame.h" #include "../include/Capturing.h"namespace FDSST { class Capturing; class Tracking { public:Tracking();~Tracking();void Run();void InsertImages(Frame* frame);int FramesInQueue() {std::unique_lock<std::mutex> lock(mMutexNewFrame);return mlNewFrames.size();}void SetCapturer(Capturing* pCapturer);protected://定義互斥鎖變量,確保在TrackThread線程中,在list中取圖像數據時,CaptureThread停止插入操作std::mutex mMutexNewFrame;//定義list變量,存儲從CaptureThread中傳遞的圖像數據。std::list<Frame*> mlNewFrames;Frame* mCurrentFrame;Capturing* mpCapturer;void ProcessNewFrames();bool CheckNewFrames();}; } #endif

Tracking.cpp

#include <iostream> #include <windows.h> #include <mutex> #include "../include/Capturing.h" #include "../include/Tracking.h" namespace FDSST {Tracking::Tracking(){}Tracking::~Tracking(){}void Tracking::Run(){while (1){if (CheckNewFrames()){ProcessNewFrames();}}}void Tracking::InsertFrames(Frame* frame){std::unique_lock<std::mutex> lock(mMutexNewFrame);mlNewFrames.push_back(frame);}void Tracking::ProcessNewFrames(){std::unique_lock<std::mutex> lock(mMutexNewFrame);mCurrentFrame = mlNewFrames.front();cv::Mat img = mCurrentFrame->mImage;mlNewFrames.pop_front();cv::imshow("test", img);cv::waitKey(1); }bool Tracking::CheckNewFrames(){std::unique_lock<std::mutex> lock(mMutexNewFrame);return (!mlNewFrames.empty());} }

Frame.h

#ifndef FRAME_H #define FRAME_H #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/core.hpp> namespace FDSST {class Frame{public:Frame();Frame(const cv::Mat& image, const double &timeStamp);private:cv::Mat mImage;double mTimeStamp;}; } #endif

我寫完上面的代碼進行測試,發現我的mpTracker為空,無法操作。

?于是我就在Capturing類的構造函數new了一個Tracking指針對象。mpTracker = new Tracking;

然后繼續編譯,發現代碼可以通過了,但是我從Tracking類中查看mlNewFrames變量長度,發現一只是0,也就是圖像沒有被插進來,我就很納悶,然后我就又回來研究ORB-SLAM 代碼,對比一下,我哪個地方沒有做好,找來找去,終于發現了,原來是忘了下面這里的設置。

于是我在Captureing類中添加了下面函數

void Capturing::SetTracker(Tracking* pTracker) {mpTracker = pTracker; }

在Tracking類中添加下面函數

void Tracking::SetCapturer(Capturing* pCapturer) {mpCapturer = pCapturer; }

在System的構造函數中添加下面語句

System::System() {//創建相機獲取圖像線程mpCapturer = new Capturing();mptCaptureThread = new std::thread(&FDSST::Capturing::Run, mpCapturer);std::cout << "Capture thread has been created" << std::endl;//創建目標跟蹤線程mpTracker = new Tracking();mptTrackThread = new std::thread(&FDSST::Tracking::Run, mpTracker);std::cout << "Tracking thread has been created" << std::endl;//Set pointers between threadsmpTracker->SetCapturer(mpCapturer);mpCapturer->SetTracker(mpTracker);}

經過以上改進CpatureThread中的Frame可以傳送到TrackThread中來了。

感覺好像是他們在互相交換信息。但是我還是不太清楚這樣操作的目的,經過Set函數之后,將mpTracker就不是空了,而是將mpTracker賦值給他,而mpTracker = new Tracking(),這不很像我剛才的補救措施mpTracker = new Tracking;嘛,我的操作不夠專業。

現在終于把這個實現兩個線程之間數據傳輸的代碼實現了,雖然簡單,但對我來說是一次進步,我不需要跟別人比較,只要我今天跟昨天相比有進步,我就感覺這一天過的有意義,我很開心。

?

?

總結

以上是生活随笔為你收集整理的C++中的类加多线程代码修炼之二的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产极品999 | 在线观看视频99 | 韩国成人在线 | 久久免费的精品国产v∧ | 欧美中文字幕在线 | www黄色com | 亚洲影院av| 牛av在线| 亚洲国产123| 狠狠操影视 | 免费看特级毛片 | 亚洲涩涩视频 | 超级乱淫视频 | 婷婷久久精品 | 美女被捅个不停 | 99久久精品免费看国产四区 | 久久艹中文字幕 | 国产精品 日韩 | 国产三级精品三级在线观看 | va在线看 | 刘亦菲一区二区三区免费看 | 激情成人综合 | 熟女毛毛多熟妇人妻aⅴ在线毛片 | 国产四区| 男人操女人的网站 | 欧美成人免费播放 | 国产女主播一区二区 | 亚洲精品男人天堂 | 久久久久亚洲 | 成年人av网站 | 亚洲欧美中文日韩在线v日本 | 污视频网址 | 少妇脚交调教玩男人的视频 | 成人欧美一区二区三区在线播放 | 欧美国产三级 | 日一区二区 | 操操影视 | 国产免费一区二区三区最新6 | 四虎影视免费在线观看 | 另类亚洲色图 | 亚洲熟妇无码av在线播放 | 浪浪视频在线观看 | 日本高清免费看 | 午夜精品久久久久久久 | 国产亚洲精品久久久久久无几年桃 | 亚洲区在线| 一本无码aⅴ久久久国产 | 日本一区二区三区在线免费观看 | 在线高清av | 欧州一级片 | 一区二区精 | 欧美另类综合 | 男女做爰猛烈高潮描写 | av线上免费观看 | 亚洲三级在线 | 性激烈视频在线观看 | 伊人黄| 黄页网址大全免费观看 | 国产福利网 | 欧美激情福利 | 亚洲一级在线观看 | 黄色免费视频观看 | 天天干干| www久久久com| 日日夜夜艹 | 一区二区三区四区免费观看 | 婷婷亚洲综合 | 天堂精品视频 | 草莓视频成人在线 | 亚洲少妇视频 | 欧美一级淫片免费视频黄 | 锕锕锕锕锕锕锕锕 | 日韩国产欧美视频 | 日韩av一二三 | 91精品国产91久久久久久久久久久久 | 日本少妇喷水视频 | 九九热精品视频在线观看 | 国产精品乱子伦 | 国产成人无码一区二区在线观看 | 久久精品区 | 黑森林福利视频导航 | 97精品国产97久久久久久春色 | 少妇做爰k8经典 | 懂色一区二区三区免费观看 | 四虎首页| 天堂…中文在线最新版在线 | 国产精品久久久久久av | 亚洲xxxx18| 深夜视频一区二区 | 高清久久久久久 | 欧美精品一区二区三区久久久 | 午夜少妇av| 中文有码在线 | 欧美美女在线观看 | 一区二区三区在线视频观看 | 三级色网 | 日韩不卡一二三区 | 狠狠干在线观看 | 竹菊影视日韩一区二区 |