[英]OpenCV C++ Multi-threading to Improve Framerate
我有一個opencv程序,在該程序中,圖像處理對視頻捕獲中具有穩定且相對較高的幀速率很敏感。 不幸的是,我所做的所有圖像處理都大大降低了幀速率,導致程序出現錯誤行為。 我相信將相機放在單獨的線程上並在其自己的線程上進行圖像處理會提高幀速率,但是我不確定如何做到這一點。 誰能指導我完成整個過程?
更新:在對線程進行了一些研究之后,我設法實現了線程化,以顯示最終經過處理的最終視頻提要。 但是,以某種方式實現它會導致圖像處理方法失敗(例如,在我可以成功跟蹤運動對象之前,現在不管是否跟蹤它都是錯誤的)。 我懷疑這與圖像處理算法在讀取新幀時不能足夠快地處理每個幀有關。我如何改進此實現,以使我的處理方法可以像在沒有多線程的情況下那樣工作?
void CaptureFrames() {
VideoCapture capture(0);
if (!capture.isOpened()) {
cout << "cannot open camera" << endl;
}
while (true) {
//CAMERAFRAME is a global Mat defined at the top of my program
capture.read(CAMERAFRAME);
if (waitKey(30) >= 0) { break; }
}
}
void ProcessFrames() {
while (true) {
Mat hsvFrame;
Mat binMat;
Mat grayFrame;
Mat grayBinMat;
if (!CAMERAFRAME.empty()) {
//do image processing functions (these worked before implementing threads and are not causing errors)
imshow("gray binary", grayBinMat);
imshow("multithread test", CAMERAFRAME);
}
if (waitKey(30) >= 0) { break; }
}
}
int main(int argc, char** argv[]) {
thread t1(CaptureFrames);
thread t2(ProcessFrames);
while(true) {
if(waitKey(30) >= 0) {break;}
}
return 0;
}
再次嘗試使用舊版本,但請從ProcessFrames
函數中刪除最后一行。
if (waitKey(30) >= 0) { break; }
在顯示圖像時,不要讓它再次等待30毫秒,while循環就足夠了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.