您好,登錄后才能下訂單哦!
OpenCV是一個開源的計(jì)算機(jī)視覺庫,它提供了許多用于實(shí)時計(jì)算機(jī)視覺的優(yōu)化算法。在這里,我們將介紹如何使用OpenCV和C++實(shí)現(xiàn)一個簡單的物體跟蹤策略。我們將使用KCF(Kernelized Correlation Filter)算法進(jìn)行跟蹤。
首先,確保已經(jīng)安裝了OpenCV庫。接下來,創(chuàng)建一個新的C++項(xiàng)目,并包含以下頭文件:
#include<iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
然后,編寫以下代碼來實(shí)現(xiàn)物體跟蹤:
int main(int argc, char** argv) {
// 創(chuàng)建一個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);
// 創(chuàng)建一個窗口,用于顯示跟蹤結(jié)果
cv::namedWindow("Tracking", cv::WINDOW_NORMAL);
// 等待用戶選擇要跟蹤的物體區(qū)域
cv::Rect2d roi;
std::cout << "請?jiān)诖翱谥杏檬髽?biāo)拖拽選擇要跟蹤的物體區(qū)域,然后按回車鍵確認(rèn)。"<< 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) {
// 創(chuàng)建KCF跟蹤器
cv::Ptr<cv::Tracker> tracker = cv::TrackerKCF::create();
// 初始化跟蹤器
tracker->init(frame, roi);
// 更新ROI區(qū)域
roi = tracker->update(frame);
// 在幀上繪制跟蹤結(jié)果
cv::rectangle(frame, roi, cv::Scalar(0, 255, 0), 2);
}
// 顯示跟蹤結(jié)果
cv::imshow("Tracking", frame);
// 按ESC鍵退出
if (cv::waitKey(30) == 27) break;
}
// 釋放資源
cap.release();
cv::destroyAllWindows();
return 0;
}
這段代碼首先創(chuàng)建了一個VideoCapture
對象,用于從攝像頭或視頻文件中讀取幀。然后,它創(chuàng)建了一個名為“Tracking”的窗口,用于顯示跟蹤結(jié)果。接下來,程序等待用戶在窗口中用鼠標(biāo)拖拽選擇要跟蹤的物體區(qū)域。當(dāng)用戶按下回車鍵時,程序?qū)⑹褂肒CF算法創(chuàng)建一個跟蹤器,并在每一幀上更新跟蹤結(jié)果。最后,程序在幀上繪制跟蹤結(jié)果,并顯示在窗口中。
要編譯和運(yùn)行此代碼,請確保鏈接到OpenCV庫。在命令行中,可以使用以下命令進(jìn)行編譯(假設(shè)源文件名為main.cpp
):
g++ main.cpp -o tracking `pkg-config --cflags --libs opencv4`
然后運(yùn)行生成的可執(zhí)行文件:
./tracking
現(xiàn)在,程序應(yīng)該會打開一個窗口,顯示攝像頭或視頻文件的實(shí)時畫面。用鼠標(biāo)拖拽選擇要跟蹤的物體區(qū)域,然后按回車鍵確認(rèn)。程序?qū)㈤_始跟蹤選定的物體,并在幀上繪制跟蹤結(jié)果。按ESC鍵退出程序。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。