海思AI芯片(Hi35XX): 图像jpg转.bgr

前言

        把一张jpg图片转成bgr(注意顺序是bgr)二进制文件,最近在弄华为Hi3516DV300开发板上的一些深度学习的样例程序,换言之,35xx nnie SDK只支持BGR以及yuv格式的数据输入。那么当手头刚好只有jpeg/png等图片文件时,怎么来进行目标识别呢,一般的思路是用opencv来读取图片文件,然后再转换成BGR/YUV等格式,最后扔到NNIE模块来进行深度学习推理。

        本篇讲解jpg转bgr,也就是它的输入文件不是普通的jpg,而是bgr格式的二进制文件,还别说,这样确实是大大节省了空间。一张3.8M的测试文件(test.jpg),转成二进制后为276K。本篇使用python来实现,网上大部分都是c/c++实现的,对于一个python用习惯并且用来验证结果,我觉得python转化更为习惯吧。

        本代码仅面向学习海思35xx的各位。转化完不是标准bgr格式,由于Hi35xx的bgr分布不是标准格式,所以写了一点代码进行bgr与jpg格式图片互相转化,并逆向思维进行测试转化后的bgr。

代码部分

# -*- coding: UTF-8 -*-
# author: AnnSun
# date :2020.05.12

import os
import cv2
from numpy import *
import numpy as np


class JPG2BGR_Solver(object):
    def __init__(self):
        self.img_size = 416  # save bgr size
        # jpj2bgr  converbgr=true 参数设置
        self.imgpath_jpg = r"pose_368.jpg"
        self.saveimg_bgr = r"pose_368.bgr"
        # testbgr  converbgr=false 参数设置
        self.jpeg_path = r"./BGR_img/double_roipooling_224_224.jpg"
        self.path = "./BGR_img/24_608x608.bgr"

    """海思nnie模型需要输入bgr 格式的图片,这个python脚本可以把jpg格式的图片转换成.bgr格式的图片"""
    def jpg2bgr(self):
        save_img_size = self.img_size
        imgpath = self.imgpath
        img = cv2.imread(imgpath)

        if img is None:
            print("img is none")
        else:
            img = cv2.resize(img,(save_img_size,save_img_size))
            (B, G, R) = cv2.split(img)
            with open(saveimg,'wb')as fp:
                for i in range(save_img_size):
                    for j in range(save_img_size):
                        fp.write(B[i, j])
                        print(B[i,j])
                for i in range(save_img_size):
                    for j in range(save_img_size):
                        fp.write(G[i, j])
                for i in range(save_img_size):
                    for j in range(save_img_size):
                        fp.write(R[i, j])

            print("save success")

    """查看bgr文件内容并显示为图片"""
    def test_Hi_bgr(self):

        jpeg_path = self.jpeg_path
        path = self.path
        imgsize = self.img_size

        f = open(path, 'rb')
        src = cv2.imread(jpeg_path)
        src = cv2.resize(src, (imgsize, imgsize))
        print(src.shape)
        h = src.shape[0]
        w = src.shape[1]
        c = src.shape[2]
        print(f.name)
        (B, G, R) = cv2.split(src)

        data = f.read(imgsize*imgsize*3)
        for j in range(imgsize):
            for i in range(imgsize):
                B[j, i] = data[j*imgsize + i]
                G[j, i] = data[j*imgsize + i + imgsize*imgsize]
                R[j, i] = data[j*imgsize + i + imgsize*imgsize*2]

        newimg = cv2.merge([B, G, R])

        cv2.imshow("new", newimg)

        f.close()
        cv2.waitKey(0)

if __name__ == '__main__':
    converbgr = true
    solverObj = JPG2BGR_Solver()
    if (converbgr == true):
        solverObj.jpg2bgr()
    else:
        solverObj.test_Hi_bgr()

 

 


 

上一篇:移动端点击延迟300毫秒----FastClick用法


下一篇:移动端300ms特殊处理