python - world - testing opencv
De JPG para b64encode para cv2.imread() (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)