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

Module d'IA AIWorld P1 pour BPI-M2 Ultra et Berry · Fichier : p1-opencv-face-detection-mpi-9.ino · Langage : C++ · Usage : 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.

Exemple utilisant OpenCV et ARM Compute Library pour détecter les visages via la caméra embarquée.

Ce code nécessite la bibliothèque ARM Compute Library (ACL) 17.06 et OpenCV 3.2 installés sur le système Vecoo Linux. Compilateur g++ avec support C++14 recommandé. La caméra OV5640 est accédée via video0. Assurez-vous que le fichier XML de la cascade Haar est présent dans /opt/opencv/data/haarcascades/. Exécutez le binaire compilé pour afficher la fenêtre de détection. Le mode eglfs peut nécessiter des ajustements pour l'affichage GUI via X11 ou 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;
}

← Retour à la fiche