ESP32CAM人工智能教学14

ESP32CAM人工智能教学14

openCV上位机UDP连接

小智利用openCV在计算机中创建一个服务器,让ESP32Cam通过WiFi连接,把摄像头的视频发送到电脑中,在电脑屏幕中显示出来。

  • UDP连接

OpenCV在计算机中创建了一个虚拟服务器,并打开一个端口9090,等待ESP32Cam的连接、开通一个数据传输的通道;ESP32Cam利用UPD的形式把摄像头拍摄到的图片,源源不断地传输给计算机,这样就可以在计算机屏幕中显示摄像头的实时画面了。

UPD连接是“广播式”的传输方式,ESP32Cam只管发送图片数据,不管计算机是否接受成功,都不会停止数据的发送,因此被称为不可靠连接。和他相对的TCP连接,是“应答式”的传输方式,ESP32Cam每发送一张图片,就会询问计算机是否接收成功,计算机收到数据后,会检查数据是否完整,再返回消息,ESP32Cam接收到计算机的返回信息后,如果计算机接收成功,则发送下一张图片,如果计算机接收失败,则会重新再一次发送这一张图片,因此TCP被称为可靠的连接。

  • ESP32Cam端的程序

我们打开Thonny,新建一个Python文件,粘贴代码。需要修改程序中的WiFi密码和电脑的IP地址。

import socket
import network
import camera
import time
 
 
# 连接wifi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
    print('connecting to network...')
    wlan.connect('ChinaNet-xxVP', '123456789')
    
    while not wlan.isconnected():
        pass
print('网络配置:', wlan.ifconfig())
 
 
# 摄像头初始化
try:
    camera.init(0, format=camera.JPEG)
except Exception as e:
    camera.deinit()
    camera.init(0, format=camera.JPEG)
 
 
# 其他设置:
# 上翻下翻
camera.flip(0)
#左/右
camera.mirror(1)
 
# 分辨率
camera.framesize(camera.FRAME_QVGA)
# 选项如下:
# FRAME_96X96 FRAME_QQVGA FRAME_QCIF FRAME_HQVGA FRAME_240X240
# FRAME_QVGA FRAME_CIF FRAME_HVGA FRAME_VGA FRAME_SVGA
# FRAME_XGA FRAME_HD FRAME_SXGA FRAME_UXGA FRAME_FHD
# FRAME_P_HD FRAME_P_3MP FRAME_QXGA FRAME_QHD FRAME_WQXGA
# FRAME_P_FHD FRAME_QSXGA
# 有关详细信息,请查看此链接:https://bit.ly/2YOzizz
 
# 特效
camera.speffect(camera.EFFECT_NONE)
#选项如下:
# 效果\无(默认)效果\负效果\ BW效果\红色效果\绿色效果\蓝色效果\复古效果
# EFFECT_NONE (default) EFFECT_NEG \EFFECT_BW\ EFFECT_RED\ EFFECT_GREEN\ EFFECT_BLUE\ EFFECT_RETRO
 
# 白平衡
camera.whitebalance(camera.WB_HOME)
#选项如下:
# WB_NONE (default) WB_SUNNY WB_CLOUDY WB_OFFICE WB_HOME
 
# 饱和
camera.saturation(0)
#-2,2(默认为0). -2灰度
# -2,2 (default 0). -2 grayscale 
 
# 亮度
camera.brightness(0)
#-2,2(默认为0). 2亮度
# -2,2 (default 0). 2 brightness
 
# 对比度
camera.contrast(0)
#-2,2(默认为0).2高对比度
#-2,2 (default 0). 2 highcontrast
 
# 质量
camera.quality(10)
#10-63数字越小质量越高
 
# socket UDP 的创建
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
 
try:
    while True:
        buf = camera.capture()  # 获取图像数据
        s.sendto(buf, ("192.168.1.162", 9090))  # 向服务器发送图像数据。这个IP地址是电脑的IP地址
        time.sleep(0.1)
except:
    pass
finally:
    camera.deinit()

程序首先连接WiFi,然后不断地获取摄像头的图片数据,把图片数据到电脑的9090端口。我这带电脑的IP是192.168.1.162。

我这台电脑是win10笔记本,点击桌面右下角的WiFi图标,点击属性,然后就可以看到这台电脑此时连接路由器的IP地址了。

  • openCV的端的代码

打开Python IDLE,新建一个Python程序文件,粘贴代码。代码首先创建一个虚拟服务器,把服务器绑定到0.0.0.0:9090端口(指向本机的所有IP的9090端口)。然后不断地从这个端口接收数据,并把接收到的图片数据进行格式转换,最后在一个新建的窗口中把图片显示出来。

import socket
import cv2
import io
from PIL import Image
import numpy as np
import time 

# 创建一个UDP套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.bind(("0.0.0.0", 9090))  # 绑定到本地IP地址和端口号9090

while True:
    # print("read")   #用于打印测试消息
    data, IP = s.recvfrom(100000)    # 接收来自ESP32的数据包(最大100000字节)
    # print("read ok")
    bytes_stream = io.BytesIO(data)  # 将接收到的数据转换为字节流
    image = Image.open(bytes_stream)  # 使用PIL库打开字节流中的图像数据
    img = np.asarray(image)          # 将图像数据转换为NumPy数组
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # 将图像从RGB格式转换为BGR格式(OpenCV使用的格式)
    cv2.imshow("ESP32 Capture Image", img)  # 在窗口中显示图像
    if cv2.waitKey(1) == ord("q"):    # 等待用户按下键盘上的"q"键退出
        break    
    
print("程序已退出")

    这个程序需要安装openCV和PIL驱动库,openCV在上节课中就已经安装了,PIL的安装也差不多,从Python官方网站下载会因为网络问题,造成下载失败,可以换成到清华大学的镜像网站去下载:

./pip3.12 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow

下载完驱动库,先运行电脑端的Python程序,会在IDLE  Shell窗口中看到程序运行了。在运行Thonny中的程序(ESP32Cam中的程序),这时候,会出现一个新的窗口,显示摄像头的实时画面了。

四.  避坑笔迹

一个很不起眼的问题,整整困扰了我三天的时间。

在做这个程序的时候,始终没有成功,看不到摄像头图像的窗口,于是查了网上大量的教程,以及测试了许多相关的程序,始终没有成功。后来我在这个程序的接收数据的代码前面和后面,增加了一个打印返回信息的指令,运行程序,发现程序一直卡在接收数据这里(一直地接收不到ESP32Cam传来的数据)。但是在其他的程序中(第十二课Python视频服务),ESP32Cam能发送数据到计算机中。

因此我的判断是不是电脑的端口被禁用了,导致数据传不进来!我按照网上的教程,修改了电脑的防护墙,打开电脑的9090端口,还是失败了。

我想到了,我的电脑win10系统,之前给电脑安装了一个杀毒软件火绒安全软件,会不会是杀毒软件默认地禁用了电脑的端口呢?也不知道怎么弄,直接卸载掉,然后从启程序,结果程序就运行成功了。困扰了三天的问题,终于得到了解决。

    其实我的这套教程都配有视频的,大家可以扫描二维码,访问我的微信视频号

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tongyue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值