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

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

ただいまの
回答率

90.74%

  • Python 3.x

    5286questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • 配列

    487questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

重複チェックして値を追加するコード

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 175

Cielwoo

score 5

前提・実現したいこと

Python3での質問です。簡単に説明すれば
list = [ [[1,1],[2,2],[33]], [[4 4],[5 5],[6 6]] ]
このような多重配列があったとして
このリストを重複チェックして、新しく[[7,7],[8,8]]を
入れる方法がわからなくて困っています。

該当のソースコード

def new_id(cx,cy,ox,oy):
/    global n_id

/    for j in range(0,len(n_id)):
/        for k in range(len(n_id[j])):
/            if(n_id[j][k] == [ox,oy]):
/               n_id[j] = n_id[j] + [[cx,cy]]
/            elif(n_id[j][k] != [ox,oy]):
/               n_id = n_id + [[[cx,cy]]]

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Cielwoo

    2017/10/15 00:05

    トラッキング機能があるのは知っていて、リスト化したら効率が良くないのも知っています。でも一度この方法でやって見たいんですけど、上手くいかず質問しました。もし時間に余裕がありましたらコードの修正お願いします。

    キャンセル

  • LouiS0616

    2017/10/15 00:14

    うーん... もしこれで期待通りリストが得られたとして、どのようにそれを活用するのです?どの座標が同一人物のものであるかどうやって特定するのです?それに、どんなに上手に作っても、人がすれ違った瞬間正しい追跡が不可能になるのでは。

    キャンセル

  • Cielwoo

    2017/10/15 00:20

    すれ違いの解決までは求めていないのでとりあえず軌跡でどの方向に歩いて行ったのか見れれば十分です!

    キャンセル

回答 1

checkベストアンサー

0

註:質問に対する直接的な回答ではありません。
__修正依頼のやり取りを元に下記の回答をしています。

監視カメラで人物を追跡する際、このような制約があるとします。

1. 人物の検出ミスが起きえない
2. 人物が撮影範囲外に移動しない
3. 人物が監視カメラ上で重ならず、近づくこともない

ほとんどあり得ない状況ですが、そうするとこのように座標を管理できます。

疑似コード

# 上記制約によりret_listの長さは毎回同じで、対応する人物の順序も同じ
def find_humans(frame):
    ret_list = []
    ...

    for human in found_humans:
        ret_list.append(human.x, human.y)

    ...
    return ret_list

def main():
    ...

    coordinate_list = []
    while カメラが動いている:
        ...

        coordinate_list.append(find_humans(frame))
        ...

    ...

    # 人物01の軌跡
    track_coord_01 = coordinate_listの0列目のスライス

 
こんな感じですかね。
ただ、兎にも角にも制約が多くて、全く想定通りには働かないでしょう。


例えばCNNを用いて人物再同定を可能にすると、上記制約がかなりましになります。

1. 人物が監視カメラ上で重ならず、近づくこともない

疑似コード

def find_humans(...):
    上記とほぼ同じ

def check_human_id(座標):
    ...

    return human_id

def main():
    ...

    coordinate_dict = {}
    while カメラが動いている:
        ...

        for human in find_human(frame):
            id = check_human_id(座標)
            if id in coordinate_dict:
                coordinate_dict[id].append(座標)
            else:
                coordinate_dict[id] = [座標]
        ...

    ...

    # 人物01の軌跡
    track_coord_01 = coordinate_dict[01]

ですので、人物の識別同定が出来るのはほぼ必須だと思います。
このままの方法で試してみても勉強にはなるでしょうが、非常に学習効率が悪いかと。

やはりOpenCVの機能でトラッキングするのが無難だと思います。
結論としては、おそらく無駄だし、やりきるにしては考察不足/実力不足ですかね。


ついでに
コードを拝見する限り、そもそもPythonの基礎知識が足りていないようです。
そちらの勉強も並行して進めるようにしてください。

本筋から逸れるので解説はしませんが、次のような点で不適です。

  • listの名前をシャドウイングしている
  • タプルあるいはクラスで構造化出来そうなデータを生で扱っている
  • おそらく無駄なループの仕方をしている
  • グローバル変数が当たり前のように存在し、しかも型が不明
  • 変数の名前から役割が想像できない
  • そもそもPythonではif文の条件式をカッコでくるまなくてよい
  • 適切に関数化していない結果ネストが深くなっている
  • 質問のやり取りを見る限り、おそらくご自身でもいまいち挙動がわかっていない

コードを見ているとよくないC言語の香りがします。
C言語を適切に扱えないまま、その流儀をPythonに持ち込んでわけがわからなくなっているのでは。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.74%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Python 3.x

    5286questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • 配列

    487questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。