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

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

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

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

Python

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

Q&A

解決済

4回答

529閲覧

パソコンが固まってしまう。

tasuke

総合スコア53

OpenCV

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

Python

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

0グッド

0クリップ

投稿2018/11/19 08:49

編集2018/11/19 14:14

現在、python3.5.5とOpenCV3.4.3を使用し、ハフ変換でのリアルタイム円検出と各円の出現時間を個別に計測できるシステムを作製しようと考えています。作成したプログラムは以下の通りです。

python

1from datetime import datetime 2import math 3import numpy as np 4import cv2 5 6FIND_DIST = 10 7targets = [] 8 9def inp_points(): 10 pts = [] 11 while True: 12 s = (x1,y1) 13 if len(s) < 2: 14 break 15 16 pts.append((x1,y1)) 17 return pts 18 19id = 1 20cap = cv2.VideoCapture(0) 21while True: 22 now_time = datetime.now() 23 ret, frame = cap.read() 24 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 25 gray = cv2.GaussianBlur(gray, (33,33), 1) 26 circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 60, param1=10, param2=85, minRadius=10, maxRadius=80) 27 if circles is not None: 28 circles = np.uint16(np.around(circles)) 29 for i in circles[0,:]: 30 cv2.circle(frame,(i[0],i[1]),i[2],(255,255,0),2) 31 cv2.circle(frame,(i[0],i[1]),2,(0,0,255),3) 32 x1 = i[0] 33 y1 = i[1] 34 35 pts = inp_points() 36 if len(pts) <= 0: 37 break 38 39 for tgt in targets: 40 tgt['bIn'] = False 41 42 new_tgts = [] 43 44 for pt in pts: 45 bIn = False 46 for tgt in targets: 47 48 if math.sqrt( math.pow(pt[0] - tgt['pos'][0], 2) + math.pow(pt[1] - tgt['pos'][1], 2)) <= FIND_DIST: 49 tgt['bIn'] = True 50 tgt['pos'] = pt 51 bIn = True 52 53 if not bIn: 54 new_tgt = {'id':id,'bIn':True,'pos':pt,'in_time':now_time} 55 new_tgts.append(new_tgt) 56 id += 1 57 58 for tgt in targets: 59 if tgt['bIn']: 60 new_tgts.append(tgt) 61 else: 62 print('{}sec'.format((now_time - tgt['in_time']).total_seconds())) 63 64 65 cv2.imshow('preview', frame) 66 key = cv2.waitKey(10) 67 if key == ord("q"): 68 break 69 70cv2.destroyAllWindows() 71コード

動かそうとしたところ、パソコンが固まってしまいました。調べたところ、パソコンが固まってしまう原因として、CPUの不足が原因とありました。しかし、あまりITに関して詳しくなく実際の原因が何なのかわからない状態です。使用しているシステムプロセッサはIntel(R) Core(TM) i5-4310M CPU @ 2.70GHz 2.70GHz、RAMは8.0GB、64ビットオペレーティングシステムを使用しています。です。助けていただけるとありがたいです。

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

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

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

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

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

manzyun

2018/11/19 08:58

print('{}sec').format(以下略)の表示もされずに固まっていますか? もしそうであれば、その前の時点の処理が非常に重たい可能性が高いです。 また、パソコンのメモリ(RAM)容量もお伝えいただけると幸いです。
tasuke

2018/11/19 09:12

コメントありがとうございます。状態としては、時間表示(print~)もありません。RAMは8.0GB、64ビットオペレーティングシステムを使用しています。
guest

回答4

0

Pythonは詳しくありませんので教えてほしいのですが、どうやってwhileから抜けるのですか。

def inp_points(): pts = [] while True: pts.append((x1,y1)) return pts

投稿2018/11/19 11:51

1T2R3M4

総合スコア114

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

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

tasuke

2018/11/19 14:17

回答ありがとうございます。ループから抜ける条件を書いていませんでした。参考になりました。
guest

0

ベストアンサー

Win10、Corei7メモリ8GBなマシンで再現しました。
起動したとたん、マウスカーソルから固まりますね。
状況としてはメモリ不足になっていました。
メモリを増やすか、画像サイズやHoughCircles関数のパラメータを調整するしかないと思います。
パラメータについては円を検出するが参考になりそうです。多少弄んでみましたが、どうしても固まりましたが。

inp_points()関数内で無限ループに陥ってます。

すなわち、現フレームで検出された点群をptsに格納する部分に問題があります。
この点についてはすでに他の方も回答済みなので、それ以外の問題を指摘します。

  • 後の距離計算で桁あふれしないようpts.append( (float(x1), float(y1)))のように uint -> float変換が必要です。
  • どこかにtargets = new_tgtsが必要です。

いまいちど前回の質問検出した物体の時間計測についての回答コードを実際に動かし動作を理解したうえで考えてみてください。

投稿2018/11/19 10:43

編集2018/11/20 03:03
can110

総合スコア38262

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

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

tasuke

2018/11/19 14:38 編集

先日は大変参考になるプログラムのサンプルコードをありがとうございます。また、今回も貴重なお時間を割き、検証してただきありがとうございます。 inp_points()関数内のループに関してですが、抜け出す条件を追加しましたが止まってしまいます。やはり、私の書き方が間違っているのでしょうか。それとも、単にメモリが不足しているだけなのでしょうか。これまで手取り足取り教えていただき、おこがましいとは思いますが、お時間取れた時にでも回答していただけるとありがたいです。 長文失礼します。
can110

2018/11/21 00:13

おそらくコードが間違っています。今回のコードでは点群の座標はx1,y1として取得できているので、これをリストに追加するだけでよいです。 つまりinp_points関数は不要です。
tasuke

2018/11/21 12:56

たいへん詳しく解説していただき、ありがとうございます。アドバイスを参考に、修正したいと思います。
guest

0

inp_points()内の以下の記述は、何を意図していますか?

s = (x1,y1) if len(s) < 2: break

コード通り実行すると、要素が2つのタプルを代入して、その要素数が2未満の場合にループを抜けるようになっているため、無限ループになります。
lenで何を調べようとしたのですか?

投稿2018/11/20 02:49

m-take

総合スコア249

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

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

0

直接の回答にはなりませんが、inp_points()でデバグを行ってみてはいかがでしょう。

import pdb; pdb.set_trace()

を挿入すると、容易にデバグを行うことができます。
デバグに入った後はヘルプを確認すれば操作はわかると思います。

投稿2018/11/20 02:07

mishura

総合スコア67

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問