【Ubuntu】基于C++实现人脸识别( 七 )

#include "opencv2/opencv.hpp"using namespace std;using namespace cv;int main() {// 1.打开摄像头//VideoCapture cap(0);VideoCapture cap(0, cv::CAP_V4L2);// 打开(默认的)摄像头0(编译时加上-lopencv_videoio)if(!cap.isOpened()) {// 检查摄像头是否成功打开cout << "Camera open failed!" << endl;return -1;}cout << "Camera open success." << endl;// 2.显示视频Mat img_color; // 定义彩色图像(注意因为用到了mat,所以编译时加上-lopencv_core)Mat img_gray;// 定义灰度图for(;;) {cap >> img_color; // 获取一帧彩色图像cvtColor(img_color, img_gray, cv::COLOR_BGR2GRAY); // 将彩图转换成灰度图(-lopencv_imgproc)imshow("video", img_gray); // 在“video”窗口中显示图片(编译时加上-lopencv_highgui)waitKey(50);// 等待50ms(20fps)}return 0;}
下面是我在开发过程中的终端实际操作,包括解决代码报错过程:
解决报错参考文章:
error: ‘’ was notin this scope
# 下面是报错1lyl@ubuntu:~/桌面$ vim main.cpp ################################### 添加了彩图转灰度图的代码##################################lyl@ubuntu:~/桌面$ g++ main.cpp -o main -lopencv_videoio -lopencv_core -lopencv_highguimain.cpp: In function ‘int main()’:main.cpp:20:39: error: ‘CV_BGR2GRAY’ was not declared in this scope20 |cvtColor(img_color, img_gray, CV_BGR2GRAY); // 将彩图转换成灰度图(-lopencv_imgproc)|^~~~~~~~~~~lyl@ubuntu:~/桌面$ vim main.cpp ################################### 将CV_BGR2GRAY改成cv::COLOR_BGR2GRAY##################################lyl@ubuntu:~/桌面$ g++ main.cpp -o main -lopencv_videoio -lopencv_core -lopencv_highgui/usr/bin/ld: /tmp/ccOsqEF2.o: undefined reference to symbol '_ZN2cv8cvtColorERKNS_11_InputArrayERKNS_12_OutputArrayEii'/usr/bin/ld: /lib/x86_64-linux-gnu/libopencv_imgproc.so.4.2: error adding symbols: DSO missing from command linecollect2: error: ld returned 1 exit statuslyl@ubuntu:~/桌面$ g++ main.cpp -o main -lopencv_videoio -lopencv_core -lopencv_highgui -lopencv_imgproclyl@ubuntu:~/桌面$ ./mainCamera open success.^C
图4-1 彩图转换成灰度图
直方图均衡化
但是灰度图也有问题,就是人脸的轮廓不是很清晰,此时截取人脸时就会出现误差 。为了解决这个问题,就需要“直方图均衡化”,就是通过调整照片的亮度和对比度,来使人脸更加清晰 。
//终端编译指令/g++ main.cpp -o main -lopencv_videoio -lopencv_core -lopencv_highgui//cpp源代码/#include #include "opencv2/opencv.hpp"using namespace std;using namespace cv;int main() {// 1.打开摄像头//VideoCapture cap(0);VideoCapture cap(0, cv::CAP_V4L2);// 打开(默认的)摄像头0(编译时加上-lopencv_videoio)if(!cap.isOpened()) {// 检查摄像头是否成功打开cout << "Camera open failed!" << endl;return -1;}cout << "Camera open success." << endl;// 2.显示视频Mat img_color; // 定义彩色图像(注意因为用到了mat,所以编译时加上-lopencv_core)Mat img_gray;// 定义灰度图Mat img_eql;// 定义直方图均衡化后的灰度图for(;;) {cap >> img_color; // 获取一帧彩色图像cvtColor(img_color, img_gray, cv::COLOR_BGR2GRAY); // 将彩图转换成灰度图(-lopencv_imgproc)equalizeHist(img_gray, img_eql); //直方图均衡化(-lopencv_imgproc)imshow("video", img_eql); // 在“video”窗口中显示图片(编译时加上-lopencv_highgui)waitKey(50);// 等待50ms(20fps)}return 0;}
图4-2 将灰度图进行直方图均衡化
但注意上述两步不是必须要做,但是做了之后可以提高人脸识别的准确度 。
4.2 编程-图像人脸检测(上)
上一节已经获取了摄像头照片,本节来对照片中的人脸进行检测 。人脸检测的底层原理就是根据人脸的特殊特征,通过卷积等方法在图像中找出最符合这种特征的区域,就认为是人脸 。当然这些特征的采集和辨别都在中有专门的函数 。首先就是“.”中的“类”(级联分类器) 。类中包含很多方法,都是用于检测特定对象的 。下面是自带的特征库: