私はウェブカメラを使ってOCRを使ってプロジェクトを進めています。私は、フレームを保存するためのcapture()
関数を定義しました。この関数は、最小で20の等高線と、60ピクセルを超える領域が3秒間に含まれています。私はサイクルが常に働いている間、メインを必要とします。だから私はcapture()
関数を呼び出すスレッドを使用しています。コードを実行すると、Python Shellがエラーを返しました:NameError:グローバル名フレーム、ln2が定義されていません。 13番目のコメント行は、変数フレームのエラーを解決します。 whileサイクルの中にあるすべてのコードを複製する必要があることを意味しますか?グローバル変数のエラーがPythonのスレッド関数で定義されていません
import cv2
import time
import threading
cap = cv2.VideoCapture(0)
def capture():
global frame, ln2
if ln2 > 20:
cv2.imwrite("frame.jpg", frame)
time.sleep(3)
#ret, frame = cap.read() #it solves the error for variable 'frame'
child_t = threading.Thread(target = capture)
child_t.setDaemon(True)
child_t.start()
while(1):
a = []
ret, frame = cap.read()
img1 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
_, img2 = cv2.threshold(img1, 127, 255, cv2.THRESH_BINARY)
(_, contornos, _) = cv2.findContours(img2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
ln = len(contornos)
for i in range (0, ln):
cn = contornos[i]
x, y, w, h = cv2.boundingRect(cn)
area = 2*(w+h)
if area > 60 and area < 1000:
cv2.rectangle(frame, (x,y), (x+w, y+h), (0, 255, 0), 2)
a.append(area)
ln2 = len(a)
print ln2
#here I want to call capture() function
cv2.imshow('Webcam', frame)
if cv2.waitKey(1) & 0xFF == ord('x'):
break
child_t.join()
cap.release()
cv2.destroyAllWindows()
私は今日も最初のコーヒーにいますが、トップスコープでグローバルを宣言することはありません。関数内でのみ。あなたは機能の外でそれを行う必要があります。バイトコードでは、それを却下したい場合はSTORE_GLOBALと表示され、関数にはLOAD_GLOBALと表示されます。もちろん、STOREとLOADは失敗しません。 –