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

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

ただいまの
回答率

91.36%

  • Python

    3801questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • C++

    2409questions

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

複数人の人物追跡について

解決済

回答 2

投稿 2017/11/26 16:30

  • 評価
  • クリップ 3
  • VIEW 143

mikanken

score 2

複数人の人物追跡をしたいと考えております。
以下はopencvを使い、動画の最初のフレームで追跡する対象を決め、その人物が動画からいなくなると終了するプログラムです。

import cv2
import sys

(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')

if __name__ == '__main__' :

    # Set up tracker.
    # Instead of MIL, you can also use

    tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
    tracker_type = tracker_types[2]

    if int(minor_ver) < 3:
        tracker = cv2.Tracker_create(tracker_type)
    else:
        if tracker_type == 'BOOSTING':
            tracker = cv2.TrackerBoosting_create()
        if tracker_type == 'MIL':
            tracker = cv2.TrackerMIL_create()
        if tracker_type == 'KCF':
            tracker = cv2.TrackerKCF_create()
        if tracker_type == 'TLD':
            tracker = cv2.TrackerTLD_create()
        if tracker_type == 'MEDIANFLOW':
            tracker = cv2.TrackerMedianFlow_create()
        if tracker_type == 'GOTURN':
            tracker = cv2.TrackerGOTURN_create()

    # Read video
    video = cv2.VideoCapture("CU01.avi")

    # Exit if video not opened.
    if not video.isOpened():
        print ("Could not open video")
        sys.exit()

    # Read first frame.
    ok, frame = video.read()
    if not ok:
        print ('Cannot read video file')
        sys.exit()

    # Define an initial bounding box
    bbox = (287, 23, 86, 320)

    # Uncomment the line below to select a different bounding box
    bbox = cv2.selectROI(frame, False)

    # Initialize tracker with first frame and bounding box
    ok = tracker.init(frame, bbox)

    while True:
        # Read a new frame
        ok, frame = video.read()
        if not ok:
            break

        # Start timer
        timer = cv2.getTickCount()

        # Update tracker
        ok, bbox = tracker.update(frame)

        # Calculate Frames per second (FPS)
        fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);

        # Draw bounding box
        if ok:
            # Tracking success
            p1 = (int(bbox[0]), int(bbox[1]))
            p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
            cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1)
        else :
            # Tracking failure
            cv2.putText(frame, "Tracking failure detected", (100,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2)

        # Display tracker type on frame
        cv2.putText(frame, tracker_type + " Tracker", (100,20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50),2);

        # Display FPS on frame
        cv2.putText(frame, "FPS : " + str(int(fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);

        # Display result
        cv2.imshow("Tracking", frame)

        # Exit if ESC pressed
        k = cv2.waitKey(1) & 0xff
        if k == 27 : break


このように最初に追跡する物体を決めるのではなく、動画内に映る人を自動で検出して追跡するにはどのようにすればよいでしょうか?

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • slash

    2017/11/26 17:06

    通常の物体検出のコードで矩形領域を検出したとして、今のフレームと次のフレームと同じモノ(人)をどうつなぐのよ、的なことでしょうか?

    キャンセル

  • toris-birds

    2017/11/26 17:15

    検出の部分を知りたい場合は「opencv image recognition」などで検索すると出てくるのでは? (単にselectROI()付近の処理を待ちループにしたいだけかもしれませんが・・)

    キャンセル

  • mikanken

    2017/11/26 17:47

    今のフレームと次のフレームと同じ人のつなぎ方も知りたいのですが、そもそも最初のフレームに写っていない人の追跡の仕方を知りたいです。

    キャンセル

回答 2

checkベストアンサー

+5

2017-11-27 A.M 追記
multiple people tracking pythonのような感じで探すと、今回の質問と同じような質問誰でも良いから、複数人同時追跡ビデオ監視システムのソースコードのリンクを下さいが見つかります。

で、その中でもK-Shortest Path (KSP)
の方法なら今回の質問と同じような感じのことがc++で出来そうな感じがしますね。

  • 人だけを認識
  • 具体的にどの人がどこか、を識別できる
    (軌跡の表示はまんま実装はされていませんが、足元の位置が追跡できるので、足元位置をmask画像にグリグリ点を加えていけば同じようなことは出来るので大した問題ではないですね)

肝心のリンクはこれです。
私にはc++は使えませんので分かりません(pythonでほしかった...)


2017-11-26 P.M
今すぐ使えるコードを示すことはできない(あれば私も欲しい)ですが、あーできそうだな、という概念がありましたので貼り付けます。

リアルタイム歩行者検出、追跡、および距離推定(p.4)

やらないといけないことは、歩行者部分の繰り抜き(物体検出: people haarlike pythonとか検索すればたくさん出てきます)、実際に人かの判定(SVMなど)、追跡(Optical flow?)という感じです。


参考
夕方に少し調べた際には、この件と同じようなことが数年前に投稿されている例がありました。その際には、「最先端の内容だから(無料ですぐに使えるものはなかなかないよ)」的なことがほのめかされています。実際調べてみても研究真っただ中のようで、youtubeや写真で紹介はあっても実際に無料で使えそうなソースは見つかりませんでした。質問内容では「場所を指定さえすれば追跡できる」ようですので、その部分を物体検出・追跡対象に追加の処理に書き換えればよいのかな?という気もします。あとは、同じ投稿内で「pythonじゃ遅いからC++にした方が良い」とコメントが付いていました。

やりたいことはこんな感じですよね(oxford大学のページより引用)。
イメージ説明

参考まで。

投稿 2017/11/26 22:00

編集 2017/11/27 07:19

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/26 22:24

    そうです!したいことはそういうことです!

    キャンセル

  • 2017/11/27 14:11

    先ほどいただいたコードを動かそうとしたのですがエラーが出てしまいました、、、
    pythonでも動かせるみたいなこと書いてありますよ

    キャンセル

  • 2017/11/27 21:49

    私もこういう触ると楽しげなのを探していましたので、時間が出来たら試します!

    キャンセル

+1

参考資料用に。

実際にやるとしたら、認識したいものを機械学習させる処理も必要になりそうです。(というより、学習させる部分の方がメインになりそうですが・・・)

「opencv 画像認識」あるいは「opencv 画像認識 機械学習」で検索
画像認識ってどうやるの?PythonとOpenCVを使って、写真内で自分の席に座っている人をカウントしてみた!
https://www.i3design.jp/in-pocket/4236

「カスケード型分類器」
http://opencv.jp/opencv-2.2/c/objdetect_cascade_classification.html

「opencv image recognition」で検索
Object detection with deep learning and OpenCV
https://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/

投稿 2017/11/27 00:09

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

ただいまの回答率

91.36%

関連した質問

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

  • Python

    3801questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • C++

    2409questions

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