отслеживание объекта с веб-камеры с помощью Tracker-API, но ошибка: ограничение не определено - PullRequest
1 голос
/ 25 апреля 2020

Я строю проект по отслеживанию объекта с веб-камеры с помощью Tracker-API (3.3.1 OpenCV Library), но при открытии кода камеры все еще возникает ошибка. Если я запускаю только код открытия камеры, ошибки не возникает. Это мой исходный код

В моем исходном коде они используют видеофайл, но в моем я хочу отслеживать объект в режиме реального времени с веб-камеры. Что-то не так с моим кодом?

#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <opencv2\core.hpp>
#include <opencv2\highgui.hpp>
#include <opencv2\tracking\tracker.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/utility.hpp>
#include <iostream>
#include <string>
#include <math.h>

using namespace cv;
using namespace std;

// Convert to string
#define SSTR( x ) static_cast< std::ostringstream & >( \
    (std::ostringstream() << std::dec << x)).str()

int main(int argc, char **argv)
{
    // List of tracker types in OpenCV 3.4.1
    string trackerTypes[5] = { "BOOSTING", "MIL", "KCF", "TLD", "MEDIANFLOW" };
    // vector <string> trackerTypes(types, std::end(types));

    // Create a tracker
    string trackerType = trackerTypes[0];

    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")


        // Read video
        VideoCapture cap(0); // open the default camera
    if (!cap.isOpened())  // check if we succeeded
    {
        cout << "Could not read video file" << endl;
        return 1;

    }

    Mat frame;
    bool ok = cap.read(frame);

    Rect2d bbox(287, 23, 86, 320);
    rectangle(frame, bbox, Scalar(255, 0, 0), 2, 1);

    imshow("Tracking", frame);
    tracker->init(frame, bbox);

    while (cap.read(frame)){
        double timer = (double)getTickCount();
        bool ok = tracker->update(frame, bbox);
        float fps = getTickFrequency() / ((double)getTickCount() - timer);
        if (ok){
            rectangle(frame, bbox, Scalar(255, 0, 0), 2, 1);
        }
        else{
            putText(frame, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_PLAIN, 0.75, Scalar(0, 0, 255), 2);
        }
        imshow("Tracking", frame);
        int k = waitKey(1);
        if (k == 27){
            break;
        }
    }
}

1 Ответ

0 голосов
/ 25 апреля 2020

Вы создаете объект cap только в том случае, если тип трекера имеет медианный поток:

    if (trackerType == "MEDIANFLOW")


    // Read video
    VideoCapture cap(0); // open the default camera

Возможно, вам не хватает строки

tracker = TrackerMedianFlow::create();

(сразу после последнего если)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...