opencv在esp32及esp32s3上面的移植
- Opencv简介
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上,它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
这就使我们在esp32上实现OpenCV,进行图像处理以及计算机视觉成为了现实。
2、Esp32s3简介
ESP32-S3 和 ESP32 一样是一款同时支持WIFI和蓝牙功能,可以说是专为物联网而生的一款Soc,应用领域贯穿移动设备、可穿戴电子设备、智能家居等,在2,4GHz频带支持20MHz和40MHz频宽,和以往 ESP32 不一样的是,蓝牙除了支持BLE以外,目前支持 Bluetooth 5 和 Bluetooth mesh,更多的GPIO口使其能控制的外设达到更多,全速USB OTG支持直接通过USB协议与芯片进行通信。
最主要的是esp32s3具有双核的cpu。在图像处理方面有着先天的优势。
Core0通常使用作为wifi数据传输的处理。Core1进行视觉处理进程的运行。
3、移植硬件电路设计
为实现esp32s3的视频处理的内存需求,我们选用内置8M flash,外扩8M spram的模组;摄像头采用了ov2640作为输入;另外,为了调试方便,采用了240*240的LCD屏作为显示终端,可以实时看见图像处理结果。
以下是原理图:
整体系统效果如下:
反面的摄像头以及补光灯:
此开发板可以在某宝上面搜索esp32s3 opencv。
4、Demo软件效果
一、Opencv中的目标拾取代码。通常,我们在图像处理的时候,需要对采集照片进行灰度处理,然后,对照片进行二值化处理。进而进行目标拾取。
使用的函数为:
Mat inputImage(fb->height, fb->width, CV_8UC2, fb->buf); // rgb565 is 2 channels of 8-bit unsigned
cvtColor(inputImage, inputImage, COLOR_BGR5652GRAY);
threshold(inputImage, inputImage, 128, 255, THRESH_BINARY);
轻松就会得到目标物体,效果如下:
开发板中提供demo的源代码,可以使用esp-idf进行编译运行。
二、如果进行颜色拾取的话,可以使用以下函数
if (s->pixformat == PIXFORMAT_JPEG)
{
TFT_jpg_image(CENTER, CENTER, 0, -1, NULL, fb->buf, fb->len);
esp_camera_fb_return(fb);
fb = NULL;
}
else
{
Mat inputImage(fb->height, fb->width, CV_8UC2, fb->buf); cvtColor(inputImage, inputImage, COLOR_BGR5652BGR);
int pos_x = fb->width / 2;
int pos_y = fb->height / 2;
int blue = inputImage.at<Vec3b>(pos_x, pos_y)[0]; // getting the pixel values//
int green = inputImage.at<Vec3b>(pos_x, pos_y)[1]; // getting the pixel values//
int red = inputImage.at<Vec3b>(pos_x, pos_y)[2]; // getting the pixel values//
updateColorCode(red, green, blue);
std::vector<Mat> bgr_planes;
split(inputImage, bgr_planes);
float range[] = {0, 240};
const float *histRange = {range};
bool uniform = true;
bool accumulate = false;
Mat b_hist, g_hist, r_hist;
calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize,
&histRange, uniform, accumulate);
calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize,
&histRange, uniform, accumulate);
calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize,
&histRange, uniform, accumulate);
drawHistogram(b_hist, g_hist, r_hist, inputImage);
drawCenterMark(inputImage);
updateCameraImage(inputImage);
}
esp_camera_fb_return(fb);
5、结语
在视觉处理OpenCV有着开源的优势,小而精悍;esp32s3具有双核的CPU可以使用wifi进行通讯。这样就可以无线的方式传输图像处理结果。