質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • C++

    2431questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

物体追跡のopencv,c++での実行

受付中

回答 1

投稿 2017/11/26 22:18

  • 評価
  • クリップ 1
  • VIEW 82

mikanken

score 2

c++初心者なのですが、以下のコードを実行する際、コンパイル時に渡す引数はどのように書けばよろしいいのでしょうか?

opencv_multitracking.cpp:135:42: error: no matching constructor for
initialization of 'cv::MultiTracker'
...tracker = new cv::MultiTracker(tracker_algorithm);

opencv_multitracking.cpp:163:18: error: no matching member function for call to
'add'
if (tracker->add(Image, BBox))
~~~~~~~~~^~~
のエラーが出るのはコンパイル時の引数の設定の仕方がおかしいからなのでしょうか?

#include <opencv/cv.h>
#include <opencv2/core.hpp>
#include <opencv2/core/utility.hpp>
#include <opencv2/tracking/tracker.hpp>
#include <opencv2/highgui.hpp>

static cv::Mat Image;
static cv::Rect2d BBox;
static std::string WindowName;
static bool Paused;
static bool SelectObject = false;
static bool StartSelection = false;

static const char* Keys =
{ "{@tracker_algorithm | | tracker algorithm }"
"{@video_name        | | video name        }"
"{help h usage| |print this message   }"
};

static void Help(void)
{
    std::cout << "\nThis example shows the functionality of \"Long-term optical tracking API\""
        "-- pause video [p] and draw a bounding box around the target to start the tracker\n"
        "Call:\n"
        "./tracker <tracker_algorithm> <video_name>\n"
        << std::endl;

    std::cout << "\n\nHot Keys: \n"
        "\tq - quit the program\n"
        "\tp - pause video\n";
}

static void OnMouse(int event, int x, int y, int, void*)
{
    if (!SelectObject)
    {
        switch (event)
        {
        case cv::EVENT_LBUTTONDOWN:
            //set origin of the bounding box
            StartSelection = true;
            BBox.x = x;
            BBox.y = y;
            break;
        case cv::EVENT_LBUTTONUP:
            //sei with and height of the bounding box
            BBox.width = std::abs(x - BBox.x);
            BBox.height = std::abs(y - BBox.y);
            Paused = false;
            SelectObject = true;
            break;
        case cv::EVENT_MOUSEMOVE:
            if (StartSelection)
            {
                //draw the bounding box
                cv::Mat currentFrame;
                Image.copyTo(currentFrame);
                cv::rectangle(currentFrame, cv::Point(BBox.x, BBox.y), cv::Point(x, y), cv::Scalar(255, 0, 0), 2, 1);
                cv::imshow(WindowName, currentFrame);
            }
            break;
        }
    }
}

bool CheckTrackerAlgType(cv::String& tracker_algorithm)
{
    if (tracker_algorithm == "BOOSTING" ||
        tracker_algorithm == "MIL" ||
        tracker_algorithm == "TLD" ||
        tracker_algorithm == "MEDIANFLOW" ||
        tracker_algorithm == "KCF")
    {
        std::cout << "Tracker Algorithm Type: " << tracker_algorithm << std::endl;
    }
    else{
        CV_Error(cv::Error::StsError, "Unsupported algorithm type " + tracker_algorithm + " is specified.");
    }
    return true;
}

int main(int argc, char** argv)
{
    cv::CommandLineParser parser(argc, argv, Keys);

    cv::String tracker_algorithm = parser.get<cv::String>(0);
    cv::String video_name = parser.get<cv::String>(1);

    parser.about("OpenCV Tracker API Test");
    if (parser.has("help"))
    {
        parser.printMessage();
        return 0;
    }

    if (tracker_algorithm.empty() || video_name.empty() || !parser.check())
    {
        parser.printErrors();
        return -1;
    }

    CheckTrackerAlgType(tracker_algorithm);

    //open the capture
    cv::VideoCapture cap;
    cap.open(video_name);

    if (!cap.isOpened())
    {
        Help();
        std::cout << "***Could not initialize capturing...***\n";
        std::cout << "Current parameter's value: \n";
        parser.printMessage();
        return -1;
    }

    cv::Mat frame;
    Paused = true;
    WindowName = "Tracking API: " + tracker_algorithm;
    cv::namedWindow(WindowName, 0);
    cv::setMouseCallback(WindowName, OnMouse, 0);

    //instantiates the specific Tracker
    cv::Ptr<cv::Tracker> tracker = cv::Tracker::create(tracker_algorithm);
    if (tracker == NULL)
    {
        std::cout << "***Error in the instantiation of the tracker...***\n";
        return -1;
    }

    std::cout << "\n\nHot Keys: \n"
        "\tq - quit the program\n"
        "\tp - pause video\n";

    //get the first frame
    cap >> frame;
    frame.copyTo(Image);
    cv::imshow(WindowName, Image);
    bool initialized = false;
    while (true)
    {
        if (!Paused)
        {
            cap >> frame;
            frame.copyTo(Image);

            if (SelectObject && !initialized)
            {
                //initializes the tracker
                if (tracker->init(Image, BBox))
                {
                    initialized = true;
                }
            }
            else if (initialized)
            {
                //updates the tracker
                if (tracker->update(frame, BBox))
                {
                    cv::rectangle(Image, BBox, cv::Scalar(0, 0, 255), 2, 1);
                }
                else{
                    SelectObject = initialized = false;
                }
            }
            imshow(WindowName, Image);
        }
        char c = static_cast<char>(cv::waitKey(2));
        if (c == 'q')
            break;
        if (c == 'p')
            Paused = !Paused;
    }

    return 0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2017/11/27 10:53

    ファイルopencv_multitracking.cppは自作ソースファイルでしょうか?質問中ソースコードとエラーメッセージの対応が全く取れない状態です。

    キャンセル

  • t_obara

    2017/11/27 13:49

    コードに問題があるのでビルド(コンパイル)できないということです。エラーコードを素直に読んで、該当するコードをどのように修正すべきかをご判断するしかないと思います。あるいはどこかから拾ってきたコードであるならば、コンパイラのバージョンが異なっているとか、ビルド環境が異なっているなどが考えられます。

    キャンセル

回答 1

0

エラーが出るのはコンパイル時の引数の設定の仕方がおかしいからなのでしょうか? 

はい。

https://docs.opencv.org/3.3.0/d8/d77/classcv_1_1MultiTracker.html

よくリファレンスを読んで下さい。


それはそうと無関係なソースコードを貼らないでください。添付するべきはopencv_multitracking.cppの中身です。

投稿 2017/11/28 10:44

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

  • 解決済

    opencvのcvConvertScaleAbs関数エラーを直したい

    こんにちは。 どうしても解決できず、ずっと悩んでいるのでご助力いただけないかと思い投稿しました。 前提・実現したいこと XcodeでC++、opencvを用いて行列操作を

  • 解決済

    opencvでの画像の読み込み

    opencvで画像の読み込みを行い、テンプレートマッチングを行いたいと考えています。 外部のソフト(IC Imaging Contorol)というアルゴ社のカメラソフトを使い

  • 解決済

    opencvの連番読み込み

    今まで、iplimage型でコードを書いていたのですが、 多くの人の指摘があり、mat型に変更したいと考えています。 そこで、画像の連番読み込み、保存を行いたいと考えていま

  • 解決済

    wxPythonにおいて、USBカメラの画像表示をしたい

    前提・実現したいこと ここ一週間くらい、teratailの皆様の力を借りながら、python上で動く動画や画像を表示できるGUIを作っています。画像は何とか表示でき、画像とパネル

  • 解決済

    opencv 動画 再生

    #include <stdio.h> #include <cv.h> #include <highgui.h> int main(int argc, char* argv[])

  • 解決済

    OpenCVを用いた物体検出

    現在OpenCV2.1を用いた上で顔検出にチャレンジしています。 学習等については問題なく行うことができ、顔の検出を行おうと思っているのですが、検出の段階で設定するパラメータの"m

  • 受付中

    PythonでOpenCVのVideoCaptureの例外が取得できない

    PythonのOpenCVでWEBカメラからビデオキャプチャーを利用しています。 OpenCVでは下記の通りに番号でWEBカメラを指定しますが、複数カメラを利用する際に、番号で指定

  • 解決済

    opencv python 画像処理

    # -*- coding: utf-8 -*- import cv2 import numpy as np # フレーム差分の計算 def frame_sub(src1, src

同じタグがついた質問を見る

  • C++

    2431questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。