実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
time = dtime.strftime('%H:%M') #時間の整形 hh:mm
ここで time という変数名を使用しているために time モジュールを shadowing してしまっています。なので、変数名を変更する必要があります。
ありがとうございます。
盲点でした。。。。
参考に教えてください!
処理時間を考慮してthreadingとsleepを使う
と、参考のURLにありましたが、こちらの方が精度良く1secピッチでループできますか?
その場合どのように追加したらいいか教えていただけると助かります。
すでに回答が付いている状態ですので、この質問はクローズして「処理時間を考慮して〜」の部分を別質問として立てる方がよいかと思います。
シグナルハンドラの方が精度いいですか?
ありがとうございました。
回答1件
あなたの回答
tips
プレビュー