Я изо всех сил пытаюсь найти решение для этого:
Я создаю систему обнаружения шаблонов, используя фреймворк Yolo с Raspberry Pi и компьютером для обработки изображений, и до сих пор я изо всех сил пытаюсь получить соответствующий объект изображения в виде кадров для передачи по моей нейронной сети, даркнет. На самом деле я передаю кадры изображений с помощью библиотеки zeroZMQ, которая работает (малина отправляет изображения на компьютер с помощью нейронной сети), но у меня возникли проблемы с декодированием строки base64, которую я получаю из потока, и не могу показать ее с помощью cv2.imshow.
Функции моего серверного кода, ответственные за преобразование и декодирование base64, описаны ниже:
import argparse
from io import BytesIO, StringIO
import numpy as np
import cv2
from collections import defaultdict
from imutils.video import FPS
import imagezmq
import base64
import darknet
import requests
import os
from PIL import Image as im
from numpy import asarray
from time import sleep
print('[SERVER] - System initialization')
#imagezmq protocol
image_hub = imagezmq.ImageHub()
def convertImgBase64(image):
try:
imgString = base64.b64encode(image).decode('utf-8')
print('convertida com sucesso')
return imgString
except os.error as err :
print(f"Erro:'{err}'")
def readb64(base64_string):
try:
sbuf = BytesIO()
sbuf.write(base64.b64decode(str(base64_string)))
pimg = im.open(sbuf)
print('leu string b64')
return cv2.cvtColor(np.array(pimg), cv2.COLOR_RGB2BGR)
except os.error as err :
print(f"Erro:'{err}'")
def capture_img():
storage = '/home/caio/Desktop/img/'
#header = 'data:image/jpeg;base64,'
while True:
camera, jpg_buffer = image_hub.recv_jpg()
buffer = np.frombuffer(jpg_buffer, dtype='uint8')
imagedecoder = cv2.imdecode(buffer, cv2.IMREAD_COLOR)
print(type(imagedecoder))
img = im.fromarray(imagedecoder)
print(type(img))
try:
print('Converting...')
string = convertImgBase64(imagedecoder)
print(string)
cvimg = readb64(string)
print(cvimg)
cv2.imshow(camera, cvimg)
print('Image read')
print(cvimg)
sleep(2)
except os.error as err :
print(f"Error:'{err}'")
#cv2.imshow(camera, imagedecoder)
cv2.waitKey(1)
image_hub.send_reply(b'OK')
И клиент (код raspberry pi) приведен ниже:
import sys
import socket
import time
import cv2
from imutils.video import VideoStream
import imagezmq
import argparse
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-s", "--server-ip", required=True,
help="ip address of the server to which the client will connect")
args = vars(ap.parse_args())
# initialize the ImageSender object with the socket address of the
# server
sender = imagezmq.ImageSender(connect_to="tcp://{}:5555".format(
args["server_ip"]))
# use either of the formats below to specifiy address of display computer
# sender = imagezmq.ImageSender(connect_to='tcp://192.168.1.190:5555')
rpi_name = socket.gethostname() # send RPi hostname with each image
vs = VideoStream(usePiCamera=True, resolution=(800, 600)).start()
time.sleep(2.0) # allow camera sensor to warm up
jpeg_quality = 95 # 0 to 100, higher is better quality, 95 is cv2 default
while True: # send images as stream until Ctrl-C
image = vs.read()
ret_code, jpg_buffer = cv2.imencode(
".jpg", image, [int(cv2.IMWRITE_JPEG_QUALITY), jpeg_quality])
sender.send_jpg(rpi_name, jpg_buffer)
Мой вывод ошибок сейчас выглядит так:
Я пробовал решение здесь и здесь
Я надеюсь, что кто-нибудь сможет дать мне прикурить, мне становится очень грустно в этот момент.
Спасибо!