一、硬件环境
开发情绪识别系统时的硬件环境配置:联想E40笔记本,操纵系统windows764位操作系统,i5处理器,4G内存,双显卡AMD Radeon™ R5 M330和Intel HD Graphics 5500(推荐使用NVIDIA的显卡进行加速)
二、安装VS2015 Community 版本。
按照教程进行安装,Visual Studio各版本下载网址https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2015-version-history
三、OpenCV3.1.0+VS2015开发环境配置
按照教程在VS2015中配置Opencv,使用版本为opencv3.1.0,官方网址http://opencv.org/,下载地址https://opencv.org/releases.html
https://www.cnblogs.com/linshuhe/p/5764394.html
到OpenCV的官网(http://opencv.org/)下载最新版本的OpenCV安装包,由于OpenCV针对不同平台都有安装程序,所以我们只需要根据当前开发环境选择合适的平台版本即可,这里我们是在win7 64bit操作系统下进行开发,所以应该下载OpenCV for Windows:
我们选择了版本为3.1,下载完毕后,我们得到其安装文件:opencv-3.1.0.exe
1、安装:
双击打开下载好的opencv-3.1.0.exe文件,进行安装(其实是解压),选择安装目录:
安装完毕之后,在其安装目录下可以看到两个文件夹:build和sources,其中build是OpenCV使用时要用到的一些库文件,而sources中则是OpenCV为我们提供的一些demo示范源码:
2.环境变量配置:
上面步骤只是完成了安装,但是要能够正常使用OpenCV来进行开发,我们还需要进行环境变量的配置,我的电脑—>属性—>高级系统设置—>环境变量,找到Path变量,选中并点击编辑:
64位系统的需要在path添加“;opencv安装路径\build\x64\vc14\bin”(注:英文输入法中的“;”是分割符,用于与前面其他软件的配置参数分开),例如我的配置参数应该为:; D:\private files\opencv310\opencv\build\x64\vc14\bin。在之前的opencv版本中的配置时,32位系统应配置路径“;opencv安装路径\build\x86\vc14\bin”,但是3.1.0版本的OpenCV已经将x86这个目录删除了,也就是说在VS2015环境下不能进行32位的OpenCV编译。
还有一个要注意的就是x64文件夹下分为vc12和vc14两个文件夹,他们对应于VS的版本,例如VS2013应使用vc2012,而这里我们使用的是VS2015,所以应该使用vc14文件目录:
补充:vc8 = VisualStudio 2005,vc9 = Visual Studio 2008,vc10 = Visual Studio2010,vc11 = Visual Studio 2012,vc12 = Visual Studio2013,vc14 = Visual Studio 2015
注意:环境变量配置完毕之后,需要重启电脑才能生效!
3.VS 2015配置:
我们知道要在VS中使用外部的类库的话,需要进行引入的一下配置,这个配置就包括:外部库目录指定和外部包含文件指定。
打开VS 2015,新建一个空白的win32的控制台工程:
选择语言为C++,Win32类型中的控制台工程,并设置工程名称:
指定建立的工程为空白工程:
建立完工程之后,我们选中解决方案栏中的ResourceFiles目录(即源码目录),然后新建一个C++源码文件:
设置源码的文件名,例如:Main,然后创建此源码文件到工程中:
在VS中有个叫做“属性管理器”的工具,用于进行VS整体参数的配置,配置一次之后,以后所有新建项目都能应用改配置,不用再一一进行配置操作,使用起来也非常方便。点击工具栏中的:View—>Other Windows—>Property Manger打开属性管理器:
在新出现的属性管理器栏中,展开目录,选中Debug|Win64中的Microsoft.Cpp.x64.user,并右键点击属性(Properties)进入属性界面:
1)配置包含目录:
在通用属性(CommonProperties)—>VC ++目录—>包含目录,然后点击右侧三角标志选中Edit进入编辑:
向其中添加下面路径:
D:\private files\opencv310\opencv\build\include
2)配置库文件目录:
完成上面的包含目录配置之后,我们还需要进行库文件的配置:回到属性界面,选择包含目录下面的Library Directories(库文件目录):
向库文件目录下添加OpenCV的库文件目录:E:\OpenCV\opencv\build\x64\vc14\lib,这个目录根据每个人自己在第一步安装OpenCV中选择的目录进行选定
3)配置动态链接库:
我们可以查看步骤2)中添加的库文件目录下面.lib文件列表,发现在3.1.0版本的OpenCV中,仅剩下两个库文件,分别是:opencv_world310.lib和opencv_world310d.lib,这里两个库文件的区别就是:opencv_world310.lib是Release模式版本,而opencv_world310d.lib是Debug模式版本:
跟上述两个步骤相似,在属性界面中打开Linker(链接库)—>Input(输入)—>Additional Dependencies(添加依赖):
将我们刚刚在OpenCV库文件目录下看到的两个库文件其中一个添加到这里(根据模式需求Release模式或Debug模式):
3、实践:
在完成了上述所有配置工作之后,我们需要进行一次实测,用于验证以上配置是否成功。这里我们的测试demo功能很简单,就是在一个窗口中显示我们指定的一张图片。在之前的Main.cpp文件中添加以下代码:
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespacecv;
int main(){
// 读入一张图片(游戏原画)
Mat img = imread("pic.jpg");
// 创建一个名为 "游戏原画"窗口
namedWindow("游戏原画");
// 在窗口中显示游戏原画
imshow("游戏原画",img);
// 等待6000 ms后窗口自动关闭
waitKey(6000);
}
将图片pic.jpg复制到工程目录下面,与源码位于同一目录:
运行工程,假如一切都正常的话,会出现如下结果:
4、可能出现的问题:
1.运行程序时,发现编译不通过,报一下错误:
这个错误出现的原因是:我们之前说过在VS2015中不能进行32位的OpenCV的编译,而且我们整个配置过程都是针对于64位系统而进行的,那么我们要如何才能让VS 2015运行64的调试模式呢,其实很简单,在工具栏中切换一下就好:
2.无法加载图片,提示指针越位:
出现这个问题一般可能有两个原因:
一是图片后缀名不对或者是目录存放位置不正确;
二是属性配置中的动态库配置中,带d和不带d的两个库文件配置情况与当前调试模式不对应,可以在解决方案中直接选中当前工程,右键进入属性面板,然后修改其Linker中的Additional Dependencies:
四、Dlib在VS2015上的详细安装教程
过程一:生成dlib.lib库文件
参考博客https://blog.csdn.net/dawnfox/article/details/77282246
Dlib库(官网http://dlib.net/)是一个基于C++开发的机器学习算法的工具库,广泛应用在机器人、嵌入式设备、移动手机和高性能计算设备中,以用于解决实际问题。
1、准备工作,去dlib官网下载最新库,因为库需要C++11的支持,如果vs2015是老版本也需要更新一下,只有最新的版本支持的才算好,我用的版本为Update3版本。
2、下载CMake版本为cmake-3.9.1-win64-x64
3、解压下载的库文件我是放在D:\privatefiles\dlibMake19.8
图1
4、进入正题,使用CMAKE来生成dlib.lib库,运行cmake-gui出现下面窗口。
标注1为dlib源码文件中的dlib文件夹。如我在此处选择D:\private files\dlibfiles\dlib-19.8
标注2为选择将源码文件编译后的文件的位置。D:\private files\dlibMake19.9
完成标注1和2后,选中标注3。出现图3。
图2
图3
5、图3中标注5可进行选择编译器,此处选择已安装好的visual studio2014 64位,默认不选择的话是visual studio32位。32位版本也是在此处选择,重复64位的安装步骤即可。下面配置选择默认,不更改。
等待配置结束出现图4红字。
图4
6、图4中的底部信息会有部分警告文字,不影响。不改动红色字体参数设置。
点击图4的Generate等待直至红色字变成黑白字体。出现图5。
图5
运行结束后可能会提示CUDA没找到,有一些示例用到,目前我的还没用我就没管,如果想安装也可以cuda_9.1.85_win10.exe比较大有点心理准备呵呵,这个是软件使用显卡加速。
7、进入刚才自己创建的编译目录,眼前一亮吧
图6
点击图5的open project。调用visualstudio2015打开配置完成后的项目工程。
出现图7左侧小图。图6右侧小图为编译后的工程图。
图7
如果文件夹下没有vs2015的工程文件,可直接点击cmake打开工程即可会自动生成。
8、点击dlib属性页。需要注意的地方有两处。
一是配置属性》c/c++》常规中的附加包含目录,需要添加dlib解压文件dlib目录中external中的libjpeg,libpng,zlib三个文件目录。如
图8
二是配置属性》c/c++》预处理器中的预处理器定义。需要注意是否存在
DLIB_JPEG_SUPPORT
DLIB_PNG_SUPPORT
DLIB_JPEG_STATIC
这三个参数。如图9
图9
9、完成上述操作后。重新编译项目生成dlib.lib文件,在release或debug下生成了dlib.ilb库文件名字可以自己随便改,推荐使用release模式,程序在运行过程中更加流畅。
过程二:验证dlib.lib是否正确
期待结果:写个c程序,调用dlib库文件,检测图片人脸的特征点。
10、下面开始建立示例工程
使用vs2015 新建win32控制台应用程序,C++空的项目,然后新建源文件main.cpp。
11、工程-右键-属性添加dlib目录
D:\private files\dlibfiles\dlib-19.8
D:\privatefiles\dlibfiles\dlib-19.8\dlib\external\libpng
D:\privatefiles\dlibfiles\dlib-19.8\dlib\external\libjpeg
D:\privatefiles\dlibfiles\dlib-19.8\dlib\external\zlib
12、C/C++预处理器添加定义
DLIB_PNG_SUPPORT
DLIB_JPEG_SUPPORT
DLIB_JPEG_STATIC
13、链接器将输入添加dlib.lib,并把dlib.lib考入工程的目录中
14、到此所有配置已完毕直接编译示例即可。
示例1:
#include"dlib\image_processing\frontal_face_detector.h"
#include "dlib\image_io.h"
using namespace dlib;
void TestFaceDetect(const char *filename)
{
frontal_face_detectordetector = get_frontal_face_detector();
array2d<unsignedchar> img;
load_image(img,filename);
std::vector<rectangle>dets = detector(img);
printf("Numberof face detectd:%d\n",dets.size());
}
int main()
{
constchar *filename = "1.jpg";
TestFaceDetect(filename);
system("pause");
return0;
}
示例2:
#pragmacomment(linker, "/subsystem:windows/entry:mainCRTStartup")//去除CMD窗口
#include<dlib/opencv.h>
#include<opencv2/opencv.hpp>
#include<dlib/image_processing/frontal_face_detector.h>
#include<dlib/image_processing/render_face_detections.h>
#include<dlib/image_processing.h>
#include<dlib/gui_widgets.h>
#defineACC_NOW 1
usingnamespace cv;
usingnamespace cv::ml;
usingnamespace dlib;
usingnamespace std;
int main()
{
string win_delaunay = "DelaunayTriangulation";
ShowCursor(false);
namedWindow(win_delaunay, CV_WINDOW_NORMAL);
setWindowProperty(win_delaunay, CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
try
{
cv::VideoCapture cap(0);
if (!cap.isOpened())
{
cerr <<"Unable to connect to camera"<< endl;
return 1;
}
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
// Load face detection and pose estimationmodels.
frontal_face_detector detector =get_frontal_face_detector();
shape_predictor pose_model;
deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model;
cv::Mat frame;
// Grab and process frames until the mainwindow is closed by the user.
while (cv::waitKey(30) != 27)
{
// Grab a frame
cap >> frame;
Mat dstImage;
resize(frame, dstImage, Size(frame.cols / ACC_NOW, frame.rows / ACC_NOW), 0, 0, INTER_LINEAR);
cv_image<bgr_pixel> cimg(dstImage);
cout << frame.cols <<"|"<< frame.rows << endl;
double t = (double)cvGetTickCount();
// Detect faces
std::vector<dlib::rectangle> dets = detector(cimg);
t = ((double)cvGetTickCount() - t) / (cvGetTickFrequency()* 1000);
cout <<"Number of faces detected: "<< dets.size() <<"Time:"<< t <<"ms"<< endl;
String str = cv::format("Faces:%d", dets.size());
putText(frame, str, cv::Point(20, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(255, 255, 255), 1, LINE_AA);
for (int m = 0; m < dets.size(); m++)
{
full_object_detection shape = pose_model(cimg, dets[m]);
for (int i = 0; i < 68; i++) {
circle(frame,cvPoint(shape.part(i).x(), shape.part(i).y()), 2, cv::Scalar(255, 0, 0), -1);
}
}
// Find the pose of each face.
imshow(win_delaunay, frame);
waitKey(30);
}
}
catch (serialization_error& e)
{
cout <<"You need dlib's default face landmarking model fileto run this example."<< endl;
cout <<"You can get it from the following URL: "<< endl;
cout <<" http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2"<< endl;
cout << endl << e.what() << endl;
}
catch (exception& e)
{
cout << e.what() << endl;
}
}
可是实时看到人脸的68个特征点,上述现象表明dlib.lib库文件的确安装完毕。
利用Dlib库检