p1-opencv-face-detection-mpi-9.ino
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;
}