您好,登錄后才能下訂單哦!
OpenCV是一個開源的計算機視覺庫,它提供了許多用于實時計算機視覺的優化算法。在這里,我們將介紹如何使用OpenCV和C++實現一個簡單的物體跟蹤策略。我們將使用KCF(Kernelized Correlation Filter)算法進行跟蹤。
首先,確保已經安裝了OpenCV庫。接下來,創建一個新的C++項目,并包含以下頭文件:
#include<iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
然后,編寫以下代碼來實現物體跟蹤:
int main(int argc, char** argv) {
// 創建一個VideoCapture對象,用于讀取視頻文件或攝像頭
cv::VideoCapture cap(0); // 使用攝像頭,傳入0;若使用視頻文件,請傳入文件路徑
if (!cap.isOpened()) {
std::cerr << "無法打開攝像頭或視頻文件!"<< std::endl;
return -1;
}
// 獲取視頻的寬度和高度
int frameWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH);
int frameHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
// 創建一個窗口,用于顯示跟蹤結果
cv::namedWindow("Tracking", cv::WINDOW_NORMAL);
// 等待用戶選擇要跟蹤的物體區域
cv::Rect2d roi;
std::cout << "請在窗口中用鼠標拖拽選擇要跟蹤的物體區域,然后按回車鍵確認。"<< std::endl;
cv::setMouseCallback("Tracking", [](int event, int x, int y, int flags, void* userdata) {
if (event == cv::EVENT_LBUTTONDOWN) {
*((cv::Point*)userdata) = cv::Point(x, y);
}
}, &roi.tl());
cv::Mat frame;
while (true) {
cap >> frame;
if (frame.empty()) break;
if (roi.area() > 0) {
// 創建KCF跟蹤器
cv::Ptr<cv::Tracker> tracker = cv::TrackerKCF::create();
// 初始化跟蹤器
tracker->init(frame, roi);
// 更新ROI區域
roi = tracker->update(frame);
// 在幀上繪制跟蹤結果
cv::rectangle(frame, roi, cv::Scalar(0, 255, 0), 2);
}
// 顯示跟蹤結果
cv::imshow("Tracking", frame);
// 按ESC鍵退出
if (cv::waitKey(30) == 27) break;
}
// 釋放資源
cap.release();
cv::destroyAllWindows();
return 0;
}
這段代碼首先創建了一個VideoCapture
對象,用于從攝像頭或視頻文件中讀取幀。然后,它創建了一個名為“Tracking”的窗口,用于顯示跟蹤結果。接下來,程序等待用戶在窗口中用鼠標拖拽選擇要跟蹤的物體區域。當用戶按下回車鍵時,程序將使用KCF算法創建一個跟蹤器,并在每一幀上更新跟蹤結果。最后,程序在幀上繪制跟蹤結果,并顯示在窗口中。
要編譯和運行此代碼,請確保鏈接到OpenCV庫。在命令行中,可以使用以下命令進行編譯(假設源文件名為main.cpp
):
g++ main.cpp -o tracking `pkg-config --cflags --libs opencv4`
然后運行生成的可執行文件:
./tracking
現在,程序應該會打開一個窗口,顯示攝像頭或視頻文件的實時畫面。用鼠標拖拽選擇要跟蹤的物體區域,然后按回車鍵確認。程序將開始跟蹤選定的物體,并在幀上繪制跟蹤結果。按ESC鍵退出程序。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。