首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

OpenCV 多張人臉識別與相對位置獲取方法

     編輯:程式設計疑難解答

核心能力

OpenCV CascadeClassifier / DNN 人臉檢測器可在單幀中同時檢測多張人臉,返回每張臉的 邊界框 (x, y, w, h),即相對於圖像左上角的像素坐標。

代碼示例 (C++ / Python)

// C++
CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_default.xml");
vector faces;
face_cascade.detectMultiScale(gray, faces, 1.1, 3, 0, Size(30,30));
for (size_t i = 0; i < faces.size(); i++) {
    Rect r = faces[i];
    cout << "Face " << i << ": x=" << r.x << " y=" << r.y << " w=" << r.width << " h=" << r.height << endl;
    // 相對位置:中心點 (r.x + r.width/2, r.y + r.height/2)
    // 臉間距離:歐氏距離或中心點向量
}
# Python
import cv2
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
for i, (x, y, w, h) in enumerate(faces):
    print(f"Face {i}: ({x},{y}) {w}x{h}")
    center = (x + w//2, y + h//2)

進階:相對位置關係計算

  • 中心點向量:dx = cx2 - cx1, dy = cy2 - cy1;
  • 歐氏距離:dist = sqrt(dx*dx + dy*dy);
  • 角度:angle = atan2(dy, dx) * 180 / PI;
  • 遮擋判斷:IOU (Intersection over Union) > 0.3 視為重疊/遮擋。

提升檢測效果建議

  1. 使用 DNN 模型 (OpenCV 3.3+ dnn::readNetFromCaffe/TensorFlow) 替代 Haar,準確率大幅提升,支持 GPU 加速;
  2. 輸入圖像 resize 至固定寬度 (如 300px) 再檢測,再將坐標映射回原圖;
  3. 啟用 minNeighbors (Haar) 或 confidence_threshold (DNN) 過濾誤檢;
  4. 多尺度檢測:金字塔下采樣 + 多尺度滑動窗口 (Haar 內建) / 輸入多尺度 Blob (DNN)。

總結

OpenCV 原生支持多臉檢測,直接獲得每張臉的矩形框坐標,由此可計算任意相對位置關係。新項目優先選 DNN 模型 (如 opencv_face_detector_uint8.pb) 獲得最佳精度/速度平衡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved