# esp32cam-openmv **Repository Path**: qqclient/esp32cam-openmv ## Basic Information - **Project Name**: esp32cam-openmv - **Description**: esp32cam下的OPENMV快速教程 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2022-05-02 - **Last Updated**: 2022-05-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ESP32CAM的使用 ## 基础入门 ``` import camera camera.init(0,format=2) camera.init(0,format=camera.GRAYSCALE) #默认灰度图 camera.init(0,format=3) camera.init(0,format=camera.JPEG) #JPG格式 # 相关格式 # JPEG -- 3 # YUV422 -- 1 # GRAYSCALE -- 2 # RGB565 -- 0 camera.framesize(5) #320X240 设置分辨率 img=camera.capture() import uos from machine import SDCard #FAT 格式的存储卡 uos.mount(SDCard(),'/sd') uos.listdir() uos.chdir('/sd') uos.listdir() fg=open("a.jpg","w") fg.write(img) fg.close() #thonny 使用直接右击下载文件,直接查看,本地空间,OPENMV下的esp32cam有1MB的可用空间,单纯micropython下有2MB的空间 #闪关灯 #GPIO4 为LED补光灯,若长时间使用会有严重的发热问题 from machine import Pin flash=Pin(4,Pin.OUT) flash.on() #打开闪关灯 flash.off() #关闭闪关灯 ``` ## openmv初体验 img参数直接打印为: 分辨率 文件类型 文件大小 在非jpg下 建设使用320x240 的分辨率(默认分辨率) 可用分辨率: **需要250ms (推荐分辨率 可以4FPS)** * camera.framesize(5) 5 :::: {"w":320, "h":240, "type"="grayscale", "size":76800} ::: 267 ms * camera.framesize(6) 6 :::: {"w":400, "h":296, "type"="grayscale", "size":118400} ::: 249 ms **需要750ms** * camera.framesize(7) 7 :::: {"w":480, "h":320, "type"="grayscale", "size":153600} ::: 770 ms * camera.framesize(8) 8 :::: {"w":640, "h":480, "type"="grayscale", "size":307200} ::: 722 ms * camera.framesize(9) 9 :::: {"w":800, "h":600, "type"="grayscale", "size":480000} ::: 686 ms **需要2000ms(不建议使用)** * camera.framesize(10) 10 :::: {"w":1024, "h":768, "type"="grayscale", "size":786432} ::: 2019 ms * camera.framesize(11) 11 :::: {"w":1280, "h":720, "type"="grayscale", "size":921600} ::: 1819 ms * camera.framesize(12) 12 :::: {"w":1280, "h":1024, "type"="grayscale", "size":1310720} ::: 2126 ms * camera.framesize(13) 13 :::: {"w":1600, "h":1200, "type"="grayscale", "size":1920000} ::: 1968 ms JPG模式下全分辨率可用,但是使用OPENMV建议处理分辨率为320x240 或 400x296 ### ESP32CAM 处理步骤 1. 设定相机参数 2. 拍照 3. 使用OPENMV处理 使用img(*拍摄完的对象*)进行处理 使用help(img)查看其方法 和openmv的stm32设备下,除了拍照方面不同,其他方面都差不多,文档地址: [book.openmv.cc](https://book.openmv.cc/) 大家做相应的替换 ### 二维码识别: img.find_qrcodes() 若识别到二维码,就会返回扫描的相关数据。 但是二维码需要使用灰度图片 ``` import time,camera camera.init(0,format=2) camera.init(0,format=camera.GRAYSCALE) while True: img=camera.capture() e=img.find_qrcodes() if e: print(e) time.sleep(0.5) ``` ### 画图 每个函数都需要用到的参数 color=[r,g,b],简单点用白色 [255,255,255] #### 画线 ee.draw_line((10,10,20,30),color=[255,255,255]) #线段元组 x1 y1 x2 y2 #### 画矩形 ee.draw_rectangle((24,47,20,30),color=[155,55,55])#矩形元组x y w h #### 画圆 ee.draw_circle(50,40,30,color=[255,255,255]) #x y r半斤 #### 画十字线 ee.draw_cross(80,50,size=15,color=[255,255,255]) #x y size=十字线段长度 #### 文字 ee.draw_string(70,10,"openmv esp32",color=[255,255,255]) #x y 文字信息 #### 显示模块 因为没有USB,所以不能使用OPENMV IDE,但是我们可以曲线救国(勉强能用),使用使用SSD1351 的OLED屏幕,直接接收RGB565的数据,建议使用分辨率128x128,目前draw.py里面的分辨率是128x96(因为手头上只有这个屏幕)。需要注意的是,ESP32CAM在非JPG下仅能4FPS的速度,外接屏幕只有3FPS(需要压缩图片到合适的分辨率),勉勉强强吧;俗话说:1帧能玩,2帧流畅,3帧电竞。这个还是挺能打的。 导入ssd1351.py使用。 接线 |SSD1351 |ESP32CAM| |-|-| |DIN|15| |CLK|2| |DC|15| |CS|13| |RES|12| ``` from machine import Pin,SPI from ssd1351 import Display import camera spi = SPI(2, baudrate=14500000, sck=Pin(2), mosi=Pin(14)) display = Display(spi, dc=Pin(15), cs=Pin(13), rst=Pin(12),width=128,height=128) camera.init(0,format=0) ee=camera.capture().resize(128,96)#修改大小 128X128的屏幕没买,手头上只有128x96屏幕 ee.draw_line((10,10,20,30),color=[255,255,255]) #线段元组 x1 y1 x2 y2 ee.draw_rectangle((24,47,20,30),color=[155,55,55])#矩形元组x y w h ee.draw_circle(50,40,30,color=[255,255,255]) #x y r ee.draw_cross(80,50,size=15,color=[255,255,255]) #x y 十字线段长度 ee.draw_string(70,10,"openmv esp32",color=[255,255,255]) display.draw_image_ram(ee.to_bytes(), 0, 30, 128, 96) ``` ### 寻找色块 。。。。。。。。。。 ### 寻找人脸 已更新face.py 性能过低,320x240分辨率识别人脸性能再0.1FPS,使用resize方法到128x96,基本可以达到3FPS左右 ### 寻找图形 find_rects() find_circle() 使用寻找图形,请勿使用resize(), 坑:用resize()之后再find_rects()会导致重启,另一个无此bug