【MaixPy】K210 Go 使用esp8285传输摄像头拍摄的图片

2021-03-078501
AI 快速预览详细 收起
本文介绍了如何使用K210和esp8285实现摄像头图片的无线传输。首先解决了K210上使用socket.connect连接报OSError的问题,然后通过esp8285将摄像头图片发送到PC端。帧数稳定在5-6之间,适合实时监控和图像处理项目。


最近终于解决了K210上使用socket.connect连接报OSError问题,问题解决方法可以参考:
https://mc.dfrobot.com.cn/thread-308577-1-1.html

然后兴奋的试着使用esp8285传输摄像头图片,直接上代码:
-------------------------------------------------------------------------------------------------------------------------------------------
K210端——充当客户端,不断将摄像头图片send给服务端 :

#注意将电脑的防火墙关了,不然连接不上电脑

import sensor, image, time,gc
from my_device import ESP8285
import socket

#sensor初始化
sensor.reset()
sensor.set_vflip(1)             #设置摄像头垂直翻转
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)

#连接wifi,连接方法是自己封装的一个类,这里需自己写
SSID = "wifi名称"
PASW = "wifi密码"
wifi = ESP8285()
wifi.connect_wlan(SSID,PASW)
print('network state:', wifi.isconnected(), wifi.ifconfig())

#socket建立连接
ADDR = ("PC端ip",8086)   #注意关闭PC防火墙!!!!,这里PC端ip也就是后面PC端代码中的HOST变量的值
sock = socket.socket()
sock.connect(ADDR)
clock = time.clock()

while True:
    clock.tick()
    img = sensor.snapshot()
    img = img.compress(quality=30)  #压缩图片,不然帧数小的可怜
    img_bytes = img.to_bytes()
    print("img_size: ",len(img_bytes))
    for i in range(0,len(img_bytes),1024): #1KB1KB的发送
        sock.send(img_bytes[i:i+1024])
    print("frames: ",clock.fps())
    del img,img_bytes
    gc.collect()

sock.close()
-------------------------------------------------------------------------------------------------------------------------------------------
PC端——充当服务端,接收K210发送的图片二进制数据并显示:
import socket
import cv2
import numpy as np
import threading


def show_img(img):
    image = cv2.imdecode(np.asarray(bytearray(img),dtype='uint8'), cv2.IMREAD_COLOR)
    cv2.imshow('img',image)




def sock_init():
    sock = socket.socket()
    # 获取当前主机名
    HostName = socket.gethostname()
    # 获取当前主机的ip
    HOST = socket.gethostbyname(HostName)
    Port = 8086
    # 设置监听
    sock.bind((HOST, Port))
    sock.listen(5)


    return sock


def receive_img(client):
    #连接上客户端后,读取客户端发送的二进制流图片
    client.settimeout(10)
    while True:
        try:
            img = b''
            while True:
                data =  client.recv(1024)
                img += data
                if len(data)<1024:
                    break
            print(len(img))
            try:
                show_img(img=img)
                if cv2.waitKey(1)&0xff == ord('q'):
                    break
            except:
                continue
        except socket.timeout:
            break
    print('img_end')


if __name__ == "__main__":
    sock = sock_init()
    while True:
        print("等待连接中")
        cilent,addr = sock.accept()
        print('连接地址:{}'.format(addr))
        thread_1 = threading.Thread(target=receive_img,args=(cilent,))
        thread_1.start()
        if cv2.waitKey(1)&0xff == ord('q'):
            break
    sock.close()


-------------------------------------------------------------------------------------------------------------------------------------------
实验结果:
【MaixPy】K210 Go 使用esp8285传输摄像头拍摄的图片图1【MaixPy】K210 Go 使用esp8285传输摄像头拍摄的图片图2
帧数在5-6之间,如果还是太卡,帧数太低,可以在K210选择摄像头图片格式时选择更小的或者img.compress(quality=30)选择更小的图片压缩质量
-------------------------------------------------------------------------------------------------------------------------------------------
想分享或者交流的部分:
1.我PC部分代码很拉跨,后面再改吧
2.K210部分感觉帧数还是不够,不知道如何进一步修改
3.发送图片可能还需要添加起始符和结束符增强容错性吧


SunMarch-202103076508..png (58.45 KB, 下载次数: 3934)

K210 Go 使用esp8285传输摄像头图片 | DF创客社区_image_3.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
dfgfdgsdfg
dfgfdgsdfg
from my_device import ESP8285中这个my_device未发现,你您写的吗,可以分享一下嘛
Sipeed-大佬鼠
Sipeed-大佬鼠
最好的改法就是修改固件源码的 AT 8285 socket send 的接口的延时,又或是怼到 AT ,然后波特率改到 1.5M 波特率,可以拉高。
- 没有更多了 -