C++ opencv目标跟踪 KCF
时间: 2023-11-04 11:51:59 浏览: 204
使用OpenCV中的KCF算法进行目标跟踪,可以按照以下步骤进行操作:
1. 导入OpenCV库和头文件:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
```
2. 读取视频并初始化目标框:
```c++
VideoCapture cap("video.mp4");
Rect2d bbox(287, 23, 86, 320); // x,y,w,h
```
3. 创建跟踪器对象并初始化:
```c++
Ptr<Tracker> tracker = TrackerKCF::create();
tracker->init(frame, bbox);
```
4. 循环读取每一帧图像,调用tracker->update()方法进行目标跟踪:
```c++
while (cap.read(frame))
{
bool ok = tracker->update(frame, bbox);
if (ok)
{
rectangle(frame, bbox, Scalar(0, 255, 0), 2, 1);
}
else
{
putText(frame, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);
}
imshow("Tracking", frame);
if (waitKey(1) == 27) break; // ESC退出
}
```
完整代码如下:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture cap("video.mp4");
if (!cap.isOpened())
{
std::cout << "Fail to open video file!" << std::endl;
return -1;
}
Rect2d bbox(287, 23, 86, 320); // x,y,w,h
Mat frame;
cap.read(frame);
Ptr<Tracker> tracker = TrackerKCF::create();
tracker->init(frame, bbox);
while (cap.read(frame))
{
bool ok = tracker->update(frame, bbox);
if (ok)
{
rectangle(frame, bbox, Scalar(0, 255, 0), 2, 1);
}
else
{
putText(frame, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);
}
imshow("Tracking", frame);
if (waitKey(1) == 27) break; // ESC退出
}
return 0;
}
```
其中,bbox表示目标框的位置和大小,可以手动指定或者通过其它方式获取。在循环中,如果tracker->update()返回true,则更新目标框的位置,并在图像中绘制矩形框;如果返回false,则表示跟踪失败,可以在图像中显示提示信息。最后,通过waitKey()函数等待按键事件,如果按下ESC键,则退出循环。
阅读全文