Java使用opencv提取人脸后获得LBP图像

结果大概是这样:
原本的图片如果是这样的:

那么提取人脸之后是这样的:

然后计算LBP图像是这样的:

因为项目中设计到服务器信息, 没有托管代码, 核心的LBP处理代码如下:

    public int[] getLbpHistogram(Mat face){
        Mat lbpface = new Mat(new Size(198,198), CvType.CV_32SC3);
        int width = face.width();
        int height = face.height();
        //initialize the lbp histogram
        int[] lbpHistogram = new int[256];
        Arrays.fill(lbpHistogram,0);
        for(int i = 0; i<width; i++){
            for(int j = 0;j<height; j++){
                //boundary solution
                if(i==0||j==0||i==width-1||j==height-1){
                    lbpface.put(i,j,new int[]{0,0,0});
                    continue;
                }
                int l = 0;
                if(face.get(i-1,j-1)[0]>face.get(i, j)[0]) l+=1<<7;
                if(face.get(i-1,j)[0]>face.get(i, j)[0]) l+=1<<6;
                if(face.get(i-1,j+1)[0]>face.get(i, j)[0]) l+=1<<5;
                if(face.get(i,j+1)[0]>face.get(i, j)[0]) l+=1<<4;
                if(face.get(i+1,j+1)[0]>face.get(i, j)[0]) l+=1<<3;
                if(face.get(i+1,j)[0]>face.get(i, j)[0]) l+=1<<2;
                if(face.get(i+1,j-1)[0]>face.get(i, j)[0]) l+=1<<1;
                if(face.get(i,j-1)[0]>face.get(i, j)[0]) l+=1;
                //fill the lbp image
                lbpface.put(i, j, new int[]{l,l,l});
                //calc the lbp histogram
                lbpHistogram[l]++;
            }
        }
            Imgcodecs.imwrite("out.jpg",lbpface);
        return lbpHistogram;
    }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java使用OpenCV实现人脸识别,需要以下几个步骤: 1.下载安装OpenCV库 首先需要下载并安装OpenCV库,可以到官方网站https://opencv.org/releases/下载适合自己环境的版本,然后按照安装指南进行安装。 2.导入OpenCV库 在Java项目中,需要使用OpenCV库的功能,需要将OpenCV库导入到项目中。具体导入方式可以查看OpenCV官方文档https://docs.opencv.org/3.4/d9/df8/tutorial_root.html。 3.载入训练好的人脸分类器 OpenCV提供了一些训练好的人脸分类器,可以用来检测人脸。可以在OpenCV库中找到这些分类器文件,然后使用Java代码将其载入。 4.读取图片或视频流 使用Java代码读取图片或视频流,可以使用OpenCV中提供的Imgcodecs类进行图片读取,也可以使用VideoCapture类进行视频流读取。 5.使用人脸分类器检测人脸 使用OpenCV中提供的CascadeClassifier类,将训练好的人脸分类器载入,并使用detectMultiScale方法在图片或视频流中检测人脸。 6.标记人脸并显示 使用Java代码标记出检测到的人脸位置,并将结果显示在图片或视频流中。 下面是一个简单的Java代码示例: ``` import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.objdetect.CascadeClassifier; public class FaceDetection { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 载入人脸分类器 CascadeClassifier faceDetector = new CascadeClassifier("haarcascade_frontalface_alt.xml"); // 读取图片 Mat image = Imgcodecs.imread("test.jpg"); // 检测人脸 MatOfRect faceDetections = new MatOfRect(); faceDetector.detectMultiScale(image, faceDetections); // 标记人脸并显示 for (Rect rect : faceDetections.toArray()) { Imgproc.rectangle(image, rect.tl(), rect.br(), new Scalar(0, 255, 0), 3); } Imgcodecs.imwrite("result.jpg", image); } } ``` 在这个示例中,我们载入了一个人脸分类器文件"haarcascade_frontalface_alt.xml",然后读取了一张图片"test.jpg",使用人脸分类器检测人脸,并标记人脸位置,并将结果保存在"result.jpg"中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值