Responder a: Armazenamento de Imagem Colorida (Array com 03 dimensoes) em um Dataframe

Home Fóruns Fórum Visão Computacional: O Guia Completo Armazenamento de Imagem Colorida (Array com 03 dimensoes) em um Dataframe Responder a: Armazenamento de Imagem Colorida (Array com 03 dimensoes) em um Dataframe

#45677
Gabriel Alves
Moderador

    Olá Cesar!

    Para melhorar a performance ao armazenar e exibir imagens coloridas em um DataFrame eu acredito que algumas mudanças podem ser feitas na sua abordagem.

    No código de cadastro de usuários no DataFrame, atualmente você está convertendo cada imagem em uma lista antes de armazenar, o que pode ser bem ineficiente em termos de espaço e tempo de execução. Além disso, ao ler as imagens do DataFrame, você está usando ast.literal_eval para converter as strings de volta em listas, o que também pode vir a ser extremamente lento.

    Uma abordagem mais eficiente seria armazenar as imagens codificadas em base64 diretamente no dataframe. Isso não só melhora a performance, mas também facilita a manipulação dos dados.

    E codificando as imagens em base64 você reduz o tempo necessário para converter entre diferentes formatos de dados. Armazenar imagens codificadas como strings base64 em um CSV pode ser mais eficiente do que armazenar listas de números, além de facilitar a manipulação dos dados. Isso deve resolver o problema de performance que você está enfrentando e tornar o processo de armazenamento e recuperação de imagens mais eficiente.

    Aqui está uma sugestão de código com base no que você informou:

    [ ... importações e restante do código ] 
    
    # Função para converter imagem para base64
    def image_to_base64(image):
      _, buffer = cv2.imencode('.jpg', image)
      image_base64 = base64.b64encode(buffer).decode('utf-8')
      return image_base64
    
    # Função para converter base64 para imagem
    def base64_to_image(image_base64):
      image_data = base64.b64decode(image_base64)
      image_np = np.frombuffer(image_data, dtype=np.uint8)
      image = cv2.imdecode(image_np, cv2.IMREAD_COLOR)
      return image
    
    # Cadastrar usuario no Dataframe
    def cadastra_dataframe(full_name, imagem):
      nome = [full_name]
      imagem_base64 = [image_to_base64(imagem)]
    
      # Abrindo df existente
      df = pd.read_csv('usuario.csv')
    
      # Dados para ser incluído o dataframe existente
      dados = {'full_name': nome, 'imagem': imagem_base64}
      dados = pd.DataFrame(dados)
    
      df = pd.concat([df, dados], ignore_index=True)
      df.to_csv('usuario.csv', index=False)
    
    # Exibir as imagens gravadas no dataframe
    dados_df = pd.read_csv('usuario.csv')
    
    ### E para iterar sobre cada linha do DataFrame para exibir as imagens
    for i in range(len(dados_df)):
      full_name = dados_df['full_name'][i]
      print(full_name)
    
      inicio = time.time()
      imagem_base64 = dados_df['imagem'][i]
      imagem_array = base64_to_image(imagem_base64)
      fim = time.time()
      execucao = fim - inicio
      print(f'tempo de execucao : {execucao:.6f} segundos')
    
      cv2.imshow('Imagem Recuperada', imagem_array)
      cv2.waitKey(0)
      cv2.destroyAllWindows()