1634浏览
查看: 1634|回复: 2

[项目分享] 【MaixPy】K210 Go 使用esp8285传输摄像头拍摄的图片

[复制链接]
本帖最后由 我朝女王扔石头 于 2021-3-7 16:56 编辑

最近终于解决了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()


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


SunMarch-202103076508..png

Sipeed-大佬鼠  版主

发表于 2021-3-8 14:27:50

最好的改法就是修改固件源码的 AT 8285 socket send 的接口的延时,又或是怼到 AT ,然后波特率改到 1.5M 波特率,可以拉高。
回复

使用道具 举报

dfgfdgsdfg  学徒

发表于 2022-3-31 19:29:11

from my_device import ESP8285中这个my_device未发现,你您写的吗,可以分享一下嘛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail