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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

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

Python

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

Q&A

解決済

2回答

1146閲覧

pythonでのflagの立て方

uriuri

総合スコア47

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2018/08/29 09:32

ロボットを動かして物体を見つけたら止まるという動作を行いたいと思っています。
その条件として矩形に囲まれ、さらに直線が矩形にある際、目的のものとしたいと思っています。
同時にこの条件が成り立ったとき出力を1、そうでないときを0にしたいと考えています。

python

1(省略)#与えられた画像から 2#矩形検出 3img, contours, hierarchy = cv2.findContours(th1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) 4if len(contours) > 0: 5 for i in range(0, len(contours)): 6 #perimeter = cv2.arcLength(contours[i],True) 7 #if perimeter > 10: 8 cnt = contours[i] 9 M = cv2.moments(cnt) 10 #print(M) 11 area = cv2.contourArea(cnt) 12 print(area) 13 if 500 < area < 5000: 14 # continue 15 16 #rect = contours[i] 17 #x, y, w, h = cv2.boundingRect(rect) 18 #cv2.rectangle(img_src, (x, y), (x + w, y + h), (255, 0, 0), 2) 19 rect = cv2.minAreaRect(contours[i]) 20 box = cv2.boxPoints(rect) 21 #print(box) 22 box = np.int0(box) 23 x1,x2,x3,x4 = np.int0(box) 24 a = np.array(x1) 25 b = np.array(x2) 26 c = np.array(x3) 27 d = np.array(x4) 28 #d = math.sqrt((x4-x1)** 2) 29 A = np.linalg.norm(a-b) 30 B = np.linalg.norm(a-c) 31 C = np.linalg.norm(a-d) 32 33 print("頂点",x1,x2,x3,x4) 34 print("Aの長さ", A) 35 print("Bの長さ",B) 36 print("Cの長さ",C) 37       if A > B: 38 min = A 39 else: 40         min = B 41 if C > min: 42 min = C 43 print("最小",min) 44 if 5 < min < 25: 45 im = cv2.drawContours(img_src,[box],0,(0,255,0),2) 46 47#直線検出 48LSD = cv2.createLineSegmentDetector() 49 50lines, width, prec, nfa = LSD.detect(edges) 51#print(width) 52#print(lines) 53#print(prec) 54#print(nfa) 55 56#color = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR) 57 58for i in range(len(lines)): 59 60 for x1,y1,x2,y2 in lines[i] : 61 #if width > 1.2: 62 # continue 63 cv2.line(img_src,(x1,y1),(x2,y2),(0,0,255),2) 64(以下省略) 65

この2つの処理をどう用いて使い、フラグを立てる方法のイメージがつかず、アドバイスいただけると幸いです。

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

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

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

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

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

tachikoma

2018/08/29 10:17

検出した矩形のうち、直線が含まれているものすべてを列挙したい…んですかね。
guest

回答2

0

ベストアンサー

矩形に囲まれ、さらに直線が矩形にある

矩形に囲まれているか
直線が矩形に含まれているか

上記2つをそれぞれ関数にしてしまい、
func1() && func2()
で条件分岐すれば良いのではないでしょうか。
*funcの引数は適当に

投稿2018/08/29 14:53

t_obara

総合スコア5488

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

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

uriuri

2018/08/31 05:46

各処理自体をdef で関数にしてやることは理解できたのですが... #矩形検出 def funk1(): img, contours, hierarchy = cv2.findContours(th1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) if len(contours) > 0: (以下省略) #直線検出 def fuc2(): LSD = cv2.createLineSegmentDetector() どのような形で条件文をつくればいいか困っています。 アドバイスをいただけると幸いです。
t_obara

2018/08/31 06:10

各関数で条件を満たした場合にTrue、それ以外はFalseを返却するようにします。
uriuri

2018/08/31 07:51

def func1(contours): img, contours, hierarchy = cv2.findContours(th1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) if len(contours) > 0: (以下省略) def func2(lines): LSD = cv2.createLineSegmentDetector() (以下省略) についてそれぞれ条件を満たした場合TrueやFalseを返してやりたいのですが、調べたところ def score(a): if a > 60: return True else: return False といったある値を超えたらtrueやfalseを吐くといった条件文なのですが 今回の場合処理全体を関数と定義してやり処理全体を満たした場合trueと表現したいのですが判断となる値をどのようにとっていいのかわからず悩んでいます。 知識不足で申し訳ありません。
t_obara

2018/08/31 08:23

ですので、その戻り値をさらに最初に提示したような条件で判断すればとの回答だったのですが。
uriuri

2018/09/02 08:28

回答の通り自分なりに変更してみたのですが... def func1(): img, contours, hierarchy = cv2.findContours(th1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1) if len(contours) > 0: (以下省略)  return True a = func1 print(a) def func2(): LSD = cv2.createLineSegmentDetector() (以下省略)   return True b = func2() print(b) if func1() and func2() == True: print("prosess") else: print("no") この場合だと矩形が表示されていなくてもprosessという表示になってしまいます。 流れとして処理1を終えてTrueを戻り値で返しているからだと思うんですが... 囲まれたときにTrueとしたい場合のアドバイスをいただいてもよろしいでしょうか。 プログラミング初心者ですみません。
t_obara

2018/09/03 01:07

矩形が表示されているか否か、わたしには分かりかねるのですが、func1は矩形を検出するだけで表示されているかを判断していないということでしょうか? 元の質問は、矩形に囲まれ、かつ直線が矩形にあるという条件だったので、各条件を判断すれば良いとの回答なのですが、条件が若干違うのに回答を字句通り判断しては回答に結びつかないのではないでしょうか。 条件に違う部分があるのであれば、違うように組み立てる必要があります。
guest

0

  1. flag1 と flag2 を双方false にしておく
  2. 「矩形に囲まれ」たときにflag1 をtrue にする
  3. 「直線が矩形にある際」にflag2 をtrueにする
  4. その後、flag1 && flag2 のときに目的とする処理を行う

投稿2018/08/29 14:29

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問