p1-opencv-face-detection-mpi-9.ino

AIWorld P1 AI Module for BPI-M2 Ultra and Berry · File : p1-opencv-face-detection-mpi-9.ino · Language : C++ · Use case : Utiliser la bibliothèque ARM Compute Library (ACL) et OpenCV pour la détection de visages en temps réel sur le flux de la caméra OV5640.

Example using OpenCV and ARM Compute Library for face detection on the embedded camera.

This code requires ARM Compute Library (ACL) 17.06 and OpenCV 3.2 installed on Vecoo Linux. A g++ compiler with C++14 support is recommended. The OV5640 camera is accessed via video0. Ensure the Haar cascade XML file exists in /opt/opencv/data/haarcascades/. Run the compiled binary to display the detection window. EGLFS mode may require adjustments for GUI display via X11 or Wayland.

p1-opencv-face-detection-mpi-9.ino

/*
 * AIWorld P1: Détection de visage avec ARM Compute Library (ACL) + OpenCV
 * Compile: g++ -std=c++14 -O3 p1_acl_face.cpp -o acl_face -I/usr/include -L/usr/lib -lopencv_core -lopencv_highgui -lopencv_objdetect -lopencv_imgproc -larm_compute-runtime
"""
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/objdetect.hpp>
#include <arm_compute/runtime/NEON/NEFunctions.h>
#include <arm_compute/core/Types.h>
#include <iostream>

using namespace cv;
using namespace arm_compute;
using namespace arm_compute::experimental;

// Initialisation simple de la fonction NEON pour montrer l'intégration ACL
void init_acl() {
    MemoryManager::get()->set_allocator(nullptr); // Utilisation du gestionnaire par défaut si nécessaire
    // Note : L'intégration complète d'ACL pour le filtrage nécessite une configuration Tensor plus complexe.
    // Ici, on démontre l'appel initial et le fallback OpenCV standard pour la robustesse.
}

int main() {
    init_acl();

    // Charger le cascatelle Haar pour la détection de visage
    CascadeClassifier face_cascade;
    std::string cascade_path = "/opt/opencv/data/haarcascades/haarcascade_frontalface_default.xml";
    if (!face_cascade.load(cascade_path)) {
        std::cerr << "Erreur: Impossible de charger la cascade. Vérifiez le chemin." << std::endl;
        return -1;
    }

    // Ouvrir le flux vidéo (0 est souvent la caméra par défaut sur V40/Linux)
    VideoCapture cap(0);
    if (!cap.isOpened()) {
        std::cerr << "Erreur: Impossible d'ouvrir la caméra." << std::endl;
        return -1;
    }

    Mat frame, gray;
    Mat faces;
    std::vector<Rect> faces_vec;

    std::cout << "Lecture vidéo démarrée. Appuyez sur 'q' pour quitter." << std::endl;

    while (true) {
        cap >> frame;
        if (frame.empty()) break;

        // Conversion en niveaux de gris pour la détection
        cvtColor(frame, gray, COLOR_BGR2GRAY);
        equalizeHist(gray, gray);

        // Détection de visage
        face_cascade.detectMultiScale(gray, faces_vec, 1.1, 4, 0|CASCADE_SCALE_IMAGE, Size(30, 30));

        for (size_t i = 0; i < faces_vec.size(); i++) {
            // Dessiner un rectangle autour du visage
            rectangle(frame, faces_vec[i], Scalar(255, 0, 0), 2, 8, 0);
        }

        imshow("AIWorld P1 - ACL Face Detection", frame);

        if (waitKey(30) >= 0) break;
    }

    cap.release();
    destroyAllWindows();
    return 0;
}

← Back to the board