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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

3139閲覧

sympy.solve()関数の解が出てきません

YukaU

総合スコア16

OpenCV

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

Python 3.x

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

0グッド

0クリップ

投稿2018/12/05 08:18

前提・実現したいこと

顔検出に関するプログラミングを作っています。
右頬左頬の範囲から顔の向き(pitch,yaw,roll)を推定するための関数内でエラーが出たのでエラーの原因を探っていたところ、sympy.solve()関数部分がおかしいということがわかりました。
ratioは大体0.7ぐらいなので解はあるはずなのですが、print(ans)で表示しようとしても何も表示されません。

ここで計算結果が出てこないため、この関数を使うと

UnboundLocalError: local variable 'yaw' referenced before assignment

というエラーが出てしまいます。
何故計算結果が出てこないのか、何がおかしいのか教えていただきたいです。

該当のソースコード

python

1import math 2import sympy 3 4def head_pose(wl, wr, hl, hr, xr2, xl1, yr2, yl2): 5 #pitch 6 pitch = 0 7 #yaw 8 yaw = 0 9 if wl > wr: 10 ratio = wr / wl 11 ans = sympy.solve(((1 - math.sin(x)) / (math.sin(x) + math.cos(x))) - ratio) 12 print(ans) 13 for i in ans: 14 if i < 2*math.pi: 15 yaw = i 16 else: 17 ratio = wl / wr 18 expr1 = ((1 - x) / (x + y)) - ratio 19 expr2 = x*x + y*y - 1 20 ans = sympy.solve([expr1, expr2]) 21 print(ans) 22 for i in ans: 23 if i > -2*math.pi: 24 yaw = i 25 26 #roll 27 if yl2 > yr2: 28 roll = math.atan((yl2 - yr2) / (xl1 - xr2)) 29 else: 30 roll = - math.atan((yr2 - yl2) / (xl1 - xr2)) 31 32 return pitch, yaw, roll

試したこと

sympy.solve()関数内にmath.sin()などがあるといけないのかと思い、else文ではmath.sin(x) = x, math.cos(x) = y, x^2 + y^2 = 1として連立方程式に変えていますが意味は無かったです。
pitchはとりあえず0としていて、rollは計算できています。

補足情報(FW/ツールのバージョンなど)

Windws7

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1ans = sympy.solve(((1 - math.sin(x)) / (math.sin(x) + math.cos(x))) - ratio)

このxはグローバル変数か何かでしょうか?

追記

python

1x = sympy.Symbol('x') 2y = sympy.Symbol('y')

宣言しましょう。

投稿2018/12/05 08:32

編集2018/12/06 02:26
_Victorique__

総合スコア1392

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

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

YukaU

2018/12/05 09:01

グローバル変数が何なのか知らなかったため調べまして、恐らくローカル変数です。 yaw=0の上に、 global x と書いてみたら SyntaxError: name 'x' is used prior to global declaration というエラーが出ました
_Victorique__

2018/12/05 09:26

その関数内にxが宣言されてませんが、xは何の値ですか?
YukaU

2018/12/06 02:05

xについての方程式を解きたいのでxは未知の値です。 方程式の解をansとして出したいです。
_Victorique__

2018/12/06 02:20

x = sympy.Symbol('x') y = sympy.Symbol('y') 単純にこれを追加するだけだと思います。
YukaU

2018/12/06 02:47

すみません、どこに追加すればいいのでしょうか、、 関数内でglobal x,yと書いてその後に追加 関数内でglobal x,yと書いて関数を使う前に追加 関数内でglobal x,yと書かないで関数のはじめに追加 関数内でglobal x,yと書かないで関数を使う前に追加 を試してみたのですがどれも値が出なかったりエラーが出たりしました
_Victorique__

2018/12/06 02:56

関数名の直後で良いですよ。 def head_pose(): # ココ
YukaU

2018/12/06 03:07 編集

できました!! 追加後に、 TypeError: can't convert expression to float というエラーが出ましたが、sympy.solve()内にmath.sin(),math.cos()があったのが問題だったようで、それぞれsympy.sin(),sympy.cos()に直したら無事にansの値が出ました。 本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問