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
下载javacvle/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.jarjavacv-windows-x86.jar javacv-windows-x86_64.jar
新建classT”,
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");               
    }
}
粘贴代码,运行。
如出错或无法运行主要有两原因:
1Exception 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_confidencetextName详见下载文件
                    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小时内删除。