【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)
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()
-------------------------------------------------------------------------------------------------------------------------------------------
实验结果:
帧数在5-6之间,如果还是太卡,帧数太低,可以在K210选择摄像头图片格式时选择更小的或者img.compress(quality=30)选择更小的图片压缩质量
-------------------------------------------------------------------------------------------------------------------------------------------
想分享或者交流的部分:
1.我PC部分代码很拉跨,后面再改吧
2.K210部分感觉帧数还是不够,不知道如何进一步修改
3.发送图片可能还需要添加起始符和结束符增强容错性吧
最好的改法就是修改固件源码的 AT 8285 socket send 的接口的延时,又或是怼到 AT ,然后波特率改到 1.5M 波特率,可以拉高。 from my_device import ESP8285中这个my_device未发现,你您写的吗,可以分享一下嘛
页:
[1]