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

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

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

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Q&A

解決済

1回答

832閲覧

Python whileを一定時間でループする方法

ryusaku

総合スコア10

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

0グッド

0クリップ

投稿2023/03/27 13:00

実現したいこと

time.sleepを使って、もしくは他の方法でもいいので
whileを一定時間でループさせたいです。

前提

time.sleep(1)を試しましたがエラーが出ました。

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

Error: <class 'AttributeError'> 'str' object has no attribute 'sleep'

該当のソースコード

import sys import cv2 import numpy as np import math import time import csv #CSVライブラリの読み込み import datetime #日付ライブラリ読み込み #●日付時刻情報の取得-------------------------------------------------------------------- dtime = datetime.datetime.now() #日付、日時の取得 date = dtime.strftime('%Y-%m-%d') #日付の整形 yyyy-mm-dd time = dtime.strftime('%H:%M') #時間の整形 hh:mm sec = dtime.strftime('%S') #時間の整形 S ##--------------------------------------------------------------------------------------- try: capture=cv2.VideoCapture(0)#カメラを開く if capture.isOpened() is False: print("カメラを開けませんでした。") sys.exit() X_S=[296,323,359,386] #配置 Y_S=[160,160,160,160] WDT=31 HGT=65 cntr_top1=284 cntr_lft1=10 #cntr_top2=10 #cntr_lft2=425 cntr01 = np.array([[cntr_lft1,cntr_top1],[cntr_lft1,cntr_top1+100],[cntr_lft1+220,cntr_top1+100],[cntr_lft1+220,cntr_top1]]) #cntr02 = np.array([[cntr_lft2,cntr_top2],[cntr_lft2,cntr_top2+600],[cntr_lft2+5,cntr_top2+500],[cntr_lft2+5,cntr_top2]]) while(True): ret,frm_org =capture.read() ret, frame = cv2.threshold(frm_org ,45,255, cv2.THRESH_BINARY) cv2.fillPoly(frame,pts=[cntr01],color=(0,255,255)) #cv2.fillPoly(frame,pts=[cntr02],color=(0,255,255)) getVal=["0","0","0","0"] #枠の数作る for i in range(4): T_XS = X_S[i]-3 T_YS = Y_S[i]-10 T_XE = T_XS + WDT+6 T_YE = T_YS + HGT+10 #数値枠の色と太さ if i==0: cv2.rectangle(frame,(T_XS,T_YS),(T_XE,T_YE),(0, 0, 255),thickness=2) if i==1: cv2.rectangle(frame,(T_XS,T_YS),(T_XE,T_YE),(0, 255, 255),thickness=2) if i==2: cv2.rectangle(frame,(T_XS,T_YS),(T_XE,T_YE),(255, 255, 0),thickness=2) if i==3: cv2.rectangle(frame,(T_XS,T_YS),(T_XE,T_YE),(255, 0, 255),thickness=2) img_crop = frame[T_YS:T_YE,T_XS:T_XE] maxVal_All = 0.4 num_dsp = -1 #0〜9のテンプレートと照合 for j in range(11): i_tmpl=cv2.imread("t_plt"+str(j)+".jpg") result= cv2.matchTemplate(img_crop,i_tmpl,cv2.TM_CCOEFF_NORMED) mmr=cv2.minMaxLoc(result) maxVal=mmr[1] if maxVal > maxVal_All: num_dsp = j maxVal_All = maxVal if num_dsp != -1: getVal[i] = str(num_dsp) #print(getVal) if getVal[0] == "10": getVal[0] = "-" df0 = -1 df1 = int(getVal[1]) df2 = int(getVal[2]) df3 = int(getVal[3]) df = df0 *(df1 + df2*0.1 + df3*0.01) else: df1 = int(getVal[0]) df2 = int(getVal[1]) df3 = int(getVal[2]) df4 = int(getVal[3]) df = df1*10 + df2 + df3*0.1 + df4*0.01 print(df)#表示 #時間ーーーーーーーーーーーーーーーーーーーーーーーーー dtime2 = datetime.datetime.now() sec2 = dtime2.strftime('%S') print(sec2) #----------------------------------------------- #CSV保存------------------------------------------- with open(date + time +'.csv','a') as f: writer = csv.writer(f) writer.writerow([sec2,df])#秒と画像で読んだ数値 f.close() #-------------------------------------------------- #画面に数値を表示 cv2.putText(frame,getVal[0]+getVal[1]+"."+getVal[2]+getVal[3],(20,350),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,255),2,cv2.LINE_AA) #cv2.putText(frame,df) cv2.imshow('frame',frame) time.sleep(1) if cv2.waitKey(1) & 0xFF==ord('q'): break capture.release() cv2.destroyAllWindows() except: print("Error:",sys.exc_info()[0]) print(sys.exc_info()[1]) import traceback print(traceback.format_tb(sys.exc_info()[2]))

試したこと

https://qiita.com/montblanc18/items/05715730d99d450fd0d3
上記内容のようなことを実装したいのですが、やり方がわからなくて困っています。アドバイスいただけると助かります。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

melian

2023/03/27 13:06

time = dtime.strftime('%H:%M') #時間の整形 hh:mm ここで time という変数名を使用しているために time モジュールを shadowing してしまっています。なので、変数名を変更する必要があります。
ryusaku

2023/03/27 13:09

ありがとうございます。 盲点でした。。。。 参考に教えてください! 処理時間を考慮してthreadingとsleepを使う と、参考のURLにありましたが、こちらの方が精度良く1secピッチでループできますか? その場合どのように追加したらいいか教えていただけると助かります。
melian

2023/03/27 13:13

すでに回答が付いている状態ですので、この質問はクローズして「処理時間を考慮して〜」の部分を別質問として立てる方がよいかと思います。
ryusaku

2023/03/27 13:14

シグナルハンドラの方が精度いいですか?
ryusaku

2023/03/27 13:17

ありがとうございました。
guest

回答1

0

ベストアンサー

11 行目
time = dtime.strftime('%H:%M') #時間の整形 hh:mm

これのせいで、time ライブラリが上書きされてしまい、time変数が文字列となっているのがエラーの原因と思われます。

この行を含む以降の time となっている変数を、time以外の名前(たとえば stime など)に変えてみてはいかがでしょうか。

投稿2023/03/27 13:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ryusaku

2023/03/27 13:13

ありがとうございます 参考に教えてください。 精度良く、一定時間ループしたいです シグナルハンドラを使ったループの方法を教えていただけると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問