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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。