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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

4回答

325閲覧

2点間距離を求めるための場合分け

Penefax

総合スコア38

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

1クリップ

投稿2017/10/07 08:26

編集2017/10/07 08:28

いつもお世話になっております。

###前提・実現したいこと
2点間距離(l2)を求め、それをcsvファイルに記録するシステムの作成を行っています。
基準点の位置が変わるのでif関数で場合分けをしてみたが上手く動作しませんでした。

###発生している問題・エラーメッセージ

Python

1SyntaxError: invalid syntax

が発生しています。
###該当のソースコード

Python

1 X = (round((50/(l-50))*((x2 + x3)/2),2)) 2 Y = (round((50/(l-50))*((y2 + y3)/2),2)) 3 Z = ((round(50/(l-50)*213,2))) 4 XY = np.array([X,Y]) 5 XP = [-23,-23.3,-23.3,-23.3,17.8,17.8,18.2,18,0,0,0,0,0,0] 6 YP = [14.5,11.2,8.1,5,13.5,10.2,7.1,4,0,-7.5,-15.25,-21.1,-27,-32.75] 7 xp = np.array([XP,YP]) 8 F = (src.get(cv.CV_CAP_PROP_POS_FRAMES)) 9 10 def PENEFAX3(l2): 11 u = XY - xp 12 l2 = np.linalg.norm(u) 13 l2 = (round(l2,2) 14 15 if F in range (8,12) 16 xp = (-23,14.5) 17 PENEFAX3(l2) 18 elif F in range(13,17) : 19 xp = (-23.3,11.2) 20 PENEFAX3(l2) 21 elif F in range(18,22) : 22 xp = (-23.3,8.1) 23 PENEFAX3(l2) 24 elif F in range(23,27) : 25 xp = (-23.3,5.00) 26 PENEFAX3(l2) 27 elif F in range(40,44) : 28 xp = (17.8,13.5) 29 PENEFAX3(l2) 30 elif F in range(45,49) : 31 xp = (17.2,10.2) 32 PENEFAX3(l2) 33 elif F in range(50,54) : 34 xp = (18.2,7.1) 35 PENEFAX3(l2) 36 elif F in range(55,59) : 37 xp = (18.0,4.00) 38 PENEFAX3(l2) 39 elif F in range(72,76) : 40 xp = (0.00,0.00) 41 PENEFAX3(l2) 42 elif F in range(77,81) : 43 xp = (0.00,-7.5) 44 PENEFAX3(l2) 45 elif F in range(82,86) : 46 xp = (0.00,-15.25) 47 PENEFAX3(l2) 48 elif F in range(87,91) : 49 xp = (0.00,-21.1) 50 PENEFAX3(l2) 51 elif F in range(92,96) : 52 xp = (0.00,-27.0) 53 PENEFAX3(l2) 54 elif F in range(97,101) : 55 xp = (0.00,-32.75) 56 PENEFAX3(l2) 57 else: 58 xp = XY 59 PENEFAX3(l2)

X,Yはテンプレートマッチングでの、座標位置を計算で求めた結果です。リアルタイムでの計算と同時に2点間距離を求めたいです。
xpの値をフレーム数毎に指定して、場合に応じて変わるようにしたいです。
else部分は必要ないデータが含まれているので、結果を0で表示されるようにしています。

###試したこと
関数を作成して、場合分けを試みましたが上手くいきませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
windows10
python2.7
matplotlib
spyder

よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

文法的なエラーは LouiS0616 さんが書かれておりますので、それ以外で。

やりたいことはフレームの値Fによってターゲットとなる基準点の座標が変化するということでよろしいでしょうか。

であれば、numpy には digitize() という便利な関数がありますので、これを使用してみてはいかがでしょうか。
この関数は引数に、値(のリスト)とbin値(区切り点)のリストを渡すと、その値が何番目の区切りに属しているかのindex値(のリスト)を返す関数です。

たとえば n, = np.digitize([value], [10,20,30]) とすると
value < 10 のとき, n = 0
10 <= value < 20 のとき, n = 1
20 <= value < 30 のとき, n = 2
30 <= value のとき, n = 3

という値を得ることができます。

ですので今回の場合、 if ~ elif を繰り返すのではなく

Python

1import numpy as np 2 3X,Y = 0,0 # 適当 4F = 33 # 適当 5XY = np.array([X,Y]) 6 7bins = [8,13,18,23,40,45,50,55,72,77,82,87,92,97,102] 8XP = [-23,-23.3,-23.3,-23.3,17.8,17.8,18.2,18,0,0,0,0,0,0] 9YP = [14.5,11.2,8.1,5,13.5,10.2,7.1,4,0,-7.5,-15.25,-21.1,-27,-32.75] 10 11n, = np.digitize([F], bins) - 1 12if 0 <= n < len(XP): 13 target = np.array([XP,YP]).T[n] 14 l2 = round(np.linalg.norm(XY - target), 2) 15else: 16 l2 = 0

のように書くことができます。

投稿2017/10/07 15:00

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Penefax

2017/10/07 15:22

ご回答ありがとうございます。この関数は知らなかったので是非参考にさせていただきます!!
guest

0

ソースコードが未定義の変数があるため、最初の計算がそもそも実行できませんでした。
spyderを使用しているならanacondaでインストールしていると思うので、
Jupyter Notebookを使ってブロックづつに実行していけば、エラー箇所がわかると思います。

参考リンク
http://pythondatascience.plavox.info/pythonの開発環境/jupyter-notebookを使ってみよう

投稿2017/10/07 12:22

編集2017/10/07 12:23
GOTA77

総合スコア160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Penefax

2017/10/07 15:00

ご回答ありがとうございます。すみません、あくまで1プログラムの中の1部分であるためこのような質問方法になってしまいました。 インストールは、Python(x,y)で行いました。
guest

0

とりあえず文法面に関して。

Python

1def PENEFAX3(l2): 2 u = XY - xp 3 l2 = np.linalg.norm(u) 4 l2 = (round(l2,2) # ← かっことじがない 5 6if F in range (8,12) # ← コロンがない 7 xp = (-23,14.5) 8 PENEFAX3(l2)

もっとあるかもしれないですね。
ご提示のコードだけでは動作しないのでわかりませんが。

基礎的な部分を勉強することをお勧めします。
今回の文法エラーも悩む類のものではないですし、そもそもコードが意味不明です。

投稿2017/10/07 10:26

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Penefax

2017/10/07 15:01

ご回答ありがとうございます。すみません、あくまで1プログラムの中の1部分であるためこのような質問方法になってしまいました。括弧がないやコロンはこちらにコピーするときに飛ばしてしまっていました。
guest

0

構文が間違ってるだけなので、何行目が間違ってるかエディターに表示する設定をするか、どこまで動いてるのか確認してみたら良いのではないですかね。

エディターの方はわりとさくっと終わると思うんですけど確認する方は
例えば、
変数宣言してるところまでで保存して動けばその部分は問題ない
空の関数渡してエラーがでなければ中身をちょっとづつ入れるとか

投稿2017/10/07 08:39

drizzing20

総合スコア363

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Penefax

2017/10/07 15:02

ご回答ありがとうございます。わかりました。エラーヶ所を確認しつつもう少し詰めてみたいと思います。 もし、それでもわからなければ、また、こちらで質問させていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問