Solaris下人脸识别程序(OpenCV linux 多线程版本)
2013-05-09 14:48
429 查看
一、Solaris下OpenCV工具安装
1. 选择OpenCV的linux版本OpenCV2.2,链接地址为http://www.opencv.org.cn/download/OpenCV-2.2.0.tar.bz2,下载后解压并放到linux目录下。
2. OpenCV2.2的编译需要借助cmake工具,cmake下载的链接地址为
http://www.cmake.org/cmake/resources/software.html,下载后解压并上传到Solaris中。
Cmake工具的安装分为3步骤
首先./configure 这时可以选择安装目录 --prefix=/usr/local/cmake
然后make编译
最后make install安装到Solaris系统中
在安装后发现cmake命令还是用不了,这时一方面检查/usr/local/bin中是否有cmake命令,另一方面可以重新登录看是否能用。
3.进入OpenCV的解压目录,输入cmake命令
会出现如下错误提示
该提示为cc命令的问题
在solaris中cc命令是没有安装无法使用的,为了解决这一问题,将gcc链接到cc命令上,使得cc不再没有意义,编译过程利用cc能够顺利完成。
3. 接着输入命令”cmake .”,提示配置完毕后,可以看到OpenCV目录下多个很多文件包括Makefile文件。
4. 输入make进行编译。在编译过程中可能会出现错误提示如下
这个问题可以通过在CMakeList.txt文件中的C_Flags参数中加入-std=c99解决,在文件的变量EXTRA_C_FLAGS中添加CFlags参数。
此外在编译过程中还可能出现pthread的警告,经分析,这是因为在Solaris下面引入pthread库的名称略有不同,改为pthreads就可以了。
5. 这样基本就可以将OpenCV编译完成。紧接着输入命令
make install完成OpenCV到系统的安装。
二、人脸识别程序编译、运行
1. 首先编写人脸识别程序,和在Windows下基本相同。需要注意的是Solaris下面的可能会缺少某些库,如在遍历目录子文件时,如果缺少io.h则需要采用其他方法替代。
2. 编译
3.运行 ./FaceDetect
首先配置OpenCV到环境变量
第一次运行时,又发现了一个严重的问题,即png库的冲突,直接导致png
图片的加载失败。警告信息提示如下:
解决这个问题的步骤:
首先发现目前的Solaris系统下面没有libpng-1.4.3,于是下载安装了一个。安装
到的路径为
然后将usr/include /usr/lib /usr/bin 下面与png有关的链接全部链接到1.4.3这个
版本上面来,这个过程有点曲折,有时候容易因为链接设置失误,而出错。
这些系统里的需要手动更改,指向1.4.3版本。
重新运行./FaceDetect结果如下
明显处理png时不再有警告了。
在另一台solaris上面配置环境发现又有了新的错误。以下是新错误补充:
首先是cc和CC的问题,由于系统默认cc和CC用的是Sun的版本,而不是gnu版本,会导致编译时出现语法的错误,也会出现c99的问题。
我的解决方法就是将cc和CC分别链接到系统中的gcc和g++(我的gcc和g++都在/usr/local/bin下面)。
然后重新cmake, make ,make install。然而在后面又发现如下错误:
该错误是关于python的问题,由于我们并没有使用python,可以利用cmake直接关掉,命令如下:
cmake -D BUILD_NEW_PYTHON_SUPPORT=NO .
附上人脸识别程序,输入为文件夹,输出为对应的人脸识别结果,格式为图片名,是否有人脸,图像长度,图像宽度
1. 选择OpenCV的linux版本OpenCV2.2,链接地址为http://www.opencv.org.cn/download/OpenCV-2.2.0.tar.bz2,下载后解压并放到linux目录下。
2. OpenCV2.2的编译需要借助cmake工具,cmake下载的链接地址为
http://www.cmake.org/cmake/resources/software.html,下载后解压并上传到Solaris中。
Cmake工具的安装分为3步骤
首先./configure 这时可以选择安装目录 --prefix=/usr/local/cmake
然后make编译
最后make install安装到Solaris系统中
在安装后发现cmake命令还是用不了,这时一方面检查/usr/local/bin中是否有cmake命令,另一方面可以重新登录看是否能用。
3.进入OpenCV的解压目录,输入cmake命令
会出现如下错误提示
该提示为cc命令的问题
在solaris中cc命令是没有安装无法使用的,为了解决这一问题,将gcc链接到cc命令上,使得cc不再没有意义,编译过程利用cc能够顺利完成。
3. 接着输入命令”cmake .”,提示配置完毕后,可以看到OpenCV目录下多个很多文件包括Makefile文件。
4. 输入make进行编译。在编译过程中可能会出现错误提示如下
这个问题可以通过在CMakeList.txt文件中的C_Flags参数中加入-std=c99解决,在文件的变量EXTRA_C_FLAGS中添加CFlags参数。
此外在编译过程中还可能出现pthread的警告,经分析,这是因为在Solaris下面引入pthread库的名称略有不同,改为pthreads就可以了。
5. 这样基本就可以将OpenCV编译完成。紧接着输入命令
make install完成OpenCV到系统的安装。
二、人脸识别程序编译、运行
1. 首先编写人脸识别程序,和在Windows下基本相同。需要注意的是Solaris下面的可能会缺少某些库,如在遍历目录子文件时,如果缺少io.h则需要采用其他方法替代。
2. 编译
3.运行 ./FaceDetect
首先配置OpenCV到环境变量
第一次运行时,又发现了一个严重的问题,即png库的冲突,直接导致png
图片的加载失败。警告信息提示如下:
解决这个问题的步骤:
首先发现目前的Solaris系统下面没有libpng-1.4.3,于是下载安装了一个。安装
到的路径为
然后将usr/include /usr/lib /usr/bin 下面与png有关的链接全部链接到1.4.3这个
版本上面来,这个过程有点曲折,有时候容易因为链接设置失误,而出错。
这些系统里的需要手动更改,指向1.4.3版本。
重新运行./FaceDetect结果如下
明显处理png时不再有警告了。
在另一台solaris上面配置环境发现又有了新的错误。以下是新错误补充:
首先是cc和CC的问题,由于系统默认cc和CC用的是Sun的版本,而不是gnu版本,会导致编译时出现语法的错误,也会出现c99的问题。
我的解决方法就是将cc和CC分别链接到系统中的gcc和g++(我的gcc和g++都在/usr/local/bin下面)。
然后重新cmake, make ,make install。然而在后面又发现如下错误:
该错误是关于python的问题,由于我们并没有使用python,可以利用cmake直接关掉,命令如下:
cmake -D BUILD_NEW_PYTHON_SUPPORT=NO .
附上人脸识别程序,输入为文件夹,输出为对应的人脸识别结果,格式为图片名,是否有人脸,图像长度,图像宽度
#include "cv.h" #include "highgui.h" #include <iostream> #include <string> #include <fstream> #include <vector> #include <dirent.h> //#include <sys/io.h> using namespace std; //由于是多线程版本,cascade和storage两个参数不能作为全局静态变量(静态变量会导致线程间共享变量,同时访问会出错) bool detect_and_draw( IplImage* img, CvHaarClassifierCascade* cascade, CvMemStorage* storage); //人脸检测函数 const char* cascade_name ="haarcascade_frontalface_alt.xml"; typedef struct param { //存放线程函数参数的结构体 string dirPath; //用户提供的目录,包含人脸识别图片 string outFileName; //输出判断结果路径 }param; void* thread_fun(void *arg) //线程函数 { CvHaarClassifierCascade* cascade = 0; CvMemStorage* storage = 0; cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); //加载人脸识别用到的分类器 if( !cascade ) { cerr << "ERROR: Could not load classifier cascade" << endl; return NULL; } storage = cvCreateMemStorage(0); param *p = (param *)arg; //线程函数的参数 string dir = p->dirPath; string outDir = dir + "/"; outDir += p->outFileName; ofstream out; out.open(outDir.c_str()); dir += "/homepageImg"; vector<string> gifpath, gifname; DIR *d; struct dirent *s_dir; d = opendir(dir.c_str()); while((s_dir=readdir(d)) != NULL) { string filename = s_dir->d_name; string filepath = dir + "/" + filename; if(filename != "." && filename != "..") { if(filename.find(".gif") == string::npos) { IplImage* image = cvLoadImage(filepath.c_str(),1); //加载图像 out << filename; if(!image) out << ",success" << endl; else { if(detect_and_draw(image, cascade, storage)) //如果识别成功 out << ",yes"; else out << ",no"; out << "," << image->width << "," << image->height; out << endl; cvReleaseImage(&image); #ifdef DEBUG //区分debug模式和非debug模式 cout << filepath << endl; #endif } } } } closedir(d); out.close(); return NULL; } int main() { string dir; cout << "input directory name:"; cin >> dir; string outFileName = "homepageImgResult.txt"; DIR *d; long lf; d = opendir(dir.c_str()); struct dirent *s_dir; vector<pthread_t> p; while((s_dir = readdir(d)) != NULL) { if(s_dir->d_name[0]== '.') continue; pthread_t temp; int ret; param *params = new param; //这里必须动态申请,如果是局部变量,会导致该层循环结束后,param空间被释放 params->dirPath = dir + "/"; params->dirPath += s_dir->d_name; params->outFileName = outFileName; ret = pthread_create(&temp, NULL, thread_fun, params); if(ret) { cerr << "Create Thread Error!" << endl; exit(1); } p.push_back(temp); } for(vector<pthread_t>::iterator it = p.begin(); it != p.end(); ++it) pthread_join(*it, NULL); //使主线程阻塞,直到所有子线程都执行完毕 closedir(d); return 0; } bool detect_and_draw( IplImage* img, CvHaarClassifierCascade* cascade, CvMemStorage* storage) { double scale = 1.3; IplImage* gray = cvCreateImage(cvSize(img->width,img->height), 8, 1);//这里格式比较固定 IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale), cvRound (img->height/scale)), 8, 1 ); cvCvtColor( img, gray, CV_BGR2GRAY ); cvResize( gray, small_img, CV_INTER_LINEAR ); cvEqualizeHist( small_img, small_img ); cvClearMemStorage( storage ); if(cascade) { CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 1.1, 2, 0 ,cvSize(30, 30) ); int facenum = faces ? faces->total : 0; if(facenum) { cvReleaseImage(&gray); cvReleaseImage(&small_img); return true; } } cvReleaseImage(&gray); cvReleaseImage(&small_img); return false; }
相关文章推荐
- Solaris下人脸识别程序(OpenCV)
- 图像处理--linux opencv2多线程人脸识别
- C++ Opencv人脸检测+分类器训练+识别 程序制作
- opencv常用函数—总结自人脸识别MFC程序
- OpenCV学习:人脸识别 简单程序
- 从零开始的C++ opencv的人脸识别程序——人脸检测
- Linux版本的 免费的人脸识别技术。
- c#调用c++程序(DLL方法,以及opencv,运行开源的人脸识别seetaface)
- 基于opencv的人脸识别程序
- Opencvtest 人脸识别程序 自学知识记录
- Linux版本的 免费的人脸识别技术。
- Linux版本的 免费的人脸识别技术。
- [OpenCv]在Ubuntu12.04中OpenCv-2.4.9的配置以及人脸识别程序的测试
- SmileyFace——基于OpenCV的人脸人眼检测、面部识别程序
- 打包windows 和 linux caffe 版本的人脸识别 人脸年龄估计 人脸性别模型的总结
- 从零开始的C++ opencv的人脸识别程序——第一个C++程序
- 基于opencv的人脸识别:分别在1.0和2.4.3版本下的对比
- TensorFlow实现人脸识别(1)------Linux下用opencv打开视频
- Opencv4Android人脸识别之opencv_contrib编译
- opencv 学习人脸识别