javacv配置+javacv人脸识别代码
这篇文章及其作者均属入门级,有错请指出,谢谢。
本机操作系统是window 7 64位
个人觉得,Javacv的作用相当于opencv的头文件,提供java语言版opencv函数库。一大堆的函数放在几个类中,供调用。
1. 准备
配置opencv动态库
(/index.php/VC_2010%E4%B8%8B%E5%AE%89%E8%A3%85OpenCV2.4.4,在“三,配置VS2010”之前的步骤),另一种方法是将要配的opencv环境变量目录下的DLL文件全部复制到C盘下Windows下的System32中
配置eclipse+javacv,
下载eclipse。
下载javacv(le/p/javacv/downloads/detail?name=javacv-0.6-bin.zip)链接是0.6版的,opencv也要是最新版的.即现在的2.4.6
在eclipse新建项目“T”,
解压出Javacv
导入javacv中的包到eclipse工程项目中(4个即可javacpp.jar, javacv.jar,javacv-windows-x86.jar 和javacv-windows-x86_64.jar)
新建class“T”,
import lecode.javacv.cpp.opencv_core.*;
import lecode.javacv.cpp.opencv_highgui.*;
public class B {
public static void main(String[] args) {
IplImage srcImg=cvLoadImage("D:\\lena.jpg");
cvNamedWindow("Test");
cvShowImage("Test",srcImg);
cvWaitKey(0);
cvReleaseImage(srcImg);
cvDestroyWindow("Text");
}
}
粘贴代码,运行。
如出错或无法运行主要有两原因:
1)Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\User\AppData\Local\Temp\javacpp2057959839616\jniopencv_core.dll: %1 不是有效的 Win32 应用程序。at java.lang.ClassLoader$NativeLibrary.load(Native Method)
如上,如果系统变量配置正确的话,很可能是版本的问题,如果你是64位的话,eclipse,opencv配置都要是64位的,32位同理。
2)如果是导入包有错的话
如
Windows-->Preference-->java-->compiler-->errors/warnings-->Deprecated and restricted API-->Forbidden reference(access rules) 将Error改为warning
2.程序过程
1) 打开摄像头,获得图像
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(filename);
grabber.start();
pFrame = ab();
2)人脸检测及识别
CvHaarClassifierCascade cascade = new CvHaarClassifierCascade(cvLoad("data\\haarcascade_l"));
while(pFrame!=null){
pFrame = ab();
detectAndCropAndPre( pFrame,cascade);//侦测,获取和识别脸部图片 cvShowImage("BP_FaceRecognizer_RecognizerFromVideos",pFrame);
pFrame = ab();
keypress=cvWaitKey(1);
if( keypress== 27 )//||second==60
break;
}
private boolean detectAndCropAndPre(IplImage src,CvHaarClassifierCascade cascade){
int nearest=0;
IplImage greyImg=null;
IplImage faceImg=null;
IplImage sizedImg=null;
IplImage equalizedImg=null;
boolean faceIsTrue=false;
CvRect r ;
CvFont font = new CvFont(CV_FONT_HERSHEY_COMPLEX_SMALL, 1, 1);
cvInitFont(font,CV_FONT_HERSHEY_COMPLEX_SMALL, 1.0, 0.8,1,1,CV_AA);
greyImg = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 );
greyImg=convertImageToGreyscale(src);
CvMemStorage storage = ate();
CvSeq sign = cvHaarDetectObjects(
greyImg,
cascade,
rectangle函数opencv storage,
1.1,
3,
flag);
cvClearMemStorage(storage);
if(al()>0)
{
for(int i=0;i&al();i++){
r = new CvRect(cvGetSeqElem(sign, i));
faceImg = cropImage(greyImg, r); //图像预处理
sizedImg = resizeImage(faceImg, 60, 80);//图像预处理
if(i==0)
equalizedImg = cvCreateImage(cvGetSize(sizedImg), 8, 1);
cvEqualizeHist(sizedImg, equalizedImg);
cvRectangle (
src,
cvPoint(r.x(), r.y()),
cvPoint(r.width() + r.x(), r.height() + r.y()),
CvScalar.WHITE,
1,
CV_AA,
0);
}
}
/*识别*/
eigenDecomImg(equalizedImg);//调用函数,作用为将源图片与已经存好脸部图片比较,得出
//相似率,重新赋值g_confidence及textName详见下载文件
g_confidence=(int)Math.round(g_confidence * 100);
if(g_confidence>70)//相似率得为70%
faceIsTrue=true;
else
faceIsTrue=false;
cvPutText(src, textName,cvPoint(r.x()-10, r.y() + r.height() + 20), font, CvScalar.RED);
cvPutText(src, " conf="+g_confidence+"%",cvPoint(r.x()-10, r.y() + r.height() + 40), font, CvScalar.RED);
textName="unknow";
g_confidence=0.0f;
r.setNull();
}
}
cvReleaseImage(greyImg);
cvReleaseImage(faceImg);
cvReleaseImage(sizedImg);
cvReleaseImage(equalizedImg);
}
return faceIsTrue;
3.总结
之前都是用C++写的,用JAVA注意的就是空指针问题,别忘记new一个对象出来才能用,还有这个识别率不高,仅供参考
Download可以到CSD n 搜”javacv人脸识别”
因为是集成的软件界面,别忘了把swt.jar也导入项目中去。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论