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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

564閲覧

Python OpenCV for文が動作しない際の対処法

mia_flower

総合スコア66

OpenCV

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

Python 3.x

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

0グッド

0クリップ

投稿2022/04/27 01:26

編集2022/04/27 02:01

実現したいこと

Python3で、OpenCVを用いてフラクタル ツリーを描画したいと考えています。

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

現在、黒い背景画像のみが描画されている状態です。

Main関数の実行回数を定めるために

for number in range(1, 10): Main(number)

というfor文を書いたのですが、動作していないように思われます。

どのようにしたらよろしいでしょうか。

該当のソースコード

import numpy as np import cv2 #黒背景 img = np.zeros((600,600,3), np.uint8) Tree = [] PreTree = [] l = len(Tree) def Main(number): if number == 1: PreEndX = 300 PreEndY = 0 PreRadius = 100 PreTheta = 0 R = Branch(PreEndX, PreEndX, PreRadius, PreTheta, 1) #右方向へのびる枝 r = Branch(PreEndX, PreEndX, PreRadius, PreTheta, -1) #左 Tree.append(R) Tree.append(r) else: for i in range(1, Delta1 + 1): #増えた配列の長さの分、for文を実行 PreEndX= PreTree[Prel+i-1:Prel+i][0][3] PreEndY= PreTree[Prel+i-1:Prel+i][0][4] PreRadious=PreTree[Prel+i-1:Prel+i][0][5] PreTheta= PreTree[Prel+i-1:Prel+i][0][6] R = Branch(PreEndX, PreEndY, PreRadius, PreTheta, 1) r = Branch(PreEndX, PreEndY, PreRadius, PreTheta, -1) Tree.append(R) Tree.append(r) Prel=l Deltal=l-Prel #増えた配列の長さをDeltalとおく。 for i in range(1,l+1): cv2.line(img, (int(Tree[i-1:i][0][0]), int(Tree[i-1:i][0][1])), (int(Tree[i-1:i][0][2]), int(Tree[i-1:i][0][3])),(255,255,255),2) cv2.imshow('forest of objects', img) cv2.waitKey(0) cv2.imshowAllWindows() PreTree=Tree #現在のTreeをPreTreeに格納しておく。 #---------------------------------------このfor文が実行されていない for number in range(1, 10): Main(number) print(number, "回実行されました。") #次のEND座標を計算するBranch関数を定義 def Branch(ThisEndX, ThisEndY, ThisRadius, ThisTheta, ThisDirection): ThisBeginX=ThisEndX ThisBeginY=ThisEndY ThisRadious = ThisRadius * 0.67 ThisTheta = ThisTheta + 30 if ThisTheta >= 360: ThisTheta = ThisTheta-360 if ThisTheta <= -360: ThisTheta = ThisTheta + 360 ThisThetaRad = np.radians(ThisTheta) ThisEndX = ThisEndX + np.sin(ThisThetaRad) * ThisRadius * ThisDirection ThisEndY = ThisEndY + np.cos(ThisThetaRad) * ThisRadius return (ThisBeginX, ThisBeginY, ThisEndX, ThisEndY, ThisRadius, ThisTheta)

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

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

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

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

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

1T2R3M4

2022/04/27 01:42

Errorはでていないのでしょうか。 画面上でEnterでも押してみては。
mia_flower

2022/04/27 02:40

ご返信いただきましてありがとうございます。cv2.waitKey(0)を記述した事を失念しておりました。 Enterを押したところ、 NameError: name 'Branch' is not defined とエラーが出たため、以下のようにコードを書き換えたところ、エラーは出なくなりました。 ``` import numpy as np import cv2 #黒背景 img = np.zeros((600,600,3), np.uint8) Tree = [] PreTree = [] l = len(Tree) def Main(number): Prel=l Deltal=l-Prel #増えた配列の長さをDeltalとおく。 print(l) ### 0が9回出力される if number == 1: PreEndX = 300 PreEndY = 0 PreRadius = 100 PreTheta = 0 R = Branch(PreEndX, PreEndX, PreRadius, PreTheta, 1) #右方向へのびる枝 r = Branch(PreEndX, PreEndX, PreRadius, PreTheta, -1) #左 Tree.append(R) Tree.append(r) else: for i in range(1, Deltal + 1): #増えた配列の長さの分、for文を実行 PreEndX= PreTree[Prel+i-1:Prel+i][0][3] PreEndY= PreTree[Prel+i-1:Prel+i][0][4] PreRadious=PreTree[Prel+i-1:Prel+i][0][5] PreTheta= PreTree[Prel+i-1:Prel+i][0][6] R = Branch(PreEndX, PreEndY, PreRadius, PreTheta, 1) r = Branch(PreEndX, PreEndY, PreRadius, PreTheta, -1) Tree.append(R) Tree.append(r) for i in range(1,l+1): #print(l) cv2.line(img, (int(Tree[i-1:i][0][0]), int(Tree[i-1:i][0][1])), (int(Tree[i-1:i][0][2]), int(Tree[i-1:i][0][3])),(255,255,255),2) PreTree=Tree #現在のTreeをPreTreeに格納しておく。 #次のEND座標を計算するBranch関数を定義 def Branch(ThisEndX, ThisEndY, ThisRadius, ThisTheta, ThisDirection): ThisBeginX=ThisEndX ThisBeginY=ThisEndY ThisRadious = ThisRadius * 0.67 ThisTheta = ThisTheta + 30 if ThisTheta >= 360: ThisTheta = ThisTheta-360 if ThisTheta <= -360: ThisTheta = ThisTheta + 360 ThisThetaRad = np.radians(ThisTheta) ThisEndX = ThisEndX + np.sin(ThisThetaRad) * ThisRadius * ThisDirection ThisEndY = ThisEndY + np.cos(ThisThetaRad) * ThisRadius return (ThisBeginX, ThisBeginY, ThisEndX, ThisEndY, ThisRadius, ThisTheta) ###for文の位置を変更 for number in range(1, 10): Main(number) print(number, "回実行されました。") #1〜9までが出力されている ###変更 cv2.imshow('forest of objects', img) cv2.waitKey(0) ``` しかし以下の問題が発生してしまいました。 ・配列が増えていない ・レインボーカーソルが出てしまい、フリーズする これはコードのどの部分に誤りがあるという事なのでしょうか?
guest

回答1

0

自己解決

変数の扱いが適切でなかったようで、
global変数を用いたところ、解決致しました。

ご協力いただきましてありがとうございました。

投稿2022/04/30 09:08

mia_flower

総合スコア66

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問