利用python的serial库读取as608芯片指纹图片并保存在上端机(电脑)

我们是学算法的,对于串口通信没有怎么接触过,网上大多数利用单片机进行数据采集。上一篇文章,读取到了数据但是数据清洗出现问题。本来应该是256*288的图片,但是采集到的图片只有128*288的图片。经过查资料,以及在网站提问,最终发现问题所在在as608手册中很明显的说明了这里一个4bit代表一个像素,所以说我们要把接收到的8bit数据转化位4bit的数据,但是电脑默认的灰度值是0-255,4bit数据只能代表0-16。我们这里需要将数转化一下,一般是进行移位再进行利用掩码(这种方法望读者自己网络查找,很多),我使用的是一种比较取巧的方法,将二进制数转化为10进制数后对16取整,取余得到高,低四位(高位4bit和低位4bit的数据)。

下面是我的代码(因为我查资料的时候,很多的私密了,我和作者聊,我觉得这个功能很简单,但是要收我2000yuan,很气愤,所以免费发了)愿能帮助到后面的和我一样的大学生社畜。

def add_3000_picture():    
    uart=serial.Serial(port="COM3",
                      baudrate=9600*6,
                      parity=serial.PARITY_NONE,
                      stopbits=serial.STOPBITS_ONE,
                      bytesize=8,
                      timeout=1
                                )
    uart.reset_input_buffer()  # 清空串口缓冲区 
    a=uart.write(bytearray.fromhex("EF01 FFFFFFFF 01 0003 01 0005"))
    data=uart.read(a) #发送录取图像命令查看应答
    
    b=uart.write(bytearray.fromhex("EF01 FFFFFFFF 01 0003 0a 000e"))
    data1 = b''
    while True:
        data = uart.read(4096)  # 读取一次最多4096字节
        if not data:  # 如果读取完了就跳出循环
            break
        data1 += data
    uart.flush()
    uart.close()
    return data1
    
    #print(len(data1))  # 打印实际读取的字节数                                                   
    
def savepicture(data,name):
    data6=[]
    for i in data:
        data6.append(i)
    lenth=len(data6)
    index=[]
    for i in range(lenth-8):#获取包头
        if (data6[i]==239 and data6[i+1]==1 and data6[i+2]==255 and data6[i+3]==255 and data6[i+4]==255 and data6[i+5]==255 and data6[i+6]==2 and data6[i+7]==0):
            index.append(i)
        elif (data6[i]==239 and data6[i+1]==1 and data6[i+2]==255 and data6[i+3]==255 and data6[i+4]==255 and data6[i+5]==255 and data6[i+6]==8 and data6[i+7]==0):
            index.append(i)
    Image_data=[]
    for i in range(len(index)):#获取包头后面128个8bit数据
        Image_data.append(data6[(index[i]+9):(index[i]+137)])
    img=[]
    img2=[]
    for i in range(len(Image_data)):
        for j in range(len(Image_data[i])):
            a=Image_data[i][j]/16*17#对数据进行清洗
            b=Image_data[i][j]%16*17
            img.append(a)
            img.append(b) 
    img2.append(img)
    cv.imwrite('C:\\Users\\86176\\Desktop\\my_image'+'\\'+'first'+str(name)+'.jpeg',img2)
    print('C:\\Users\\86176\\Desktop\\my_image'+'\\'+'first'+str(name)+'.jpeg')
    print("保存"+str(name)+"张图片")
   
if __name__ == '__main__':
    for i in range(3000):
        data=add_3000_picture()
        savepicture(data,i)#保存3000张图片

注:因为读取数据太慢,读取一张图片要10s左右,这就需要修改波特率,这里我因为校验和不知道怎么算,还在研究。后续再改。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值