问题总结
常用解决问题办法:按照报错信息添加依赖等、仔细查看项目课件、百度报错信息
编译报错:/usr/bin/ld: /tmp/ccOYY87W.o: undefined reference to symbol ‘_ZN2cv6String10deallocateEv’
//usr/lib/x86_64-linux-gnu/libopencv_core.so.3.2: 无法添加符号: DSO missing from command line
collect2: error: ld returned 1 exit status
- 解决:编译c++文件时缺少必要的依赖,g++编译时需要添加两个库opencv_videoio 和lopencv_core:
g++ text.cpp -o text -l opencv_videoio -lopencv_core
多打log(printf函数)便于调试,从log分析
项目主体
环境搭建:VirtualBox虚拟机+Ubuntu18.04
语言:c++
项目框架:opencv
硬件:摄像头、电脑
开发流程:
- 图像采集(拍照片),需要程序驱动摄像头去采集照片
- Linux人脸检测,将脸截图出来,使用OpenCV库,opencv只负责人脸检测,照片那块区域是人脸,无法完成人脸识别,人脸识别借助了百度智能云
- opencv将照片上的人脸截图,然后发送给百度智能云,百度智能云完成人脸对比工作,百度智能云先分析人脸照片的特征,然后和人脸库中的人脸做对比,并找出人脸是哪个人的脸,然后百度智能云通过互联网发送出对比结果
OpenCV
-
OpenCV是一个开源的计算机视觉和机器学习软件库其使用一系列C语言函数和少量C++类实现,内部实现了很多图像处理和计算机视觉的通用算法;OpenCV可以运行在Linux系统上,且其轻量、高效所以在嵌入式领域得到广泛的应用;
-
在线安装:sudo apt-get install libopencv-dev
- 注意:执行此命令前先执行apt-get update。apt-get下载某个包中它的所有依赖项都必须存在,这就是为什么我们每次执行apt-get的时候都需要先apt-get update的更新软件包的原因。
-
查看安装状态:dpkg -s libopencv-dev
-
安装版本:3.2.0
-
在线文档:https://opencv.org/
virtualbox接摄像头
- 乌邦图在能接到摄像头前需要在virtualbox中安装插件,根据virtualbox版本可以在这里找自己需要的驱动插件:https://www.virtualbox.org/wiki/Download_Old_Builds
- 点击virtualBox中:管理 –> 全局设定 –> 扩展 –> 添加新包
- 选择刚下载好的驱动安装,安装成功则提示成功安装(如果不成功需要看版本是否匹配)
- 接下来在 虚拟机设备-摄像头-Integrated Camera勾选即可在虚拟机内使用摄像头了
查询Linux下摄像头编号:
- 打开Linux终端,使用命令
ls /dev/video*
即可查询摄像头编号
简单应用opencv实验代码
text.cpp文件:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap; //初始化视频捕获
cap.open(0); // 使用编号为0的摄像头
if (!cap.isOpened()) {
cout << "ERROR! Unable to open camera"<<endl;
return 0;
}
cout << "open camera success!"<<endl;
return 0;
}
连同opencv库共同编译c++文件命令: g++ text.cpp -o text -l opencv_videoio -lopencv_core
解释:opencv是第三方库,编译器不能从系统中找到该库,代码中使用了VideoCapture,VideoCapture处于opencv_videoio库中,所以编译时需要用-l来指定链接用到的opencv_videoio库
g++是gcc默认语言设为c++的一个特殊版本,连接时自动使用c++标准库而不使用c标准库,如果使用gcc编译c++程序可以使用命令 gcc text.cpp -o text -l opencv_videoio -lopencv_core -lstdc++
,选项 -l (ell) 通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字 libstdc++.a。而后它在标准库路径中查找该库。gcc 的编译过程和输出文件与 g++ 是完全相同的。
执行编译后的文件:./text
图像采集
一秒切换24帧就可以实现图片转成图像,这里延时40ms
控制台退出正在执行的进程:CTRL+c
实验代码:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap;
cap.open(0);
if (!cap.isOpened()) {
cout << "ERROR! Unable to open camera"<<endl;
return 0;
}
cout << "Camera open success!"<<endl;
Mat frame; //实例化mat对象,mat是用于存储图像类
cout << "Start grabbing" << endl;
for (;;)
{
cap.read(frame); //摄像头照相并且存放到frame中
if (frame.empty()) {
cout << "ERROR! blank frame grabbed"<<endl;
break;
}
imshow("video", frame); //打开video名的窗口来显示frame帧
waitKey(40);
}
return 0;
}
连同opencv库共同编译c++文件命令:g++ text.cpp -o text -l opencv_videoio -lopencv_core -lopencv_highgui
图像处理
-
彩色照片信息量过大,需要转化为黑白照片以提高准确度并降低难度
-
灰度图人脸轮廓不够清晰
解决方法:直方图均匀化,通过调节照片亮度和对比度来区分脸和背景,使脸更清晰
代码:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap;
cap.open(0);