代码编织梦想

TCP协议传输图像、USB摄像头尝试、ov5640和0v7670摄像头驱动、ESP官方库函数将图像压缩成jpeg

ESP32-S3的DevKitC-1开发板的USB OTG功能,需要把开发板底下的USB-OTG触点短接!

短接后,终于把USB通讯问题解决了!

UVC问题论坛

Is there any example to capture a image from USB camera (AEGHB-15) · Issue #230 · espressif/esp-iot-solution · GitHub

        但是UVC没法支持更高30万像素分辨率的摄像头,故暂时放弃USB摄像头这个选项,各位大佬有什么办法希望指教下。

        购入了OV5640摄像头,原始驱动该摄像头去获取图像,为此,我花了几天踩着坑,学习了ESP-IDF,因为Arduino的Camera库总有莫名其妙的错误,而且配置范围受限。

先使用了实验室的OV7670摄像头成功!下图:

但是OV7670官方库不支持直接获取JPEG格式图像,网络传输用RGB格式不现实,数据量太大,ESP32-S3 N8R2的PSRAM不满足传高清的图像。

所以我要RGB转JPEG压缩一下。但是ESP官方库仅仅支持OV7670最大分辨率640X480,所以放弃,但是成功驱动也是很令人开心的。

JPEG压缩代码:

size_t  _jpg_len;
uint8_t *_jpg_buf;

//转化JPEG
uint8_t temp = frame2jpg(pic, 90, &_jpg_buf, &_jpg_len);

printf("trunfrom :%d\n",temp);

//socket发送
ESP_ERROR_CHECK(sock_tcp_send(sock, _jpg_buf, maxcache));

        购入的OV5640到了,换了引脚后,也是成功驱动但是都有和上面一样的问题,偶尔会有花屏现象,有时候很严重,可能是杜邦线连接干扰大的原因,后面上PCB!

        OV5640图像:

 

        发现一个问题,就是S3在将芯片时钟频率从160Mhz配置240Mhz的时候,WIFI的sockt_connect不工作堵塞住了,降回160Mhz就可以,找时间去github上讨论下。

        发现一个问题,S3驱动OV5640在拍摄到大概16次或者多次的时候,会有报错

尝试调参数,看看是什么问题。。。。。。。。。

20分钟后.......

滴滴,解决了,发现pic = esp_camera_fb_get()给的pic->buf不能对其本身+和-,需要使用一个变量进行缓存位置计数,例如:

pic = esp_camera_fb_get();

// 将图片数据分段发
size_t leng = pic->len;
// 清空缓存计数
cambuf_count = 0;
// 计算要分发几个数据包
int timess = leng/maxcache;
// 剩余图像数据
int extra = leng%maxcache;


for(int i = 0;i < timess;i++){
    //tcp分包发送图像
    ESP_ERROR_CHECK(sock_tcp_send(sock, pic->buf+cambuf_count, maxcache));
    
    //计数跟上
    cambuf_count+=maxcache;

    printf("send tcp> %d\n", i);

}


if(extra > 0){
    //剩余的图像数据
    ESP_ERROR_CHECK(sock_tcp_send(sock, pic->buf+cambuf_count, extra));
}

//将指针返还
esp_camera_fb_return(pic);

用cambuf_count对buf读取到哪里的位置计数,下次读取就在buf基础上加cambuf_count就可以。呼.......结束加班,洗澡去😄

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/DJH193796/article/details/129832733

缓存穿透、缓存击穿、缓存雪崩区别和解决方案_每天进步一点点yes的博客-爱代码爱编程_缓存击穿

一、缓存处理流程       前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。          二、缓存穿透        描述:        缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在

nginx缓存以及清除缓存-爱代码爱编程

缓存 缓存的基本思想是利用客户端访问的时间局限性,将客户端访问过的内容做一个副本,在一定时间内存放到本地,当改数据下次被访问时,不必连接到后端服务器反复去查询数据,而是由本地保存的副本响应数据。 保存在本地的这些副本具有一个过期时间,超过该时间将会更新。判断一个副本数据是否为过期数据的办法有很多,可以使用保留时间来判断,也可以使用数据完整度来判

23 Redis 的旁路缓存-爱代码爱编程

23 Redis 的旁路缓存 前言一、缓存的特征二、Redis 缓存处理请求的两种情况三、Redis 作为旁路缓存的使用操作四、缓存的类型总结 前言 Redis 提供了高性能的数据存取功能,广泛应用在缓存场景中,既能有效地提升业务应用的响应速度,还可以避免把高并发大压力的请求发送到数据库层。但如果 Redis 做缓存时出现了问题,比如缓存失效

分布式数据:缓存技术-爱代码爱编程

分布式数据:缓存技术 前言什么是分布式缓存?Redis 分布缓存原理Memcached 分布式缓存原理对比分析知识扩展:除了分布式存储中的缓存,还有计算机体系结构和网络中的缓存, 它们又分别是什么呢?总结 前言 分布式存储中“货架”的关键技术——缓存技术。 在计算机领域的各个方面,缓存都非常重要,是提升访问性能的一个重要技术。 从单个计算机

Spring框架源码之三级缓存与循环依赖-爱代码爱编程

1.循环依赖 首先我们需要明白什么是循环依赖 , 打个比方 , 就是说A对象在创建的过程中 , 需要依赖注入B对象 , 但是B对象没有 , 就需要去创建 , 而在创建B对象的过程中又需要注入A对象 , A对象此时还在创建中,所以就构成了一个死循环 , A,B相互依赖 这样的关系被成为循环依赖(当然 , 可能还会有其他的情况),下面我们就来看看Spring

强缓存和协商缓存_无知小九的博客-爱代码爱编程

(1)强缓存 使用强缓存策略时,如果缓存资源有效,则直接使用缓存资源,不必再向服务器发起请求。 强缓存策略可以通过 http 头信息中的 Expires 属性和 Cache-Control 属性两种方式设置 命中后返回

缓存穿透,缓存雪崩,缓存击穿的超详解-爱代码爱编程

文章目录 1、缓存穿透问题的解决思路2、缓存雪崩问题及解决思路3、缓存击穿问题及解决思路 1、缓存穿透问题的解决思路 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远

nginx 缓存使用详解-爱代码爱编程

前言 缓存的使用在各种项目中非常普遍,nginx作为一款高效的代理服务器,也提供了强大的缓存机制,试想在一些电商网站中,那些静态的html,js,css文件登数量非常庞大的情况下,加载页面的时候,如果没有缓存的话,页面将会