如何在Java中加速OpenCV中的人脸检测

时间:2014-05-26 17:53:47

标签: java performance opencv face-detection

我正在尝试使用网络摄像头进行实时人脸检测编程以跟踪房间中的人脸。但是,当我这样做时,它给我的速度不超过每秒4帧(每267毫秒)。我知道其他使用OpenCV的人使用TBB / OpenMP可以获得<20ms。

我想每秒至少获得10帧。以下是我为加快流程所采取的措施:

  • 我正在检测图像灰度的脸部。
  • 我使用的缩放系数为1.1
  • 我设置了最小值和最大值。

简而言之我的问题是: 为什么我的代码与其他代码相比如此之慢?我的代码不使用OpenMP或TBB吗?如何让我的代码使用它?在Java中甚至可以使用OpenMP或TBB吗?

我正在安装Windows的2012年末MacBook(Core i7,4Gb RAM)上运行该程序。

这是我目前的代码:

public class FaceDetector {
    CascadeClassifier faceDetector;

    public FaceDetector(){
        faceDetector = new CascadeClassifier(new File("haarcascade_frontalface_alt.xml").getPath());
    }

    /** Image will be overwritten by an image with detected faces on it **/
    public Rect[] getFaces(Mat image){

        MatOfRect faceDetections = new MatOfRect();

        Mat mGray = image;
        Imgproc.cvtColor(image, mGray, Imgproc.COLOR_RGBA2GRAY); // Convert to grayscale
        faceDetector.detectMultiScale(image, faceDetections, 1.1, 2, 2,new Size(40, 40), new Size(400, 400));

        for (Rect rect : faceDetections.toArray()) {
            Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                    new Scalar(0, 255, 0));
        }

        return faceDetections.toArray();
    }   
}

提前致谢!

Milan van Dijck(Avans应用科技大学学生)

1 个答案:

答案 0 :(得分:0)

我认为您的代码不能直接使用OpenMP或TBB。要使用OpenMP,您通常会添加类似&#39; #pragma omp ...&#39;在你的循环之前。

类似的东西:

//#pragma omp parallel for private(j)
for(j = 0; j < _eyesVec.size(); j++ )
{
    cv::rectangle(faceROIColor, Rect(_eyesVec[j].x,_eyesVec[j].y,_eyesVec[j].width,_eyesVec[j].height), 

    cv::Scalar(0,255,0),2,8,0);
}

您还必须确保使用已启用OpenMP的opencv二进制文件(使用WITH_OPENMP选项编译)