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

Módulo de IA AIWorld P1 para BPI-M2 Ultra y Berry · Archivo : p1-opencv-face-detection-mpi-9.ino · Lenguaje : C++ · Uso : 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.

Ejemplo que utiliza OpenCV y ARM Compute Library para detección de rostros en la cámara incorporada.

Este código requiere ARM Compute Library (ACL) 17.06 y OpenCV 3.2 instalados en Vecoo Linux. Se recomienda un compilador g++ con soporte C++14. La cámara OV5640 se accede a través de video0. Asegúrese de que el archivo XML de la cascada Haar exista en /opt/opencv/data/haarcascades/. Ejecute el binario compilado para mostrar la ventana de detección. El modo EGLFS puede requerir ajustes para la visualización GUI mediante X11 o 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;
}

← Volver a la ficha