我是C ++的初学者, 并试图通过在raspberry pi 3和相机上使用OpenCV和SIMD库(支持ARM NEON)进行实时人脸检测。使用SIMD库后,FPS约为7. FPS没问题,但相机有一点延迟。
原始程序流程:
以下是代码:
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库解决面部检测问题的时间更长......)
我想知道原因和解决方案。谢天谢地,祝你有愉快的一天。