基于opencv和c++的目标追踪
时间: 2024-09-07 07:02:14 浏览: 44
在OpenCV(开源计算机视觉库)中,目标追踪通常使用模板匹配、卡尔曼滤波、光流法、Haar特征级联分类器或其他机器学习方法。以下是基于OpenCV的C++进行简单目标追踪的一个例子,使用了OpenCV自带的KCF(Kernelized Correlation Filter)算法,这是一个流行的实时目标追踪器:
```cpp
#include <opencv2/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/tracking.hpp>
cv::Ptr<cv::Tracker> tracker; // 创建KCF Tracker对象
void initTracker(cv::Mat& img, cv::Rect boundingBox) {
if (tracker.empty())
tracker = cv::Tracker_create("KCF"); // 初始化追踪器为KCF
tracker->init(img, boundingBox); // 传入初始化帧和目标框
}
void trackFrame(const cv::Mat& img) {
cv::Rect newBoundingBox = tracker->update(img); // 更新并获取新目标框
cv::rectangle(img, newBoundingBox, cv::Scalar(255, 0, 0), 2); // 在帧上画出新框
cv::imshow("Tracking", img); // 显示追踪结果
}
int main(int argc, char** argv) {
// 加载视频
cv::VideoCapture cap(argv[1]);
while (cap.isOpened()) {
cv::Mat frame, frame_gray;
cap >> frame;
if (frame.empty()) break; // 如果读取失败,退出循环
cv::cvtColor(frame, frame_gray, cv::COLOR_BGR2GRAY); // 转换到灰度图像
// 初始帧时进行目标框设定
if (tracker.empty()) {
cv::Rect boundingBox; // 提示用户选择目标区域
cv::selectROI("Select target", frame_gray, boundingBox, false);
initTracker(frame_gray, boundingBox);
} else {
trackFrame(frame_gray); // 否则持续追踪
}
cv::waitKey(1); // 每次按键暂停1毫秒
}
return 0;
}
阅读全文