在C ++ 11 / Linux中使用pthread加速面部检测

时间:2017-04-27 18:31:55

标签: opencv c++11 raspberry-pi pthreads simd-library

我是C ++的初学者, 并试图通过在raspberry pi 3和相机上使用OpenCV和SIMD库(支持ARM NEON)进行实时人脸检测。使用SIMD库后,FPS约为7. FPS没问题,但相机有一点延迟。

原始程序流程:

  1. 全局变量:cv :: Mat imageToDoFaceDetection,                   cv :: Point upperLeftPoint,                   cv :: Point lowerRightPoint,
  2. 从相机捕捉图像
  3. 检测给定图像中的面部并将输出放入cv :: Point(s)
  4. 在原始图像上绘制矩形
  5. 输出到窗口
  6. 通过while循环返回(2)
  7. 以下是代码:

    cv::Mat imageToDoFaceDetection;
    cv::Point upperLeftPoint;
    cv::Point lowerRightPoint;
    int frameCount = 0;
    int main(){
        while(1){
            imageToDoFaceDetection = captureImageFromCamera();
            if(frameCount%4==0){  //doing face detection on every 4 frames
                faceDetection();
            }
            drawRectangleOnImage(imageToDoFaceDetection,upperLeftPoint,lowerRightPoint);
            showImage(imageToDoFaceDetection);
            frameCount++;
        }
        return 0;
    }
    void faceDetection(){
        ...
        //Function will read the global var imageToDoFaceDetection,
        //And put the outputs to the upperLeftPoint, lowerRightPoint
        //Assume that the function is work
        return;
    }
    

    FPS没问题,但是相机延迟了。由于faceDetection()消耗的时间,窗口的图像输出将被延迟。

    我正在尝试使用pthread来解决延迟问题。我假设图像中的面部移动缓慢,所以我想创建pthread并使用之前在帧上检测到的位置在pthread和drawRectangleOnImage()上执行faceDetection()。

    表示输出到窗口的图像(showImage())不会等待faceDetection(),两个线程将同时执行该作业。在一个pthread上,drawRectangleOnImage()和showImage()将使用检测到的点数,这可能会被之前的少量帧检测到。在另一个pthread上,faceDetection()将不断更新Points。因为面部移动缓慢,所以显示faceDetection()矩形的延迟位置是可以的。

    我已经尝试过fork(),但只能通过一个进程使用相机。 更新的代码:

    cv::Mat imageToDoFaceDetection;
    cv::Point upperLeftPoint;
    cv::Point lowerRightPoint;
    int frameCount = 0;
    pthread_t tid;
    int main(){
        While(1){
            imageToDoFaceDetection = captureImageFromCamera();
            //only 2 pthreads will be created.
            if(frameCount==0){
                 pthread_create(&pid,NULL,pthread1_detection,NULL);
            }
            if(frameCount==2){
                 pthread_create(&pid,NULL,pthread2_detection,NULL);
            }
            drawRectangleOnImage(imageToDoFaceDetection,upperLeftPoint,
                                 lowerRightPoint);
            showImage(imageToDoFaceDetection);
            frameCount++;
        }
        return 0;
    }
    
    void* pthread1_detection(void* data){
        while(1){
             if(frameCount%4==0){
                 faceDetection();
             }
        }
        pthread_exit(NULL);
    }
    
    void* pthread2_detection(void* data){
        while(1){
             if(frameCount%4==2){
                 faceDetection();
             }
        }
        pthread_exit(NULL);
    }
    
    void faceDetection(){
        ...
    }
    

    执行代码后,将显示Segmentation Fault。我一直在努力解决这个问题好几个小时........ !!! (使用SIMD库解决面部检测问题的时间更长......)

    我想知道原因和解决方案。谢天谢地,祝你有愉快的一天。

0 个答案:

没有答案