Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ For a fresh start

### Important note: since stm32u5g9j_dk2 doesn't have camera sensor, you need to find out your own way how to transfer images to the board; I used uart for that purpose

### Apply stm32hal.patch, in case -O2 (CONFIG_SPEED_OPTIMIZATIONS=y) is used
* `modules/hal/stm32/`
* `git apply ../../../stm32hal.patch`

## To enable OpenCV library and example code
* in `u5/app/prj.conf` : CONFIG_OPENCV_LIB=y

Expand Down
1 change: 1 addition & 0 deletions host/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build
36 changes: 36 additions & 0 deletions host/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
cmake_minimum_required(VERSION 3.10)
project(host_app)

# Find OpenCV4
find_package(OpenCV 4 REQUIRED)

set(OPENCV_HAAR_PATH "/usr/share/opencv4/")
#set(OPENCV_HAAR_PATH "${CMAKE_SOURCE_DIR}/Haar")

set(HAAR_HEADER "${CMAKE_BINARY_DIR}/Include/HaarPath.hpp")
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/Include")

configure_file(
${CMAKE_SOURCE_DIR}/HaarPath.hpp.in
${HAAR_HEADER}
@ONLY
)

set(OPENCV_UTILS_DIR_PATH "../u5/common/opencv")

set(HOST_APP_SRCS
Src/main.cpp
${OPENCV_UTILS_DIR_PATH}/src/opencv_utils.cpp
${OPENCV_UTILS_DIR_PATH}/include/gf/opencv_utils.hpp
)

# Add executable
add_executable(host_app ${HOST_APP_SRCS})

# Link OpenCV libraries
target_include_directories(host_app
PRIVATE "${CMAKE_BINARY_DIR}/Include"
PRIVATE ${OpenCV_INCLUDE_DIRS}
PRIVATE ${OPENCV_UTILS_DIR_PATH}/include)

target_link_libraries(host_app PRIVATE ${OpenCV_LIBS})
3 changes: 3 additions & 0 deletions host/HaarPath.hpp.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#pragma once

constexpr const char* HAAR_PATH = "@OPENCV_HAAR_PATH@";
148 changes: 148 additions & 0 deletions host/Src/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
#include <opencv2/opencv.hpp>
#include <iostream>

#include "HaarPath.hpp"

#include "gf/opencv_utils.hpp"

cv::String haarPath = HAAR_PATH;
cv::String face_cascade_name = haarPath + "lbpcascades/lbpcascade_frontalface_improved.xml";
cv::String smile_cascade_name = haarPath + "haarcascades/haarcascade_smile.xml";
cv::CascadeClassifier face_cascade;
cv::CascadeClassifier smile_cascade;
cv::String window_name = "Capture - Face detection";
cv::String window_name_2 = "Capture - Smile detection";


bool checkFrameSizeSupported(cv::Mat &gray) {
if (gray.cols == 640 && gray.rows == 480) {
return true;
}

if (gray.cols == 320 && gray.rows == 240) {
return true;
}
return false;
}

int main(int, char**) {
// open the first webcam plugged in the computer
cv::VideoCapture camera(0); // in linux check $ ls /dev/video0
if (!camera.isOpened()) {
std::cerr << "ERROR: Could not open camera" << std::endl;
return 1;
}

// array to hold image
cv::Mat frameOriginal;
cv::Mat frameScreenGray;

if (!face_cascade.load(face_cascade_name))
{
printf("--(!)Error loading face cascade\n");
return -1;
};
if (!smile_cascade.load(smile_cascade_name))
{
printf("--(!)Error loading eyes cascade\n");
return -1;
};

cv::namedWindow(window_name, 2);
// display the frame until you press a key

std::cout << "Start capturing" << std::endl;
float gamma = 0.1;
std::map<float, uint32_t> gammaScore;
while (camera.read(frameOriginal)) {

if (frameOriginal.empty())
{
printf(" --(!) No captured frame -- Break!");
break;
}

cv::Mat frameOriginalGray;
cv::cvtColor(frameOriginal, frameOriginalGray, cv::COLOR_BGR2GRAY);
//cv::equalizeHist(frameOriginalGray, frameOriginalGray);

if (false == checkFrameSizeSupported(frameOriginalGray)) {
std::cerr << "Not supported frame size" << std::endl;
exit(-1);
}

cv::Mat frameCroppedGray;

if (frameOriginalGray.cols == 640 && frameOriginalGray.rows == 480) {
cv::Rect crop;
crop.width = 320;
crop.height = 240;
crop.x = (frameOriginalGray.cols - crop.width) / 2;
crop.y = (frameOriginalGray.rows - crop.height) / 2;
frameCroppedGray = frameOriginalGray(crop);
} else {
frameCroppedGray = frameOriginalGray;
}

cv::Rect faceROIMax{};
faceROIMax.width = 64;
faceROIMax.height = 64;

cv::resize(frameCroppedGray, frameScreenGray, cv::Size(80, 80), 0.0f, 0.0f, cv::INTER_NEAREST );

std::vector<cv::Rect> faces, smiles;

cv::Mat smilePostProc = detectFaceAndSmile(
face_cascade,
smile_cascade,
frameScreenGray,
frameCroppedGray,
faceROIMax,
faces,
smiles,
gamma
);

if (!faces.empty() && !smiles.empty()) {
if (gammaScore.count(gamma)) {
gammaScore[gamma] = gammaScore[gamma] + 1;
} else {
gammaScore[gamma] = 1;
}
}

if (!faces.empty() && smiles.empty()) {
gamma += 0.1;
if (gamma >= 1.0) {
gamma = 0.1;
}
}

for (const auto &ROI : faces) {
rectangle(frameScreenGray, ROI, cv::Scalar(0, 0, 255), 1, 1, 0);
}
for (const auto &ROI : smiles) {
rectangle(frameScreenGray, ROI, cv::Scalar(0, 0, 255), 1, 1, 0);
}

if (smilePostProc.cols && smilePostProc.rows) {
cv::imshow(window_name_2, smilePostProc);
}
cv::imshow(window_name, frameScreenGray);

int c = cv::waitKey(100);
if ((char)c == 27) { break; }
}

for (auto & [gamma, score] : gammaScore) {
std::cout << "gamma = " << gamma << ", score = " << score << std::endl;
}

return 0;
}

// CMD to generate executable:
// g++ webcam_opencv.cpp -o webcam_demo -I/usr/include/opencv4 -lopencv_core -lopencv_videoio -lopencv_highgui

// Note: check your opencv hpp files - for many users it is at /usr/local/include/opencv4
// Add more packages during compilation from the list obtained by $ pkg-config --cflags --libs opencv4
20 changes: 20 additions & 0 deletions stm32hal.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
diff --git a/stm32cube/stm32u5xx/drivers/src/stm32u5xx_hal_dma_ex.c b/stm32cube/stm32u5xx/drivers/src/stm32u5xx_hal_dma_ex.c
index d60eca23..708ff379 100644
--- a/stm32cube/stm32u5xx/drivers/src/stm32u5xx_hal_dma_ex.c
+++ b/stm32cube/stm32u5xx/drivers/src/stm32u5xx_hal_dma_ex.c
@@ -516,6 +516,9 @@
/* Includes ----------------------------------------------------------------------------------------------------------*/
#include "stm32u5xx_hal.h"

+#pragma GCC push_options
+#pragma GCC optimize ("O0")
+
/** @addtogroup STM32U5xx_HAL_Driver
* @{
*/
@@ -4717,3 +4720,5 @@ static void DMA_List_CleanQueue(DMA_QListTypeDef *const pQList)
/**
* @}
*/
+
+#pragma GCC pop_options
2 changes: 2 additions & 0 deletions u5/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@ zephyr_include_directories(include)

add_subdirectory(drivers)
add_subdirectory(lib)
add_subdirectory(common)

10 changes: 9 additions & 1 deletion u5/app/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

cmake_minimum_required(VERSION 3.13.1)

message(FATAL_ERROR This application is deprecated, please use uvc_gf_dk1 / gf_dkx / ...)

set(EXTRA_CONF_FILE
${CMAKE_CURRENT_SOURCE_DIR}/lvgl.conf;
)
Expand Down Expand Up @@ -36,6 +38,12 @@ target_sources(app PRIVATE
src/video.cpp
)

if (CONFIG_BOARD_GRINREFLEX_DK1 OR CONFIG_BOARD_GRINREFLEX_DK2)
target_sources(app PRIVATE
src/grinreflex_utils.cpp
)
endif()

if (CONFIG_BOARD_GRINREFLEX_DK1)
target_sources(app PRIVATE
src/sample_usbd_init.c
Expand All @@ -49,4 +57,4 @@ if (CONFIG_BOARD_GRINREFLEX_DK2)
target_sources(app PRIVATE
src/grinreflex_v2.cpp
)
endif()
endif()
29 changes: 0 additions & 29 deletions u5/app/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -17,32 +17,3 @@ source "subsys/logging/Kconfig.template.log_config"
source "Kconfig.zephyr"
rsource "Kconfig.sample_usbd"
rsource "Kconfig.sample_msc"

menu "GrinReflex dk1 settings"

config GRINREFLEX_JPEG_VIDEO
bool "Enable jpeg video input"
default y
depends on BOARD_GRINREFLEX_DK1 || BOARD_GRINREFLEX_DK2

config GRINREFLEX_JPEG_VIDEO_QUALITY
int "Set jpeg quality, lower value - higher quality"
default 63
depends on BOARD_GRINREFLEX_DK1 || BOARD_GRINREFLEX_DK2

config GRINREFLEX_VIDEO_WIDTH
int "Width of a video frame"
default 160

config GRINREFLEX_VIDEO_HEIGHT
int "Height of a video frame"
default 120

if GRINREFLEX_JPEG_VIDEO
config LV_COLOR_16_SWAP
bool
default y
endif


endmenu
38 changes: 0 additions & 38 deletions u5/app/Kconfig.sample_msc

This file was deleted.

54 changes: 0 additions & 54 deletions u5/app/Kconfig.sample_usbd

This file was deleted.

Loading