ESP32-CAM上传图像数据到Python上位机

预防踩坑放在前面:目前安信可官方版的CAM模块已经停售,库存货比较贵,市面上的都是仿制的,质量良莠不齐,给开发带来了很多困扰,经过实际测试,发现山寨货主要有以下几个坑:
1、发热严重,不加散热片长时间运行几乎到了烫手的地步,加上散热片也不会好很多
2、在分辨率大于640*480后,信号变得异常的差,丢包严重,但如果用手捏着天线,数据传输又会稳定很多
第二个原因上网查原因可能是山寨CAM天线附近包了一层地,那么如何避免踩坑?
目前网上的山寨CAM主要有以下两种,位于卡槽右下角的电阻,一种是四个电阻,另一种是六个电阻,建议买四个电阻的(官方板是四个电阻),效果比六个电阻的好很多。

cam1.png

2.png

强烈建议外置天线,视频信号穿墙也不是问题,使用外置天线需要修改一个电阻,将原来的电阻拆掉,一坨锡搞过来,买个天线装上就可以了

IMG_6882.JPG

烧录接线:
一句话讲明白下载:IO0为低电平,复位后为程序下载模式,IO0为高电平,复位后为程序运行模式,所以要进入下载模式,按照这样接线
USB-TTL-------ESP32CAM
TX------------UOR
RX------------UOT
5V------------5V
GND-----------GND
GND-----------IO0
按下小小的复位按钮,就进入下载模式,可以用Arduino烧录程序
下载完成后,将IO0上的线拔掉,复位后就可以运行程序了

程序原理:
初始化ov2640,设定引脚、速率、图片像素、图像格式等参数,另外,板载的SRAM可以设定更大的像素
重点:为什么使用jpeg的图片格式?jpeg是图片的一种有损压缩格式,我们使用网络传输可以节省很多带宽,提升帧率,举个例子,一张320*240像素的图像原始大小为15.36KB,压缩后可能只有2KB。而且OV2640可以直接输出jpeg格式的图片,不用处理器压缩占用时间

我们使用arduino上封装好的库,可以直接获取图片数组,因为ESP32 UDP每个包最大只有1460字节,因此还需要分包发送,我将图片分为1400个字节+1字节的索引,索引代表这个图片的第几个包,如果为0XFF代表这长图片传输完成了,分包代码如下:

    uint8_t *P_temp = fb->buf;                            //暂存指针初始位置
    int pic_length = fb->len;                             //获取图片字节数量
    int pic_pack_quantity = pic_length / max_packet_byte; //将图片分包时可以分几个整包
    int remine_byte = pic_length % max_packet_byte;       //余值,即最后一个包的大小
    for (int j = 0; j < pic_pack_quantity; j++) //发送图片信息,这是按分包循环发送,每一次循环发送一个包
    {
        sendImgAray(fb->buf, max_packet_byte,j); //将图片分包发送
        fb->buf+=max_packet_byte; //图片内存指针移动到相应位置
    }
    sendImgAray(fb->buf, remine_byte,0xFF); //发送最后一个包,剩余的数据


python上位机:
python上位机用UDP协议,修改为当前机器的IP地址和端口号,接受数据后通过判断数据最后一位确定图片是否传输完成,将接收到的数组转换成opencv的img图像,图像就显示出来了,可以通过w、s按钮调整灯光亮度。如果没有图像数据,整个界面是卡死的状态。

代码开源地址:https://github.com/tsk15535904190/esp32cam2PC