我使用此代码来识别QR和EAN代码。它运行良好。
但几个小时后,它停止了错误。即使我不使用它。为什么会发生这种情况?错误如下。它说萨莫廷的天空=框架是错误的[80:1200330:1500]。我是Python的新手,所以我一无所知。
错误:
天空=帧[800:1200330:1500]
python类型错误:"NoneType"对象不可下标
import cv2
import numpy as np
from pyzbar.pyzbar import decode
from matplotlib import pyplot as plt
from gpiozero import Buzzer
from time import sleep
qr= "1"
ean="1"
def wyslijEmail(tresc):
port = 465 # For SSL
smtp_server = "smtp.gmail.com"
sender_email = "***" # Enter your address
receiver_email = "***" # Enter receiver address
password = "***"
context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, tresc)
def decoder(image):
gray_img = cv2.cvtColor(image,0)
barcode = decode(gray_img)
global a
global qr
global ean
buzzer = Buzzer(14)
kodQR = "QR"
ean13 = "EAN"
for obj in barcode:
points = obj.polygon
(x,y,w,h) = obj.rect
pts = np.array(points, np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(image, [pts], True, (0, 255, 0), 3)
barcodeData = obj.data.decode("utf-8")
barcodeType = obj.type
if kodQR in barcodeType:
print("qr")
if qr != str(barcodeData):
qr=str(barcodeData)
wyslijEmail(barcodeData)
print("wysylam @")
buzzer.on()
sleep(1)
buzzer.off()
sleep(1)
else :
print("nowy kod")
elif ean13 in barcodeType:
print("ean")
if ean != str(barcodeData):
ean=str(barcodeData)
wyslijEmail(barcodeData)
print("wysylam @")
buzzer.on()
sleep(1)
buzzer.off()
sleep(1)
else :
print("nowy kod")
string = "Data " + str(barcodeData) + " | Type " + str(barcodeType)
cv2.putText(frame, string, (x,y), cv2.FONT_HERSHEY_SIMPLEX,0.8,(255,0,0), 2)
print("Barcode: "+barcodeData +" | Type: "+barcodeType )
print(a)
a=a+1
cap = cv2.VideoCapture(0)
cap.set(3, 2592)
cap.set(4, 1944)
a=0
while True:
ret, frame = cap.read()
sky = frame[800:1200,330:1500]
decoder(sky)
cv2.imshow('Image', sky)
code = cv2.waitKey(10)
if code == ord('q'):
break```
也许frame
还不可用,您可以通过评估来确保它可用
if frame is None:
continue