From 1c99955ffd682c6e4d74055a1d9349e1118daab3 Mon Sep 17 00:00:00 2001 From: hmllr Date: Fri, 17 Feb 2023 16:45:22 +0100 Subject: [PATCH] Updates face detection to sdk 4.8.0.2 - changes to CPX messages for streaming - adds configurable streaming resolution - adds missing viewer script - removes read input from file, this was broken (can be resurrected by fetching the depreciated frame streamer code from the sdk, but is not worth it) - there are remaining issues: camera acquisition fails more often when a) wifi is enabled and not yet conncted b) the cluster frequency is high (75MHz seems pretty stable, 100MHz is still ok) c) the image is very dark (no clue why, but can almost be used for obstacle detection...) - camera test is also working with 4.8.0.2 (only ASYNC capture though) --- docs/images/face_detection.png | Bin 0 -> 100911 bytes docs/img-proc-examples/face-detection.md | 43 ++- docs/test-functions/test-camera.md | 4 +- .../FaceDetection/FaceDetModel.c | 2 +- .../image_processing/FaceDetection/Makefile | 15 +- .../image_processing/FaceDetection/main.c | 353 ++++++++++++------ .../FaceDetection/opencv-viewer.py | 129 +++++++ .../image_processing/FaceDetection/wifi.h | 18 + .../test_functionalities/test_camera/test.c | 2 +- .../wifi-img-streamer/wifi-img-streamer.c | 9 +- 10 files changed, 446 insertions(+), 129 deletions(-) create mode 100644 docs/images/face_detection.png create mode 100644 examples/image_processing/FaceDetection/opencv-viewer.py create mode 100644 examples/image_processing/FaceDetection/wifi.h diff --git a/docs/images/face_detection.png b/docs/images/face_detection.png new file mode 100644 index 0000000000000000000000000000000000000000..fd3c4fe8aae68d50e9ab4c366a3920024680ee55 GIT binary patch literal 100911 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/img-proc-examples/face-detection.md b/docs/img-proc-examples/face-detection.md index d892163d..e618fda9 100644 --- a/docs/img-proc-examples/face-detection.md +++ b/docs/img-proc-examples/face-detection.md @@ -5,9 +5,41 @@ page_id: face-detection This is the face detection application based on the example as developed by Greenwaves technologies. It is a bit more tailor made towards the AI-deck and uses the wifi streamer to stream the output to your computer. -This was tested on **GAP_SDK version 3.8.1**. Make sure that next to `make SDK`, you also do `make gap_tools`. +This was tested on **GAP_SDK version 4.8.0.2**, which at the moment of writing was the newest we had a docker container for. -> Working directory: AIdeck_examples/GAP8/image_processing_examples/FaceDetection +# Docker GAP-SDK + +Make sure to follow the [getting started with the AI deck tutorial](https://www.bitcraze.io/documentation/tutorials/getting-started-with-aideck/) before continuing. + +To clean, compile and flash the FaceDetection example you have to be in the aideck-gap8-examples directory and execute: + + docker run --rm -v ${PWD}:/module --privileged aideck-with-autotiler tools/build/make-example examples/image_processing/FaceDetection clean all flash + +(if you did not modify the Makefile it should be possible to skip the _clean_). + +If you configured your Crazyflie firmware such that the AIdeck will act as access point (as described in the [wifi-streamer example](/docs/test-functions/wifi-streamer.md)) you can now just connect to it. If you configured it to connect to an existing network you should make sure your computer is in the same network and you need to check the IP address of the AIdeck - for example connect to it through the cfclient and check the console prints. + +Now you can run the image viewer: + + python3 opencv-viewer.py -n "AI_DECK_IP" + +where "AI_DECK_IP" should be replaced with for example 192.168.4.1 (which is the default value and the value used if the AIdeck acts as access point, so in this case it can be omitted). + +Now you should see something like this: + +![image streamer](/docs/images/face_detection.png) + +Note that the face detection does not work great under all conditions - try with a white background and dark hair... + +In the makefile you can comment the following line if you would like to disable the streamer: + + APP_CFLAGS += -DUSE_STREAMER + +Or - what is way more fun to play with - you can set the resolution of the streamed image with _STREAM\_W_ and _STREAM\_H_. Note that you cannot set values higher than 324x244 and that unproportional changes will result in distorted images. Note also that you need to adapt the resolution in the _opencv-viewer.py_ as well. + +# Local GAP-SDK installation + +> Working directory: aideck-gap8-examples/examples/image_processing/FaceDetection To make the face detection application @@ -24,9 +56,8 @@ To flash the code fully on the ai deck: make flash -In the makefile you can uncomment the following lines if you would like to use the himax camera or the streamer: +In the makefile you can comment the following line if you would like to disable the streamer: - # APP_CFLAGS += -DUSE_CAMERA - # APP_CFLAGS += -DUSE_STREAMER + APP_CFLAGS += -DUSE_STREAMER -After that, you can also use `viewer.py` to see the image stream. The rectangle generated around your face is implemented by the firmware. +After that, you can also use `opencv-viewer.py` to see the image stream. The rectangle generated around your face is implemented by the firmware. diff --git a/docs/test-functions/test-camera.md b/docs/test-functions/test-camera.md index fc8498b0..1674864e 100644 --- a/docs/test-functions/test-camera.md +++ b/docs/test-functions/test-camera.md @@ -6,7 +6,7 @@ page_id: test-camera # Testing the Himax camera on the AIdeck -This concerns the example in folder *AIdeck_examples/GAP8/test_functionalities/test_camera/*. This was tested on **GAP_SDK version 3.8.1**. +This concerns the example in folder *AIdeck_examples/GAP8/test_functionalities/test_camera/*. This was tested on **GAP_SDK version 4.8.0.2**, which at the moment of writing was the newest we had a docker container for. In the makefile enable `APP_CFLAGS += -DASYNC_CAPTURE` if you want to test the asynchronous camera capture and remove it if you want to test the normal one. To save a color image enable `APP_CFLAGS += -DCOLOR_IMAGE`. And, to capture a `324x324` image enable `APP_CFLAGS += -DQVGA_MODE`. *Please note though that capturing an image in non-QVGA mode might not always work correctly.* @@ -19,5 +19,5 @@ for directly running the code from L2 (second level internal memory) with your p ## Run in Docker To build and execute in the docker we need to place the `demosaicking`-files in the `common`-folder inside the docker. ``` -docker run --rm -it -v $PWD:/module/data/ --device /dev/ttyUSB0 --privileged -P gapsdk:3.7 /bin/bash -c 'export GAPY_OPENOCD_CABLE=interface/ftdi/olimex-arm-usb-tiny-h.cfg; source /gap_sdk/configs/ai_deck.sh; cd /module/data/; make clean all run' +docker run --rm -it -v $PWD:/module/data/ --device /dev/ttyUSB0 --privileged -P bitcraze/aideck:4.8.0.2 /bin/bash -c 'export GAPY_OPENOCD_CABLE=interface/ftdi/olimex-arm-usb-tiny-h.cfg; source /gap_sdk/configs/ai_deck.sh; cd /module/data/; make clean all run' ``` \ No newline at end of file diff --git a/examples/image_processing/FaceDetection/FaceDetModel.c b/examples/image_processing/FaceDetection/FaceDetModel.c index aee680ab..1fe6cc48 100644 --- a/examples/image_processing/FaceDetection/FaceDetModel.c +++ b/examples/image_processing/FaceDetection/FaceDetModel.c @@ -74,7 +74,7 @@ int main(int argc, char **argv) GenerateCascadeClassifier("Cascade_3",Wout,Hout,24,24); - GenerateResize("final_resize", W, H, 160, 120); + GenerateResize("final_resize", W, H, STREAM_W, STREAM_H); // Now that we are done with model parsing we generate the code GenerateTilingCode(); diff --git a/examples/image_processing/FaceDetection/Makefile b/examples/image_processing/FaceDetection/Makefile index aa3fa19c..47868d9d 100644 --- a/examples/image_processing/FaceDetection/Makefile +++ b/examples/image_processing/FaceDetection/Makefile @@ -18,6 +18,9 @@ APP = face_detection NB_FRAMES ?= -1 +STREAM_W = 160 +STREAM_H = 120 + FACE_DET_MODEL_SRC = FaceDetGenerator.c FaceDetModel.c FACE_DET_MODEL_GEN = FaceDetKernels FACE_DET_MODEL_GEN_C = $(addsuffix .c, $(FACE_DET_MODEL_GEN)) @@ -25,18 +28,22 @@ FACE_DET_MODEL_GEN_CLEAN = $(FACE_DET_MODEL_GEN_C) $(addsuffix .h, $(FACE_DET_MO FACE_DET_SRCS += main.c faceDet.c FaceDetBasicKernels.c ImageDraw.c $(FACE_DET_MODEL_GEN_C) APP_SRCS += $(FACE_DET_SRCS) +APP_SRCS += ../../../lib/cpx/src/com.c ../../../lib/cpx/src/cpx.c APP_INC += $(TILER_INC) APP_CFLAGS += -O3 -g -D__PMSIS__ -DNB_FRAMES=$(NB_FRAMES) -# APP_CFLAGS += -DUSE_CAMERA -# APP_CFLAGS += -DUSE_STREAMER +APP_CFLAGS += -DUSE_STREAMER +APP_CFLAGS += -DSTREAM_W=$(STREAM_W) +APP_CFLAGS += -DSTREAM_H=$(STREAM_H) +APP_INC += ../../../lib/cpx/inc +APP_CFLAGS += -DconfigUSE_TIMERS=1 -DINCLUDE_xTimerPendFunctionCall=1 BOARD_NAME ?= ai_deck -PMSIS_OS ?= pulp_os USE_PMSIS_BSP = 1 -APP_LDFLAGS += -lgaptools -lgaplib export GAP_USE_OPENOCD=1 io=host +# io=uart +PMSIS_OS = freertos # This needs to be defined or else some other IO functionalities or cluster things will break... APP_CFLAGS += -DHIMAX diff --git a/examples/image_processing/FaceDetection/main.c b/examples/image_processing/FaceDetection/main.c index 627c964d..88d3ac27 100644 --- a/examples/image_processing/FaceDetection/main.c +++ b/examples/image_processing/FaceDetection/main.c @@ -22,15 +22,17 @@ #include "bsp/buffer.h" /* PMSIS BSP includes */ +#include "bsp/bsp.h" +#include "bsp/buffer.h" #include "bsp/ai_deck.h" #include "bsp/camera/himax.h" /* Gaplib includes */ -#include "gaplib/ImgIO.h" +// #include "gaplib/ImgIO.h" #if defined(USE_STREAMER) -#include "bsp/transport/nina_w10.h" -#include "tools/frame_streamer.h" +#include "cpx.h" +#include "wifi.h" #endif /* USE_STREAMER */ // All includes for facedetector application @@ -41,10 +43,135 @@ #define CAM_WIDTH 324 #define CAM_HEIGHT 244 +#define IMG_ORIENTATION 0x0101 #define IMAGE_OUT_WIDTH 64 #define IMAGE_OUT_HEIGHT 48 +static EventGroupHandle_t evGroup; +#define CAPTURE_DONE_BIT (1 << 0) + +// Performance menasuring variables +static uint32_t start = 0; +static uint32_t captureTime = 0; +static uint32_t transferTime = 0; +static uint32_t encodingTime = 0; +// #define OUTPUT_PROFILING_DATA + +static int wifiConnected = 0; +static int wifiClientConnected = 0; + +static pi_task_t task1; + +static CPXPacket_t rxp; +void rx_task(void *parameters) +{ + while (1) + { + cpxReceivePacketBlocking(CPX_F_WIFI_CTRL, &rxp); + + WiFiCTRLPacket_t * wifiCtrl = (WiFiCTRLPacket_t*) rxp.data; + + switch (wifiCtrl->cmd) + { + case WIFI_CTRL_STATUS_WIFI_CONNECTED: + cpxPrintToConsole(LOG_TO_CRTP, "Wifi connected (%u.%u.%u.%u)\n", + wifiCtrl->data[0], wifiCtrl->data[1], + wifiCtrl->data[2], wifiCtrl->data[3]); + wifiConnected = 1; + break; + case WIFI_CTRL_STATUS_CLIENT_CONNECTED: + cpxPrintToConsole(LOG_TO_CRTP, "Wifi client connection status: %u\n", wifiCtrl->data[0]); + wifiClientConnected = wifiCtrl->data[0]; + break; + default: + break; + } + } +} + +static void capture_done_cb(void *arg) +{ + xEventGroupSetBits(evGroup, CAPTURE_DONE_BIT); +} + +typedef struct +{ + uint8_t magic; + uint16_t width; + uint16_t height; + uint8_t depth; + uint8_t type; + uint32_t size; +} __attribute__((packed)) img_header_t; + + +typedef enum +{ + RAW_ENCODING = 0, + JPEG_ENCODING = 1 +} __attribute__((packed)) StreamerMode_t; + +pi_buffer_t header; +uint32_t headerSize; +pi_buffer_t footer; +uint32_t footerSize; +pi_buffer_t jpeg_data; +uint32_t jpegSize; + +static StreamerMode_t streamerMode = RAW_ENCODING; + +static CPXPacket_t txp; + +void createImageHeaderPacket(CPXPacket_t * packet, uint32_t imgSize, StreamerMode_t imgType) { + img_header_t *imgHeader = (img_header_t *) packet->data; + imgHeader->magic = 0xBC; + imgHeader->width = CAM_WIDTH; + imgHeader->height = CAM_HEIGHT; + imgHeader->depth = 1; + imgHeader->type = imgType; + imgHeader->size = imgSize; + packet->dataLength = sizeof(img_header_t); +} + +void sendBufferViaCPX(CPXPacket_t * packet, uint8_t * buffer, uint32_t bufferSize) { + uint32_t offset = 0; + uint32_t size = 0; + do { + size = sizeof(packet->data); + if (offset + size > bufferSize) + { + size = bufferSize - offset; + } + memcpy(packet->data, &buffer[offset], sizeof(packet->data)); + packet->dataLength = size; + cpxSendPacketBlocking(packet); + offset += size; + } while (size == sizeof(packet->data)); +} + +#ifdef SETUP_WIFI_AP +void setupWiFi(void) { + static char ssid[] = "WiFi streaming example"; + cpxPrintToConsole(LOG_TO_CRTP, "Setting up WiFi AP\n"); + // Set up the routing for the WiFi CTRL packets + txp.route.destination = CPX_T_ESP32; + rxp.route.source = CPX_T_GAP8; + txp.route.function = CPX_F_WIFI_CTRL; + WiFiCTRLPacket_t * wifiCtrl = (WiFiCTRLPacket_t*) txp.data; + + wifiCtrl->cmd = WIFI_CTRL_SET_SSID; + memcpy(wifiCtrl->data, ssid, sizeof(ssid)); + txp.dataLength = sizeof(ssid); + cpxSendPacketBlocking(&txp); + + wifiCtrl->cmd = WIFI_CTRL_WIFI_CONNECT; + wifiCtrl->data[0] = 0x01; + txp.dataLength = 2; + cpxSendPacketBlocking(&txp); +} +#endif + // Intializing buffers for camera images static unsigned char *imgBuff0; static struct pi_device ili; @@ -64,7 +191,6 @@ struct pi_cluster_task *task; struct pi_cluster_conf conf; ArgCluster_T ClusterCall; -#if defined(USE_CAMERA) // Open himax camera funciton static int open_camera_himax(struct pi_device *device) { @@ -87,23 +213,19 @@ static int open_camera_himax(struct pi_device *device) pi_camera_reg_get(device, IMG_ORIENTATION, ®_value); if (set_value!=reg_value) { - printf("Failed to rotate camera image\n"); + cpxPrintToConsole(LOG_TO_CRTP, "Failed to rotate camera image\n"); return -1; } - + pi_camera_control(device, PI_CAMERA_CMD_STOP, 0); pi_camera_control(device, PI_CAMERA_CMD_AEG_INIT, 0); return 0; } -#endif /* USE_CAMERA */ + static int open_camera(struct pi_device *device) { -#if defined(USE_CAMERA) return open_camera_himax(device); -#else - return 0; -#endif /* USE_CAMERA */ } //UART init param @@ -111,56 +233,6 @@ L2_MEM struct pi_uart_conf uart_conf; L2_MEM struct pi_device uart; L2_MEM uint8_t rec_digit = -1; -#if defined(USE_STREAMER) -// Initialize structs and function for streamer through wifi -static pi_task_t task1; -static struct pi_device wifi; -static frame_streamer_t *streamer1; -static volatile int stream1_done; - -static void streamer_handler(void *arg) -{ - *(int *)arg = 1; - if (stream1_done) - { - } -} - -static int open_wifi(struct pi_device *device) -{ - struct pi_nina_w10_conf nina_conf; - - pi_nina_w10_conf_init(&nina_conf); - - nina_conf.ssid = ""; - nina_conf.passwd = ""; - nina_conf.ip_addr = "192.168.0.0"; - nina_conf.port = 5555; - pi_open_from_conf(device, &nina_conf); - if (pi_transport_open(device)) - return -1; - - return 0; -} - -static frame_streamer_t *open_streamer(char *name) -{ - struct frame_streamer_conf frame_streamer_conf; - - frame_streamer_conf_init(&frame_streamer_conf); - - frame_streamer_conf.transport = &wifi; - frame_streamer_conf.format = FRAME_STREAMER_FORMAT_JPEG; - frame_streamer_conf.width = CAM_WIDTH; - frame_streamer_conf.height = CAM_HEIGHT; - frame_streamer_conf.depth = 1; - frame_streamer_conf.name = name; - - return frame_streamer_open(&frame_streamer_conf); -} /* USE_STREAMER */ - -#endif - // Functions and init for LED toggle static pi_task_t led_task; @@ -175,11 +247,17 @@ static void led_handle(void *arg) -void test_facedetection(void) +void facedetection_task(void) { + vTaskDelay(2000); + cpxInitRoute(CPX_T_GAP8, CPX_T_WIFI_HOST, CPX_F_APP, &txp.route); + cpxPrintToConsole(LOG_TO_CRTP, "Starting face detection task...\n"); - printf("Entering main controller...\n"); +#ifdef SETUP_WIFI_AP + setupWiFi(); +#endif + unsigned int W = CAM_WIDTH, H = CAM_HEIGHT; unsigned int Wout = 64, Hout = 48; unsigned int ImgSize = W * H; @@ -190,7 +268,7 @@ void test_facedetection(void) imgBuff0 = (unsigned char *)pmsis_l2_malloc((CAM_WIDTH * CAM_HEIGHT) * sizeof(unsigned char)); if (imgBuff0 == NULL) { - printf("Failed to allocate Memory for Image \n"); + cpxPrintToConsole(LOG_TO_CRTP, "Failed to allocate Memory for Image \n"); pmsis_exit(-1); } @@ -200,39 +278,21 @@ void test_facedetection(void) SquaredImageIntegral = (unsigned int *)pmsis_l2_malloc((Wout * Hout) * sizeof(unsigned int)); if (ImageOut == 0) { - printf("Failed to allocate Memory for Image (%d bytes)\n", ImgSize * sizeof(unsigned char)); + cpxPrintToConsole(LOG_TO_CRTP, "Failed to allocate Memory for Image (%d bytes)\n", ImgSize * sizeof(unsigned char)); pmsis_exit(-2); } if ((ImageIntegral == 0) || (SquaredImageIntegral == 0)) { - printf("Failed to allocate Memory for one or both Integral Images (%d bytes)\n", ImgSize * sizeof(unsigned int)); + cpxPrintToConsole(LOG_TO_CRTP, "Failed to allocate Memory for one or both Integral Images (%d bytes)\n", ImgSize * sizeof(unsigned int)); pmsis_exit(-3); } - printf("malloc done\n"); + // printf("malloc done\n"); -#if defined(USE_CAMERA) if (open_camera(&cam)) { - printf("Failed to open camera\n"); + cpxPrintToConsole(LOG_TO_CRTP, "Failed to open camera\n"); pmsis_exit(-5); } -#endif - -#if defined(USE_STREAMER) - - if (open_wifi(&wifi)) - { - printf("Failed to open wifi\n"); - return -1; - } - printf("WIFI connected\n"); // check this with NINA printout - - streamer1 = open_streamer("cam"); - if (streamer1 == NULL) - return -1; - printf("Streamer set up\n"); - -#endif // UART init with Crazyflie and configure pi_uart_conf_init(&uart_conf); @@ -241,10 +301,10 @@ void test_facedetection(void) pi_open_from_conf(&uart, &uart_conf); if (pi_uart_open(&uart)) { - printf("[UART] open failed !\n"); + cpxPrintToConsole(LOG_TO_CRTP, "[UART] open failed !\n"); pmsis_exit(-1); } - printf("[UART] Open\n"); + cpxPrintToConsole(LOG_TO_CRTP, "[UART] Open\n"); // Setup buffer for images buffer.data = imgBuff0 + CAM_WIDTH * 2 + 2; @@ -275,8 +335,8 @@ void test_facedetection(void) pi_open_from_conf(&cluster_dev, (void *)&conf); pi_cluster_open(&cluster_dev); - //Set Cluster Frequency to max - pi_freq_set(PI_FREQ_DOMAIN_CL, 175000000); + //Set Cluster Frequency to 75MHz - max (175000000) leads to more camera failures (unknown why) + pi_freq_set(PI_FREQ_DOMAIN_CL, 75000000); // Send intializer function to cluster task = (struct pi_cluster_task *)pmsis_l2_malloc(sizeof(struct pi_cluster_task)); @@ -289,50 +349,123 @@ void test_facedetection(void) task->entry = (void *)faceDet_cluster_main; task->arg = &ClusterCall; - printf("main loop start\n"); + // printf("main loop start\n"); // Start looping through images int nb_frames = 0; + EventBits_t evBits; + pi_camera_control(&cam, PI_CAMERA_CMD_STOP, 0); + while (1 && (NB_FRAMES == -1 || nb_frames < NB_FRAMES)) { -#if defined(USE_CAMERA) // Capture image + pi_camera_capture_async(&cam, imgBuff0, CAM_WIDTH * CAM_HEIGHT, pi_task_callback(&task1, capture_done_cb, NULL)); pi_camera_control(&cam, PI_CAMERA_CMD_START, 0); - pi_camera_capture(&cam, imgBuff0, CAM_WIDTH * CAM_HEIGHT); + // it should really not take longer than 500ms to acquire an image, maybe we could even time out earlier + evBits = xEventGroupWaitBits(evGroup, CAPTURE_DONE_BIT, pdTRUE, pdFALSE, (TickType_t)(500/portTICK_PERIOD_MS)); pi_camera_control(&cam, PI_CAMERA_CMD_STOP, 0); -#else - // Read in image to check if NN is still working - // TODO: this breaks after the second read.... - char imageName[64]; - sprintf(imageName, "../../../imgTest%d.pgm", nb_frames); - printf("Loading %s ...\n", imageName); - if (ReadImageFromFile(imageName, CAM_WIDTH, CAM_HEIGHT, 1, imgBuff0, CAM_WIDTH * CAM_HEIGHT * sizeof(char), IMGIO_OUTPUT_CHAR, 0)) + // if we didn't succeed in capturing the image (which, especially with high cluster frequencies and dark images can happen) we want to retry + while((evBits & CAPTURE_DONE_BIT) != CAPTURE_DONE_BIT) { - printf("Failed to load image %s\n", imageName); - return 1; + cpxPrintToConsole(LOG_TO_CRTP, "Failed camera acquisition\n"); + pi_camera_control(&cam, PI_CAMERA_CMD_START, 0); + evBits = xEventGroupWaitBits(evGroup, CAPTURE_DONE_BIT, pdTRUE, pdFALSE, (TickType_t)(500/portTICK_PERIOD_MS)); + pi_camera_control(&cam, PI_CAMERA_CMD_STOP, 0); } -#endif /* USE_CAMERA */ // Send task to the cluster and print response pi_cluster_send_task_to_cl(&cluster_dev, task); - printf("end of face detection, faces detected: %d\n", ClusterCall.num_reponse); - //WriteImageToFile("../../../img_out.ppm", IMAGE_OUT_WIDTH, IMAGE_OUT_HEIGHT, 1, ImageOut, GRAY_SCALE_IO); + // cpxPrintToConsole(LOG_TO_CRTP, "end of face detection, faces detected: %d\n", ClusterCall.num_reponse); #if defined(USE_STREAMER) - // Send image to the streamer to see the result - frame_streamer_send_async(streamer1, &buffer, pi_task_callback(&task1, streamer_handler, (void *)&stream1_done)); + if (wifiClientConnected == 1) + { + // First send information about the image + createImageHeaderPacket(&txp, STREAM_W*STREAM_H, RAW_ENCODING); + cpxSendPacketBlocking(&txp); + // Send image + sendBufferViaCPX(&txp, ImageOut, STREAM_W*STREAM_H); + } #endif // Send result through the uart to the crazyflie as single characters pi_uart_write(&uart, &ClusterCall.num_reponse, 1); nb_frames++; } - printf("Test face detection done.\n"); + cpxPrintToConsole(LOG_TO_CRTP, "Test face detection done.\n"); pmsis_exit(0); } +#define LED_PIN 2 +static pi_device_t led_gpio_dev; +void hb_task(void *parameters) +{ + (void)parameters; + char *taskname = pcTaskGetName(NULL); + + // Initialize the LED pin + pi_gpio_pin_configure(&led_gpio_dev, LED_PIN, PI_GPIO_OUTPUT); + + const TickType_t xDelay = 500 / portTICK_PERIOD_MS; + + while (1) + { + pi_gpio_pin_write(&led_gpio_dev, LED_PIN, 1); + vTaskDelay(xDelay); + pi_gpio_pin_write(&led_gpio_dev, LED_PIN, 0); + vTaskDelay(xDelay); + } +} + +void start_example(void) +{ + cpxInit(); + cpxEnableFunction(CPX_F_WIFI_CTRL); + + cpxPrintToConsole(LOG_TO_CRTP, "-- WiFi image streamer example --\n"); + + evGroup = xEventGroupCreate(); + + BaseType_t xTask; + + xTask = xTaskCreate(hb_task, "hb_task", configMINIMAL_STACK_SIZE * 2, + NULL, tskIDLE_PRIORITY + 1, NULL); + if (xTask != pdPASS) + { + cpxPrintToConsole(LOG_TO_CRTP, "HB task did not start !\n"); + pmsis_exit(-1); + } + + xTask = xTaskCreate(facedetection_task, "facedetection_task", configMINIMAL_STACK_SIZE * 4, + NULL, tskIDLE_PRIORITY + 1, NULL); + + if (xTask != pdPASS) + { + cpxPrintToConsole(LOG_TO_CRTP, "Camera task did not start !\n"); + pmsis_exit(-1); + } + + xTask = xTaskCreate(rx_task, "rx_task", configMINIMAL_STACK_SIZE * 2, + NULL, tskIDLE_PRIORITY + 1, NULL); + + if (xTask != pdPASS) + { + cpxPrintToConsole(LOG_TO_CRTP, "RX task did not start !\n"); + pmsis_exit(-1); + } + + while (1) + { + pi_yield(); + } +} + int main(void) { - printf("\n\t*** PMSIS FaceDetection Test ***\n\n"); - return pmsis_kickoff((void *)test_facedetection); + pi_bsp_init(); + + // Increase the FC freq to 250 MHz + pi_freq_set(PI_FREQ_DOMAIN_FC, 250000000); + pi_pmu_voltage_set(PI_PMU_DOMAIN_FC, 1200); + return pmsis_kickoff((void *)start_example); } diff --git a/examples/image_processing/FaceDetection/opencv-viewer.py b/examples/image_processing/FaceDetection/opencv-viewer.py new file mode 100644 index 00000000..374b737c --- /dev/null +++ b/examples/image_processing/FaceDetection/opencv-viewer.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# || ____ _ __ +# +------+ / __ )(_) /_______________ _____ ___ +# | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \ +# +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/ +# || || /_____/_/\__/\___/_/ \__,_/ /___/\___/ +# +# Copyright (C) 2021 Bitcraze AB +# +# AI-deck demo +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Demo for showing streamed JPEG images from the AI-deck example. +# +# By default this demo connects to the IP of the AI-deck example when in +# Access point mode. +# +# The demo works by opening a socket to the AI-deck, downloads a stream of +# JPEG images and looks for start/end-of-frame for the streamed JPEG images. +# Once an image has been fully downloaded it's rendered in the UI. +# +# Note that the demo firmware is continously streaming JPEG files so a single +# JPEG image is taken from the stream using the JPEG start-of-frame (0xFF 0xD8) +# and the end-of-frame (0xFF 0xD9). + +import argparse +import time +import socket,os,struct, time +import numpy as np + +# Args for setting IP/port of AI-deck. Default settings are for when +# AI-deck is in AP mode. +parser = argparse.ArgumentParser(description='Connect to AI-deck JPEG streamer example') +parser.add_argument("-n", default="192.168.4.1", metavar="ip", help="AI-deck IP") +parser.add_argument("-p", type=int, default='5000', metavar="port", help="AI-deck port") +parser.add_argument('--save', action='store_true', help="Save streamed images") +args = parser.parse_args() + +deck_port = args.p +deck_ip = args.n + +print("Connecting to socket on {}:{}...".format(deck_ip, deck_port)) +client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +client_socket.connect((deck_ip, deck_port)) +print("Socket connected") + +imgdata = None +data_buffer = bytearray() + +def rx_bytes(size): + data = bytearray() + while len(data) < size: + data.extend(client_socket.recv(size-len(data))) + return data + +import cv2 + +stream_w = 160 +stream_h = 120 + +start = time.time() +count = 0 + +while(1): + # First get the info + packetInfoRaw = rx_bytes(4) + #print(packetInfoRaw) + [length, routing, function] = struct.unpack('0x{:02X}".format(routing & 0xF, routing >> 4)) + #print("Function is 0x{:02X}".format(function)) + + imgHeader = rx_bytes(length - 2) + #print(imgHeader) + #print("Length of data is {}".format(len(imgHeader))) + [magic, width, height, depth, format, size] = struct.unpack('{:02X})".format(length, src, dst)) + chunk = rx_bytes(length - 2) + imgStream.extend(chunk) + + count = count + 1 + meanTimePerImage = (time.time()-start) / count + print("{}".format(meanTimePerImage)) + print("{}".format(1/meanTimePerImage)) + + if format == 0: + bayer_img = np.frombuffer(imgStream, dtype=np.uint8) + bayer_img.shape = (stream_h, stream_w) + cv2.namedWindow('Raw', cv2.WINDOW_NORMAL) + cv2.resizeWindow('Raw', 600,600) + cv2.imshow('Raw', bayer_img) + if args.save: + cv2.imwrite(f"stream_out/raw/img_{count:06d}.png", bayer_img) + cv2.waitKey(1) + else: + with open("img.jpeg", "wb") as f: + f.write(imgStream) + nparr = np.frombuffer(imgStream, np.uint8) + decoded = cv2.imdecode(nparr,cv2.IMREAD_UNCHANGED) + cv2.imshow('JPEG', decoded) + cv2.waitKey(1) + diff --git a/examples/image_processing/FaceDetection/wifi.h b/examples/image_processing/FaceDetection/wifi.h new file mode 100644 index 00000000..8e44996a --- /dev/null +++ b/examples/image_processing/FaceDetection/wifi.h @@ -0,0 +1,18 @@ +#pragma once + +#include + +typedef enum { + WIFI_CTRL_SET_SSID = 0x10, + WIFI_CTRL_SET_KEY = 0x11, + + WIFI_CTRL_WIFI_CONNECT = 0x20, + + WIFI_CTRL_STATUS_WIFI_CONNECTED = 0x31, + WIFI_CTRL_STATUS_CLIENT_CONNECTED = 0x32, +} __attribute__((packed)) WiFiCTRLType; + +typedef struct { + WiFiCTRLType cmd; + uint8_t data[50]; +} __attribute__((packed)) WiFiCTRLPacket_t; \ No newline at end of file diff --git a/examples/other/test_functionalities/test_camera/test.c b/examples/other/test_functionalities/test_camera/test.c index b94c5eea..bcf944d4 100644 --- a/examples/other/test_functionalities/test_camera/test.c +++ b/examples/other/test_functionalities/test_camera/test.c @@ -168,6 +168,6 @@ int test_camera() int main(void) { - printf("\n\t*** PMSIS Camera with LCD Example ***\n\n"); + printf("\n\t*** PMSIS Camera ***\n\n"); return pmsis_kickoff((void *) test_camera); } diff --git a/examples/other/wifi-img-streamer/wifi-img-streamer.c b/examples/other/wifi-img-streamer/wifi-img-streamer.c index 03d015bd..bfdc8b2b 100644 --- a/examples/other/wifi-img-streamer/wifi-img-streamer.c +++ b/examples/other/wifi-img-streamer/wifi-img-streamer.c @@ -66,19 +66,18 @@ static int open_pi_camera_himax(struct pi_device *device) return -1; // rotate image - pi_camera_control(&camera, PI_CAMERA_CMD_START, 0); + pi_camera_control(device, PI_CAMERA_CMD_START, 0); uint8_t set_value = 3; uint8_t reg_value; - pi_camera_reg_set(&camera, IMG_ORIENTATION, &set_value); + pi_camera_reg_set(device, IMG_ORIENTATION, &set_value); pi_time_wait_us(1000000); - pi_camera_reg_get(&camera, IMG_ORIENTATION, ®_value); + pi_camera_reg_get(device, IMG_ORIENTATION, ®_value); if (set_value != reg_value) { cpxPrintToConsole(LOG_TO_CRTP, "Failed to rotate camera image\n"); return -1; } - pi_camera_control(&camera, PI_CAMERA_CMD_STOP, 0); - + pi_camera_control(device, PI_CAMERA_CMD_STOP, 0); pi_camera_control(device, PI_CAMERA_CMD_AEG_INIT, 0); return 0;