python De JPG para b64encode para cv2.imread()




opencv numpy (2)

A partir da documentation do OpenCV, podemos ver que:

imread : Carrega uma imagem de um arquivo.

imdecode : lê uma imagem de um buffer na memória.

Parece uma maneira melhor de fazer o que você quer.

Para um programa que estou escrevendo, estou transferindo uma imagem de um computador - usando base64.b64encode (f.read (image)) - e tentando lê-lo no script de recebimento sem salvá-lo no disco rígido (em um esforço para minimizar Tempo de processamento). Eu estou tendo dificuldade em descobrir como ler a imagem no OpenCV sem salvá-la localmente.

Aqui está o meu código para enviar a imagem:

f = open(image.jpg)
sendthis = f.read()
f.close()
databeingsent = base64.b64encode(sendthis)
client.publish('/image',databeingsent,0) 
# this is an MQTT publish, details for SO shouldn't be relevant

Enquanto isso, aqui está o código para recebê-lo. (Isso está em uma função on_message, já que estou usando o MQTT para a transferência).

def on_message(client, userdata, msg): # msg.payload is incoming data
    img = base64.b64decode(msg.payload)
    source = cv2.imread(img)
    cv2.imshow("image", source)

Depois que a mensagem decodifica, eu tenho o erro: "TypeError: Seu tipo de entrada não é um array numpy".

Fiz algumas pesquisas, e não consigo encontrar uma solução relevante - existem algumas relacionadas à conversão de arquivos de texto para numpy usando b64, mas nenhuma realmente se relaciona com o uso de uma imagem e a leitura imediata dos dados decodificados no OpenCV sem o intermediário passo de salvá-lo no disco rígido (usando o processo inverso usado para ler o arquivo no script "send").

Eu ainda sou muito novo para Python e OpenCV, então se há um método de codificação melhor para enviar a imagem - o que quer que resolva o problema. Como a imagem é enviada é irrelevante, desde que eu possa lê-la no final de recebimento sem salvá-la como um .jpg em disco.

Obrigado!


Você pode obter um array numpy de seus dados decodificados usando:

import numpy as np
...
img = base64.b64decode(msg.payload)
npimg = np.fromstring(img, dtype=np.uint8)

Então você precisa imdecode para ler a imagem de um buffer na memória. imread serve para carregar uma imagem de um arquivo.

Assim:

import numpy as np
...
def on_message(client, userdata, msg): # msg.payload is incoming data
    img = base64.b64decode(msg.payload); 
    npimg = np.fromstring(img, dtype=np.uint8); 
    source = cv2.imdecode(npimg, 1)






numpy