mirror of
https://gitcode.com/gh_mirrors/es/esp32-opencv.git
synced 2025-08-14 18:50:49 +08:00
Merge branch 'master' into shape_matching_integration
This commit is contained in:
53
esp32/doc/build_configurations.md
Normal file
53
esp32/doc/build_configurations.md
Normal file
@ -0,0 +1,53 @@
|
||||
# Build configurations
|
||||
|
||||
This doc details some build configurations possible.
|
||||
|
||||
|
||||
|
||||
Images codecs support
|
||||
----------------------------
|
||||
|
||||
To add/remove image codecs support, the following modifications are done.
|
||||
|
||||
### PNG
|
||||
|
||||
- Remove ``-DWITH_PNG=OFF`` and add ``-DBUILD_PNG=ON`` and ``-DBUILD_ZLIB=ON`` from the cmake command
|
||||
|
||||
- The lib ``opencv_imgcodecs.a`` build pass
|
||||
|
||||
The library is compiled in the ``3rdparty/`` folder. Copy this folder into the esp32 example project folder.
|
||||
|
||||
|
||||
|
||||
### JPEG
|
||||
|
||||
- Remove ``-DWITH_JPEG=OFF`` and add ``-DBUILD_JPEG=ON`` of the cmake command
|
||||
|
||||
- Problem at compilation time. Doesn't support JPEG for now (TODO).
|
||||
|
||||
|
||||
|
||||
## Additional OpenCV modules
|
||||
|
||||
In addition to the `core`, `imgproc` and `imgcodecs` modules, the following were also tested:
|
||||
|
||||
* `features2d`: The cross-compilation didn't cause issues. The following functionalities were used:
|
||||
|
||||
* AKAZE features detector/descriptor
|
||||
* Matching method
|
||||
|
||||
* `calib3d`: The cross-compilation didn't cause issues. The following functionalities were used:
|
||||
|
||||
* undistortPoints method
|
||||
* findHomography method
|
||||
* projectPoints method
|
||||
|
||||
These methods use `double` precision operations. Because the ESP32 only have a single precision Floating Point Unit (FPU), the operations are very slow. (TODO: have modified the methods to use only `float`, but must now add them to this repo).
|
||||
|
||||
|
||||
|
||||
Parallel support
|
||||
-----------------------
|
||||
|
||||
TODO
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Detailed build procedure
|
||||
|
||||
The last way explains all the commands and modifications done to be able to compile and run OpenCV on the ESP32.
|
||||
This doc details all the commands and modifications done to be able to compile and run OpenCV on the ESP32.
|
||||
|
||||
|
||||
|
||||
@ -176,61 +176,6 @@ When the compilation has ended, the libs are in the `build/lib` folder.
|
||||
|
||||
|
||||
|
||||
## Compiling esp-idf project using OpenCV:
|
||||
|
||||
When the OpenCV library is cross-compiled, we have in result `*.a` files located in `build/lib` folder. We now want to try to compile an example project using OpenCV on the esp32. A basic example of esp-idf project can be found in [esp32/examples/esp_opencv_basic](esp32/examples/esp_opencv_basic). This project simply creates an OpenCV matrix, fill it with values and prints it on the console.
|
||||
|
||||
Esp-idf environment uses cmake and is separated in components. Because OpenCV libs were compiled outside this example project, we use the pre-built library functionality of esp-idf (https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html#using-prebuilt-libraries-with-components).
|
||||
|
||||
Here are the things done to add the OpenCV library to the project:
|
||||
|
||||
* Create a folder named `opencv/` into the `main/` component's folder
|
||||
* Copy the generated libraries (`libade.a`, `libopencv_core.a`, `libopencv_imgproc.a` and `libopencv_imgcodecs.a`) into this directory
|
||||
* Create the folder `opencv2/` into this directory, and copy into it the needed headers files :
|
||||
* `cvconfig.h`
|
||||
* `opencv_modules.hpp`
|
||||
* `opencv.hpp`
|
||||
* `core.hpp`
|
||||
* `imgproc.hpp`
|
||||
* `imgcodecs.hpp`
|
||||
* `core/` folder
|
||||
* `imgproc/` folder
|
||||
* `imgcodecs/` folder
|
||||
|
||||
* Link the libraries to the project by modifying the `CMakeList.txt` of the `main` project's component is as below :
|
||||
|
||||
```cmake
|
||||
idf_component_register(
|
||||
SRC main.cpp
|
||||
INCLUDE_DIRS ./opencv
|
||||
)
|
||||
|
||||
# Be aware that the order of the librairies is important
|
||||
add_prebuilt_library(opencv_imgcodecs "opencv/libopencv_imgcodecs.a")
|
||||
add_prebuilt_library(libpng "opencv/3rdparty/liblibpng.a")
|
||||
add_prebuilt_library(libzlib "opencv/3rdparty/libzlib.a")
|
||||
add_prebuilt_library(opencv_imgproc "opencv/libopencv_imgproc.a")
|
||||
add_prebuilt_library(opencv_core "opencv/libopencv_core.a")
|
||||
add_prebuilt_library(ade "opencv/libade.a")
|
||||
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE opencv_imgcodecs)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE libpng)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE libzlib)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE opencv_imgproc)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE opencv_core)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE ade)
|
||||
```
|
||||
|
||||
* Finally, include the OpenCV headers needed into your source files:
|
||||
|
||||
```c++
|
||||
#include "opencv2/core.hpp"
|
||||
#include "opencv2/imgproc.hpp"
|
||||
#include "opencv2/imgcodecs.hpp"
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Modified files for OpenCV to compile and run:
|
||||
|
||||
To get the cmake configuration and make compilation to work, some modifications on OpenCV files had to be done. They are listed below.
|
||||
@ -418,3 +363,10 @@ When the `make` command compiles successfully, the library was tested with an ex
|
||||
* Disabling the Bluetooth (~56kB) and Trace Memory in the menuconfig
|
||||
* Disabling some OpenCV features not mandatory and taking lot of memory. To find variables taking too much space, the `build/<project-name>.map` file is useful (looking for big variables under the `.dram0.bss` section).
|
||||
* `imgproc/color_lab.cpp` has variables (trilinearLUTE, InvGammaTab and LabCbrtTab) taking ~88 kB. They are used for colorspace conversions in and from CIE LAB and XYZ images. These functions were removed.
|
||||
|
||||
* TODO: There are maybe other ways to save space in this segment:
|
||||
|
||||
* Allow .bss segment placed in external memory
|
||||
* This option of the menuconfig uses external RAM to store zero-initialized data from the lwIP, net80211, libpp and bluedroid libraries
|
||||
* Additional data can be moved from the internal BSS segment to external RAM by applying the macro `EXT_RAM_ATTR` to any static declaration (which is not initialized to a non-zero value).
|
||||
* TODO: See what needs to be included and if it's possible to use this esp macro in OpenCV
|
||||
|
@ -1,8 +1,12 @@
|
||||
set(COMPONENT_SRCS "hello_opencv.cpp")
|
||||
set(COMPONENT_ADD_INCLUDEDIRS "." "./opencv/")
|
||||
register_component()
|
||||
|
||||
# Be aware that the order of the librairies is important
|
||||
idf_component_register(
|
||||
SRCS
|
||||
hello_opencv.cpp
|
||||
|
||||
INCLUDE_DIRS
|
||||
.
|
||||
opencv/
|
||||
)
|
||||
|
||||
add_prebuilt_library(opencv_imgcodecs "opencv/libopencv_imgcodecs.a")
|
||||
add_prebuilt_library(libpng "opencv/3rdparty/liblibpng.a")
|
||||
add_prebuilt_library(libzlib "opencv/3rdparty/libzlib.a")
|
||||
@ -10,9 +14,11 @@ add_prebuilt_library(opencv_imgproc "opencv/libopencv_imgproc.a")
|
||||
add_prebuilt_library(opencv_core "opencv/libopencv_core.a")
|
||||
add_prebuilt_library(ade "opencv/libade.a")
|
||||
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE opencv_imgcodecs)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE libpng)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE libzlib)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE opencv_imgproc)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE opencv_core)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE ade)
|
||||
set(IMGCODEC_DEP libpng libzlib)
|
||||
target_link_libraries(opencv_imgcodecs INTERFACE ${IMGCODEC_DEP})
|
||||
|
||||
set(CORE_DEP libzlib)
|
||||
target_link_libraries(opencv_core INTERFACE ${CORE_DEP})
|
||||
|
||||
set(OPENCV_DEP opencv_imgcodecs opencv_imgproc opencv_core)
|
||||
target_link_libraries(${COMPONENT_LIB} ${OPENCV_DEP})
|
||||
|
@ -16,12 +16,14 @@ add_prebuilt_library(opencv_imgproc "opencv/libopencv_imgproc.a")
|
||||
add_prebuilt_library(opencv_core "opencv/libopencv_core.a")
|
||||
add_prebuilt_library(ade "opencv/libade.a")
|
||||
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE opencv_imgcodecs)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE libpng)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE libzlib)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE opencv_imgproc)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE opencv_core)
|
||||
target_link_libraries(${COMPONENT_LIB} PRIVATE ade)
|
||||
set(IMGCODEC_DEP libpng libzlib)
|
||||
target_link_libraries(opencv_imgcodecs INTERFACE ${IMGCODEC_DEP})
|
||||
|
||||
set(CORE_DEP libzlib)
|
||||
target_link_libraries(opencv_core INTERFACE ${CORE_DEP})
|
||||
|
||||
set(OPENCV_DEP opencv_imgcodecs opencv_imgproc opencv_core)
|
||||
target_link_libraries(${COMPONENT_LIB} ${OPENCV_DEP})
|
||||
|
||||
# create spiffs partition (named 'storage') from the ../spiffs_image directory
|
||||
spiffs_create_partition_image(storage ../spiffs_images FLASH_IN_PROJECT)
|
||||
|
@ -47,6 +47,7 @@ CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y
|
||||
# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
|
||||
# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
|
||||
CONFIG_BOOTLOADER_LOG_LEVEL=3
|
||||
CONFIG_BOOTLOADER_SPI_WP_PIN=7
|
||||
CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y
|
||||
# CONFIG_BOOTLOADER_FACTORY_RESET is not set
|
||||
# CONFIG_BOOTLOADER_APP_TEST is not set
|
||||
@ -71,9 +72,9 @@ CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0
|
||||
# Serial flasher config
|
||||
#
|
||||
CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200
|
||||
# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
|
||||
# CONFIG_ESPTOOLPY_FLASHMODE_DIO is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set
|
||||
CONFIG_ESPTOOLPY_FLASHMODE="dio"
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
@ -187,7 +188,7 @@ CONFIG_ADC_DISABLE_DAC=y
|
||||
#
|
||||
# SPI configuration
|
||||
#
|
||||
# CONFIG_SPI_MASTER_IN_IRAM is not set
|
||||
CONFIG_SPI_MASTER_IN_IRAM=y
|
||||
CONFIG_SPI_MASTER_ISR_IN_IRAM=y
|
||||
# CONFIG_SPI_SLAVE_IN_IRAM is not set
|
||||
CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
|
||||
@ -251,15 +252,14 @@ CONFIG_SPIRAM_SIZE=-1
|
||||
CONFIG_SPIRAM_SPEED_80M=y
|
||||
CONFIG_SPIRAM=y
|
||||
CONFIG_SPIRAM_BOOT_INIT=y
|
||||
# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set
|
||||
# CONFIG_SPIRAM_USE_MEMMAP is not set
|
||||
# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set
|
||||
CONFIG_SPIRAM_USE_MALLOC=y
|
||||
CONFIG_SPIRAM_MEMTEST=y
|
||||
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384
|
||||
# CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is not set
|
||||
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
|
||||
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768
|
||||
# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set
|
||||
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
|
||||
CONFIG_SPIRAM_CACHE_WORKAROUND=y
|
||||
CONFIG_SPIRAM_BANKSWITCH_ENABLE=y
|
||||
CONFIG_SPIRAM_BANKSWITCH_RESERVE=8
|
||||
@ -287,8 +287,6 @@ CONFIG_D2WD_PSRAM_CS_IO=10
|
||||
#
|
||||
CONFIG_PICO_PSRAM_CS_IO=10
|
||||
# end of PSRAM clock and cs IO for ESP32-PICO
|
||||
|
||||
CONFIG_SPIRAM_SPIWP_SD3_PIN=7
|
||||
# end of SPI RAM config
|
||||
|
||||
# CONFIG_ESP32_TRAX is not set
|
||||
@ -467,7 +465,7 @@ CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16
|
||||
CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
|
||||
CONFIG_ESP32_WIFI_TX_BA_WIN=6
|
||||
CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
|
||||
CONFIG_ESP32_WIFI_RX_BA_WIN=6
|
||||
CONFIG_ESP32_WIFI_RX_BA_WIN=16
|
||||
CONFIG_ESP32_WIFI_NVS_ENABLED=y
|
||||
CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y
|
||||
# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set
|
||||
@ -685,6 +683,7 @@ CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
|
||||
CONFIG_LWIP_TCP_OVERSIZE_MSS=y
|
||||
# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set
|
||||
# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set
|
||||
# CONFIG_LWIP_WND_SCALE is not set
|
||||
# end of TCP
|
||||
|
||||
#
|
||||
@ -1025,9 +1024,9 @@ CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y
|
||||
CONFIG_LOG_BOOTLOADER_LEVEL=3
|
||||
# CONFIG_APP_ROLLBACK_ENABLE is not set
|
||||
# CONFIG_FLASH_ENCRYPTION_ENABLED is not set
|
||||
# CONFIG_FLASHMODE_QIO is not set
|
||||
CONFIG_FLASHMODE_QIO=y
|
||||
# CONFIG_FLASHMODE_QOUT is not set
|
||||
CONFIG_FLASHMODE_DIO=y
|
||||
# CONFIG_FLASHMODE_DIO is not set
|
||||
# CONFIG_FLASHMODE_DOUT is not set
|
||||
# CONFIG_MONITOR_BAUD_9600B is not set
|
||||
# CONFIG_MONITOR_BAUD_57600B is not set
|
||||
@ -1061,7 +1060,7 @@ CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0
|
||||
CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0
|
||||
CONFIG_ADC2_DISABLE_DAC=y
|
||||
CONFIG_SPIRAM_SUPPORT=y
|
||||
# CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST is not set
|
||||
CONFIG_WIFI_LWIP_ALLOCATION_FROM_SPIRAM_FIRST=y
|
||||
CONFIG_TRACEMEM_RESERVE_DRAM=0x0
|
||||
# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set
|
||||
CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y
|
||||
|
@ -84,9 +84,9 @@ CONFIG_ESPTOOLPY_FLASHFREQ="80m"
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE="8MB"
|
||||
# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE="16MB"
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
|
||||
CONFIG_ESPTOOLPY_BEFORE_RESET=y
|
||||
# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set
|
||||
|
Reference in New Issue
Block a user