Python JSON 对象必须是 str,而不是 'tuple'



我的代码崩溃了以下错误:

typeError:json对象必须是str,而不是'tuple'

我已经从ALPR印刷了交流,我收到以下内容:

(b'plate0:10结果 n -sbg984 t置信度:85.7017 n- SBG98 t置信度:83.3453 n -s8g984 t置信:78.3329 n- 5BG984 t置信度:76.6761 n -s8g98 t置信:75.9766 n- SDG984 t置信度:75.5532 n -5bg98 t置信度:74.3198 n- SG984 t置信度:73.3743 n -SDG98 t置信度:73.1969 n- BG984 t信心:71.7671 n',无)

我想知道如何使代码阅读并将其分解?我从在网上找到的另一个示例中获取了以下代码,它对他们有用,因此我不确定我在做什么错。我已将代码附加在下面。

# Setting up Pyrebase config below
config = {
}
camera = PiCamera()
global alpr_command_args
def Take_an_Image():
    global alpr_command_args
    camera.start_preview()
    sleep(5)
    camera.capture('picture.jpg')
    camera.stop_preview()
    #alpr subprocess args
    alpr_command = "alpr -c gb pictureold.jpg"
    alpr_command_args = shlex.split(alpr_command)
    read_plate()
def alpr_subprocess():
    global alpr_command_args
    return subprocess.Popen(alpr_command_args, stdout=subprocess.PIPE)
def alpr_json_results():
    alpr_out, alpr_error = alpr_subprocess().communicate()
    if not alpr_error is None:
        return None, alpr_error
    elif b"No license plates found." in alpr_out:
        return None, None
    try:
        return json.loads(alpr_out), None
    except (ValueError) as e:
        return None, e

def read_plate():
    alpr_json, alpr_error = alpr_json_results()
    if not alpr_error is None:
        print (alpr_error)
        return
    if alpr_json is None:
        print ("No results!")
        return
    results = alpr_json["results"]
    print(results)
    ordinal = 0
    for result in results:
        candidates = result["candidates"]
        for candidate in candidates:
            if candidate["matches_template"] == 1:
                ordinal += 1
                print ("PLATE " + candidate["plate"] + candidate["confidence"])

firebase = pyrebase.initialize_app(config)
db = firebase.database()
# Setting initial values to Firebase Database on startup
data = {
    "CAMERA": "OFF",
}
# Setting default values on Pi
results = db.update(data)
# This is the handler when Firebase database changes
def stream_handler(message):
    path = str(message["path"]) # This is what sensor changes, e.g path returns /LED
    status = str(message["data"]) # This is what the sensor says, e.g /LED says "ON"
    # Getting global values
    if path =="/CAMERA":
        if status == "ON":
            print("**TAKE PIC**")
            data = {
                "CAMERA": "OFF",
            }
            results = db.update(data)
            Take_an_Image();
# Starting stream for Firebase
my_stream = db.stream(stream_handler)

更新:

尝试Denis的方法,我收到以下错误:

线程线程中的例外1:trackback(最新呼叫最后):
文件"/usr/lib/python3.5/threading.py",第914行,in _bootstrap_inner self.run()文件"/usr/lib/python3.5/threading.py",第862行,运行 self.__target(*self._args,** self._kwargs)文件"/home/pi/.local/lib/lib/python3.5/site-packages/pyrebase/pyrebase/pyrebase.py", 第563行,在start_stream中 self.stream_handler(msg_data)文件" camera.py",第96行,在stream_handler中 take_an_image();文件" camera.py",第29行,take_an_image read_plate()文件" camera.py",第50行,read_plate alpr_json,alpr_error = alpr_json_results()文件" camera.py",第36行,in alpr_json_results 埃利夫"找不到盘子"。在alpr_out中:typeError:需要一个字节般的对象,而不是" str"

更新:

通过在"找不到车牌"之前添加A B来解决字节问题。我现在遇到以下错误:

线程线程中的例外1:trackback(最新呼叫最后):
文件"/usr/lib/python3.5/threading.py",第914行,in _bootstrap_inner self.run()文件"/usr/lib/python3.5/threading.py",第862行,运行 self.__target(*self._args,** self._kwargs)文件"/home/pi/.local/lib/lib/python3.5/site-packages/pyrebase/pyrebase/pyrebase.py", 第563行,在start_stream中 self.stream_handler(msg_data)文件" camera.py",第96行,在stream_handler中 take_an_image();文件" camera.py",第29行,take_an_image read_plate()文件" camera.py",第52行,在read_plate中 alpr_json,alpr_error = alpr_json_results()文件" camera.py",第46行,在alpr_json_results中 返回json.loads(alpr_out),无文件"/usr/lib/python3.5/json/json/pintep_s> init .py",第312行,在LOADS中 s。 class 名称))typeError:json对象必须是str,而不是'bytes'

我无法复制您获得的数据,但是就像我尝试过的输出一样,我可以得出这个结论,以从对象中获得板和信心分析:

import json
alpr_example = b'plate0: 10 resultsn - SBG984t confidence: 85.7017n - SBG98t confidence: 83.3453n - S8G984t confidence: 78.3329n - 5BG984t confidence: 76.6761n - S8G98t confidence: 75.9766n - SDG984t confidence: 75.5532n - 5BG98t confidence: 74.3198n - SG984t confidence: 73.3743n - SDG98t confidence: 73.1969n - BG984t confidence: 71.7671n', None
def alpr_json_results():
    alpr_out, alpr_error = alpr_example
    if not alpr_error is None:
        return None, alpr_error
    elif b"No license plates found." in alpr_out:
        return None, None
    try:
        decoded = alpr_out.decode('utf-8')
        decoded = decoded.replace('-', 'plate:')
        decoded = decoded[19:]
        decoded = decoded.replace('plate:', ',plate:')
        decoded = decoded.replace('confidence:', ',confidence:')
        decoded = decoded.split(',')
        decoded.pop(0)
        plateList=[]
        confidenceList=[]
        for i, item in enumerate(decoded):
            if (i%2 == 0):
                print(item.replace('plate: ',''))
            else:
                print(item.replace('confidence: ',''))
        return plateList, confidenceList
    except (ValueError) as e:
        return None, e
alpr_json_results()
#SBG984  
#85.7017
# 
#SBG98   
#83.3453
# 
#S8G984  
#78.3329
# 
#5BG984  
#76.6761
# 
#S8G98   
#75.9766
# 
#SDG984  
#75.5532
# 
#5BG98   
#74.3198
# 
#SG984   
#73.3743
# 
#SDG98   
#73.1969
# 
#BG984   
#71.7671

最新更新