怎样使用OpenCV进行opencv人脸识别原理

21ic官方微信
您现在的位置是:
& 用OpenCV编写的人脸识别代码 立即下载
用OpenCV编写的人脸识别代码
无法下载?(暂不支持迅雷快车等下载工具)
成为21ic电子技术资料下载站VIP,可以免积分下载资料。节省赚积分时间,下载资料更快速、更便捷!
软 件 名 称OpenCV4Android--使用Java api做人脸识别_Linux编程_Linux公社-Linux系统门户网站
你好,游客
OpenCV4Android--使用Java api做人脸识别
来源:Linux社区&
作者:zhd320
在上有两种方法使用OpenCV,第一使用OpenCV提供好的库文件,然后调用OpenCV的java api来做图像处理。第二种是使用OpenCV的C++& api,但是需要ndk来创建动态库,然后Android工程间接调用动态库中的函数。
本文主要使用第一种方法,(关于环境的配置,网上很多,个人使用的是 ,其实如果单纯的使用第一种方法,cdt和ndk都不用安装,只需要解压opencv的ok了)
第一步,将opencv解压,拷贝sdk/java到eclipse工程文件夹下
第二步,导入工程,将java导入到eclipse工程中,修改配置(选择android api勾选is library)
api选择必须是11也就是3.0 以上,否则会报错。
--------------------------------------分割线 --------------------------------------
Linux下安装OpenCV2.4.1所需包
Ubuntu 12.04 安装 OpenCV2.4.2
下OpenCV无法读取视频文件
Ubuntu 12.04下安装OpenCV 2.4.5总结
Ubuntu 10.04中安装OpenCv2.1九步曲
基于QT和OpenCV的人脸识别系统
--------------------------------------分割线 --------------------------------------
第三步,建立自己的工程
修改配置,library add刚才添加的java工程即可。(也可修改project.properties文件在最后加上android.library.reference.1=../java,确保java工程和你新建的工程目录是同级的。若没有project.properties,那修改default.properties)
添加成功会出现以下图片,(java_src)
更多详情见请继续阅读下一页的精彩内容:
相关资讯 & & &
& (06月29日)
& (04月25日)
& (05月03日)
& (04月23日)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款java人脸识别在项目中的应用(一)
本例程是识别图片中的人脸,并画出识别出的人脸的位置。在网上找了很久,用java实现人脸识别技术很难找到。多是依靠JNI 调用OpenCV本地方法实现的。那么这里先来说说这种方法:
先认识一下JNI 和OpenCV
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
OpenCV是Intel公司支持的开源计算机视觉库。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。
将源代码中的dll文件(cv097.dll,cxcore097.dll,highgui097.dll,JNI2OpenCV.dll)放入C:\WINDOWS\system32目录下。
现在开始上源码:
public class JNIOpenCV{
public JNIOpenCV() {}
System.out.println("开始加载JNI2OpenCV.dll");
System.loadLibrary("JNI2OpenCV");
System.out.println("加载完成");
// 加载动态链接库
public native int[] detectFace(int minFaceWidth, int minFaceHeight, String cascade, String filename);
// 声明本地方法
public class FaceDetection {
private JNIOpenCV myJNIOpenCV;
public FaceDetection(String intputFileName,String outputFileName) {
myJNIOpenCV = new JNIOpenCV();
String filename = intputFileN
String outputFilename = outputFileN
String cascade = "F:\\detectface\\xml\\haarcascade_frontalface_alt2.xml";
int[] detectedFaces = myJNIOpenCV.detectFace(40, 40, cascade, filename);
int numFaces = detectedFaces.length / 4;
if(numFaces & 0){
System.out.println("有脸!有 "+ numFaces + " 张脸");
System.out.println("没有脸!");
for (int i = 0; i & numF i++) {
System.out.println("Face " + i + ": " + detectedFaces[4 * i + 0] + " " + detectedFaces[4 * i + 1] + " " + detectedFaces[4 * i + 2] + " " + detectedFaces[4 * i + 3]);
int[][] RectInt=new int[numFaces][4];
for (int i = 0; i & numF i++)
RectInt[i][0]=detectedFaces[4 * i + 0];
RectInt[i][1]=detectedFaces[4 * i + 1];
RectInt[i][2]=detectedFaces[4 * i + 2];
RectInt[i][3]=detectedFaces[4 * i + 3];
if(new DrawInImg(filename,outputFilename,RectInt).DrawRect())
System.out.println("File create success ! ");
System.out.println("File create error ! ");
public static void main(String args[]) {
FaceDetection myFaceDetection = new FaceDetection("F:\\detectface\\image\\tt.jpg","F:\\detectface\\image\\tt2.jpg");
import java.awt.C
import java.awt.G
import java.awt.image.BufferedI
import java.io.F
import java.io.FileInputS
import java.io.FileOutputS
import java.io.IOE
import javax.imageio.ImageIO;
public class DrawInImg {
private boolean isDone =
private String inputFileName = "";
private String outputFileName = "";
private int[][] RectI
public DrawInImg(String inputFileName, String outputFileName,
int[][] RectInt) {
this.inputFileName = inputFileN
this.outputFileName = outputFileN
this.RectInt = RectI
public boolean DrawRect() {
FileInputStream fis = new FileInputStream(inputFileName);
FileOutputStream fos = new FileOutputStream(outputFileName);
BufferedImage img = ImageIO.read(fis);
Graphics g = img.getGraphics();
g.setColor(Color.GREEN);
for (int i = 0; i & RectInt. i++) {
for (int j = 0; j & RectInt[i]. j++) {
g.drawRect(RectInt[i][0], RectInt[i][1], RectInt[i][2],
RectInt[i][3]);
// System.out.print(RectInt[i][j]+" ");
System.out.print("\r\n");
img.flush();
g.dispose();
ImageIO.write(img, "JPG", fos);
while (true) {
if (new File(outputFileName).exists()) {
this.isDone =
} catch (IOException ioe) {
return this.isD
注意:以上代码不能放在包下面,否则会运行不成功的。(原因是dll编译的时候没有带上包,如需包还需重新编译dll)。
文章评论 以下网友留言只代表其个人观点,不代表本网站的观点和立场。OpenCV实现人脸检测 - 圣骑士wind - 博客园
随笔 - 369, 文章 - 8, 评论 - 434, 引用 - 0
本文介绍最基本的用OpenCV实现人脸检测的方法。
一.人脸检测算法原理
Viola-Jones人脸检测方法
参考文献:Paul Viola, Michael J. Jones. Robust Real-Time Face Detection[J]. International Journal of Computer Vision,):137-154.
该算法的主要贡献有三:
1.提出积分图像(integral image),从而可以快速计算Haar-like特征。
2.利用Adaboost学习算法进行特征选择和分类器训练,把弱分类器组合成强分类器。
3.采用分类器级联提高效率。
二.OpenCV检测原理
OpenCV中有检测人脸的函数(该函数还可以检测一些其他物体), 甚至还包含一些预先训练好的物体识别文件。
所以利用这些现成的东西就可以很快做出一个人脸检测的程序。
主要步骤为:
1.加载分类器。
用cvLoad函数读入xml格式的文件。文件在OpenCV安装目录下的&data/haarcascades/&路径下。
推荐使用haarcascade_frontalface_atl.xml和haarcascade_frontalface_atl2.xml
2.读入待检测图像。读入图片或者视频。
3.检测人脸。
主要用的函数:
CvSeq* cvHaarDetectObjects(
const CvArr* image,
CvHaarClassifierCascade* cascade,
CvMemStorage* storage,
double scale_factor CV_DEFAULT(1.1),
int min_neighbors CV_DEFAULT(3),
int flags CV_DEFAULT(0),
CvSize min_size CV_DEFAULT(cvSize(0,0)),
CvSize max_size CV_DEFAULT(cvSize(0,0))
函数说明摘自《学习OpenCV》:
CvArr* image是一个灰度图像,如果设置了ROI,将只处理这个区域。
CvHaarClassifierCascade* cascade是前面读入的分类器特征级联。
CvMemStorage* storage 是这个算法的工作缓存。
scale_factor :算法用不同尺寸的窗口进行扫描,scale_factor是每两个不同大小的窗口之间的尺寸关系。
min_neighbors 控制误检测,因为人脸会被不同位置大小的窗口重复检测到,至少有这么多次检测,我们才认为真的检测到了人脸。
flags有四个可用的数值,它们可以用位或操作结合使用。默认值是CV_HAAR_DO_CANNY_PRUNING,告诉分类器跳过平滑区域。
min_size 指示寻找人脸的最小区域。max_size 显然应该是寻找人脸的最大区域了。。。
4.检测结果表示。
可以画个圈圈或者画个方框表示。
#include "cv.h"
#include "highgui.h"
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#include &assert.h&
#include &math.h&
#include &float.h&
#include &limits.h&
#include &time.h&
#include &ctype.h&
#ifdef _EiC
#define WIN32
static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade = 0;
void detect_and_draw( IplImage* image );
const char* cascade_name =
"haarcascade_frontalface_alt.xml";
"haarcascade_profileface.xml";*/
int main( int argc, char** argv )
cascade_name = "haarcascade_frontalface_alt2.xml";
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
if( !cascade )
fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
return -1;
storage = cvCreateMemStorage(0);
cvNamedWindow( "result", 1 );
const char* filename = "Lena.jpg";
IplImage* image = cvLoadImage( filename, 1 );
if( image )
detect_and_draw( image );
cvWaitKey(0);
cvReleaseImage( &image );
cvDestroyWindow("result");
void detect_and_draw(IplImage* img )
double scale=1.2;
static CvScalar colors[] = {
{{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},
{{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}}
};//Just some pretty colors to draw with
//Image Preparation
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); //直方图均衡
//Detect objects if any
cvClearMemStorage(storage);
double t = (double)cvGetTickCount();
CvSeq* objects = cvHaarDetectObjects(small_img,
0/*CV_HAAR_DO_CANNY_PRUNING*/,
cvSize(30,30));
t = (double)cvGetTickCount() -
printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
//Loop through found objects and draw boxes around them
for(int i=0;i&(objects? objects-&total:0);++i)
CvRect* r=(CvRect*)cvGetSeqElem(objects,i);
cvRectangle(img, cvPoint(r-&x*scale,r-&y*scale), cvPoint((r-&x+r-&width)*scale,(r-&y+r-&height)*scale), colors[i%8]);
for( int i = 0; i & (objects? objects-&total : 0); i++ )
CvRect* r = (CvRect*)cvGetSeqElem( objects, i );
center.x = cvRound((r-&x + r-&width*0.5)*scale);
center.y = cvRound((r-&y + r-&height*0.5)*scale);
radius = cvRound((r-&width + r-&height)*0.25*scale);
cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
cvShowImage( "result", img );
cvReleaseImage(&gray);
cvReleaseImage(&small_img);
四.结果及一些说明
运行结果如下图:
需要说明的几点:
1.图像和.xml文件要放在该程序的bin目录下(.sln所在的目录)。
2.《学习OpenCV》里面就是用矩形表示,但是书里面的代码不太对,原因是忽略了缩放因子,即void detect_and_draw(IplImage* img )里面的double scale=1.2;
这个缩放因子的作用是:拿到一个图像,首先将它缩放(scale=1.2即变为一个小图像),然后在缩放后的小图像上检测人脸,这样会比较快。
最基本的就这么多吧。
注:本文所用OpenCV版本为2.3.1

我要回帖

更多关于 opencv人脸识别原理 的文章

 

随机推荐