C++ opencv目标跟踪
时间: 2023-11-04 18:51:59 浏览: 195
C++中使用OpenCV进行目标跟踪可以使用以下步骤:
1. 读取视频或摄像头数据。
```cpp
cv::VideoCapture cap(0); //打开摄像头
cv::Mat frame; //每一帧图像
if (!cap.isOpened()) return -1; //检查视频是否正确打开
```
2. 初始化目标。
可以使用鼠标点击在视频帧中选择目标,并使用该目标的位置进行初始化。
```cpp
cv::Rect2d bbox = cv::selectROI("Tracking", frame, false); //选择ROI
cv::Ptr<cv::Tracker> tracker = cv::TrackerCSRT::create(); //创建跟踪器
tracker->init(frame, bbox); //用ROI初始化跟踪器
```
3. 循环处理每一帧图像。
在循环中,首先读取图像帧,然后使用跟踪器对目标进行跟踪,并在图像帧中绘制跟踪框。
```cpp
while (cap.read(frame)) {
cv::Rect2d bbox;
bool ok = tracker->update(frame, bbox); //使用跟踪器更新目标位置
if (ok) {
// 目标跟踪成功
cv::rectangle(frame, bbox, cv::Scalar(0, 255, 0), 2, 1); //在图像帧中绘制跟踪框
} else {
// 目标跟踪失败
cv::putText(frame, "Tracking failure detected", cv::Point(100, 80), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(0, 0, 255), 2);
}
cv::imshow("Tracking", frame); //显示图像帧
if (cv::waitKey(1) == 27) break; //按下ESC退出循环
}
```
完整的C++代码如下:
```cpp
#include <opencv2/opencv.hpp>
int main() {
cv::VideoCapture cap(0);
cv::Mat frame;
if (!cap.isOpened()) return -1;
cv::Rect2d bbox = cv::selectROI("Tracking", frame, false);
cv::Ptr<cv::Tracker> tracker = cv::TrackerCSRT::create();
tracker->init(frame, bbox);
while (cap.read(frame)) {
cv::Rect2d bbox;
bool ok = tracker->update(frame, bbox);
if (ok) {
cv::rectangle(frame, bbox, cv::Scalar(0, 255, 0), 2, 1);
} else {
cv::putText(frame, "Tracking failure detected", cv::Point(100, 80), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(0, 0, 255), 2);
}
cv::imshow("Tracking", frame);
if (cv::waitKey(1) == 27) break;
}
return 0;
}
```
注意,跟踪器的类型可以根据应用场景选择不同的类型,例如KCF、MIL、TLD等。此外,也可以使用深度学习模型进行目标跟踪。
阅读全文