Tracking object với opencv

1.Tracking là gì:

Tracking là thuật toán theo dõi, bám theo đối tượng trong video, ví dụ như một chiếc xe đang chạy hay một người đang chuyển động.

2.Tracking với opencv C++

Opencv 3 đi kèm với một API tracking có thể triển khai nhiều thuật toán theo dõi khác nhau.Có 6 trình theo dõi khac nhau trong opencv (từ 3.2 trở lên ) là BOOSTING, MIL, KCF, TLD, MEDIANFLOW, và GOTURN
Muốn sử dụng các trình theo dõi trên với opencv ta cần cài đặt thêm module opencv_contrib

Cài đặt tracking với opencv:
Trước tiên ta thiết lập một trong 6 trình theo dõi ở trên. Ở frame đâu tiên của video xác định vị trí của đối tượng cần theo dõi trong một box. Cuối cùng là update vị trí của đối tượng trong các frame tiếp theo của video.

#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/core/ocl.hpp>
#include <opencv2/video/tracking.hpp>

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
// Chọn trình theo dõi
string trackerTypes[6] = {“BOOSTING”, “MIL”, “KCF”, “TLD”,”MEDIANFLOW”, “GOTURN”};
string trackerType = trackerTypes[2];

Ptr<Tracker> tracker;
{
if (trackerType == “BOOSTING”)
tracker = TrackerBoosting::create();
if (trackerType == “MIL”)
tracker = TrackerMIL::create();
if (trackerType == “KCF”)
tracker = TrackerKCF::create();
if (trackerType == “TLD”)
tracker = TrackerTLD::create();
if (trackerType == “MEDIANFLOW”)
tracker = TrackerMedianFlow::create();
if (trackerType == “GOTURN”)
tracker = TrackerGOTURN::create();
}
// Đọc video
VideoCapture video(“slow.mp4”);
if(!video.isOpened())
{
cout << “khong tim thay video” << endl;
return 1;
}

// Đọc frame đầu tiên của video
Mat frame;
video.read(frame);

// Thiết lập vị trí của đối tượng cần theo dõi trong frame đầu tiên của video trong một box
Rect2d bbox(220, 120, 60, 50);
rectangle(frame, bbox, Scalar( 255, 0, 0 ), 2, 1 );
imshow(“Tracking”, frame);

// Khởi tạo trình theo dõi
tracker->init(frame, bbox);

    while(video.read(frame))
{
// update vị trí của đối tượng trong frame hiện tại
bool ok = tracker->update(frame, bbox);
if (ok)
{
rectangle(frame, bbox, Scalar( 255, 0, 0 ), 2, 1 );
}
else
{
putText(frame, “Khong tim thay doi tuong”, Point(100,80), FONT_HERSHEY_SIMPLEX, 0.75,                  Scalar(0,0,255),2);
}

// Hiển thị loại theo dõi trên video
putText(frame, trackerType + “Tracker”, Point(100,20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50,170,50),2);
imshow(“Tracking”, frame);

// Nhấn Esc để thoát .
int k = waitKey(1);
if(k == 27)
{
break;
}
}
}

Trình theo dõi bossting:

Ưu : trình theo hoạt động tốt
Nhược : Nó không phát hiện được khi đối tượng theo dõi rời khỏi video

Trình theo dõi MIL

Ưu : hiệu xuất khá tốt, hoạt động khá tốt khi đối tượng bị che lấp một phần.
Nhược : Nó không phát hiện được khi đối tượng theo dõi rời khỏi video, không tự phục hồi được khi đối tượng bị che lấp hoàn toàn.

Trình theo dõi KCF

Ưu : Độ chính xác và tốc độ tốt hơn MIL, phát hiện sự cố tốt hơn bossting.
Nhược : không tự phục hồi khi đối dối tượng hoàn toàn bị che lấp

Trình theo dõi MEDIANFLOW

Ưu: Phát hiện rất tốt khi đối tượng ra khỏi video. Hoạt động rất tốt khi chuyển động của đối tượng là có thể dự đoán được và không bị tắc nghẽn.
Nhược: FPS rất thấp để làm chuyển động của đối tượng theo dõi là không lớn.

One Reply to “Tracking object với opencv”

Leave a Reply

Your email address will not be published. Required fields are marked *