웹캠을 사용하여 OCR 프로젝트에서 작업하고 있습니다. 나는 프레임을 저장하기위한 capture()
함수를 정의했다.이 함수는 최소 20 개의 등고선을 포함하고 있으며, 60 초 이상의 영역은 3 초가 걸린다. 주기가 항상 작동하는 동안 나는 그것을 필요로합니다. 그래서 capture()
함수를 호출하는 스레드를 사용하고 있습니다. 코드를 실행할 때 파이썬 쉘이 오류를 반환했습니다 : NameError : ln2 전역 이름 프레임이 정의되지 않았습니다. 13 번째 주석 행은 변수 프레임에 대한 오류를 해결합니다. while 순환 안에있는 모든 코드를 복제해야한다는 의미입니까?전역 변수의 오류가 파이썬의 스레드 함수에 정의되어 있지 않습니다.
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는 실패하지 않습니다. –