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 thought on “Tracking object với opencv

Leave a Reply

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