溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

OpenCV C++實(shí)現(xiàn)物體跟蹤策略

發(fā)布時間:2024-08-26 18:00:01 來源:億速云 閱讀:88 作者:小樊 欄目:編程語言

OpenCV是一個開源的計(jì)算機(jī)視覺庫,它提供了許多用于實(shí)時計(jì)算機(jī)視覺的優(yōu)化算法。在這里,我們將介紹如何使用OpenCV和C++實(shí)現(xiàn)一個簡單的物體跟蹤策略。我們將使用KCF(Kernelized Correlation Filter)算法進(jìn)行跟蹤。

首先,確保已經(jīng)安裝了OpenCV庫。接下來,創(chuàng)建一個新的C++項(xiàng)目,并包含以下頭文件:

#include<iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>

然后,編寫以下代碼來實(shí)現(xiàn)物體跟蹤:

int main(int argc, char** argv) {
    // 創(chuàng)建一個VideoCapture對象,用于讀取視頻文件或攝像頭
    cv::VideoCapture cap(0); // 使用攝像頭,傳入0;若使用視頻文件,請傳入文件路徑

    if (!cap.isOpened()) {
        std::cerr << "無法打開攝像頭或視頻文件!"<< std::endl;
        return -1;
    }

    // 獲取視頻的寬度和高度
    int frameWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    int frameHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT);

    // 創(chuàng)建一個窗口,用于顯示跟蹤結(jié)果
    cv::namedWindow("Tracking", cv::WINDOW_NORMAL);

    // 等待用戶選擇要跟蹤的物體區(qū)域
    cv::Rect2d roi;
    std::cout << "請?jiān)诖翱谥杏檬髽?biāo)拖拽選擇要跟蹤的物體區(qū)域,然后按回車鍵確認(rèn)。"<< std::endl;
    cv::setMouseCallback("Tracking", [](int event, int x, int y, int flags, void* userdata) {
        if (event == cv::EVENT_LBUTTONDOWN) {
            *((cv::Point*)userdata) = cv::Point(x, y);
        }
    }, &roi.tl());

    cv::Mat frame;
    while (true) {
        cap >> frame;
        if (frame.empty()) break;

        if (roi.area() > 0) {
            // 創(chuàng)建KCF跟蹤器
            cv::Ptr<cv::Tracker> tracker = cv::TrackerKCF::create();

            // 初始化跟蹤器
            tracker->init(frame, roi);

            // 更新ROI區(qū)域
            roi = tracker->update(frame);

            // 在幀上繪制跟蹤結(jié)果
            cv::rectangle(frame, roi, cv::Scalar(0, 255, 0), 2);
        }

        // 顯示跟蹤結(jié)果
        cv::imshow("Tracking", frame);

        // 按ESC鍵退出
        if (cv::waitKey(30) == 27) break;
    }

    // 釋放資源
    cap.release();
    cv::destroyAllWindows();

    return 0;
}

這段代碼首先創(chuàng)建了一個VideoCapture對象,用于從攝像頭或視頻文件中讀取幀。然后,它創(chuàng)建了一個名為“Tracking”的窗口,用于顯示跟蹤結(jié)果。接下來,程序等待用戶在窗口中用鼠標(biāo)拖拽選擇要跟蹤的物體區(qū)域。當(dāng)用戶按下回車鍵時,程序?qū)⑹褂肒CF算法創(chuàng)建一個跟蹤器,并在每一幀上更新跟蹤結(jié)果。最后,程序在幀上繪制跟蹤結(jié)果,并顯示在窗口中。

要編譯和運(yùn)行此代碼,請確保鏈接到OpenCV庫。在命令行中,可以使用以下命令進(jìn)行編譯(假設(shè)源文件名為main.cpp):

g++ main.cpp -o tracking `pkg-config --cflags --libs opencv4`

然后運(yùn)行生成的可執(zhí)行文件:

./tracking

現(xiàn)在,程序應(yīng)該會打開一個窗口,顯示攝像頭或視頻文件的實(shí)時畫面。用鼠標(biāo)拖拽選擇要跟蹤的物體區(qū)域,然后按回車鍵確認(rèn)。程序?qū)㈤_始跟蹤選定的物體,并在幀上繪制跟蹤結(jié)果。按ESC鍵退出程序。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI