使用OpenCV 3.4.1(C++)开发人脸识别程序时找不到cv::FaceRecognizer类
我之前也踩过这个一模一样的坑!在OpenCV 3.x系列版本里,人脸识别相关的类被拆分到了独立的face模块中,不再默认包含在<opencv2/opencv.hpp>这个总头文件里,这就是你找不到cv::FaceRecognizer的核心原因。下面给你具体的解决步骤:
第一步:引入face模块的专属头文件
你需要在代码里显式添加face模块的头文件,替换或者补充原来的总头文件:#include <opencv2/face.hpp>这个头文件不会被
<opencv2/opencv.hpp>自动包含,必须单独引入才能访问FaceRecognizer类。第二步:注意命名空间的层级
FaceRecognizer实际上属于cv::face子命名空间,所以你可以直接用完整的限定名cv::face::FaceRecognizer,或者在代码开头加上:using namespace cv::face;这样后续代码里就可以直接写
FaceRecognizer,不用每次都写全路径。第三步:编译时务必链接face模块
这一步最容易被忽略!如果是用CMake构建项目,一定要在CMakeLists.txt里明确指定依赖face模块:find_package(OpenCV REQUIRED COMPONENTS core highgui imgproc face) target_link_libraries(你的项目名称 ${OpenCV_LIBS})如果是手动用g++编译,需要在编译命令里加上face库的链接参数:
g++ your_face_recog.cpp -o output `pkg-config --cflags --libs opencv opencv_face`或者直接指定库路径和文件名(替换成你自己的OpenCV安装路径):
g++ your_face_recog.cpp -o output -I/usr/local/include/opencv4 -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_face
另外补充一点:OpenCV 3.4.1里的各类人脸识别实现(比如EigenFaceRecognizer、FisherFaceRecognizer、LBPHFaceRecognizer)都是继承自cv::face::FaceRecognizer的,按上面的步骤操作后,这些类也能正常使用了。
内容的提问来源于stack exchange,提问作者Nathan Headley

