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