当前位置: 首页 > web >正文

基于OpenCv做照片分析应用一(Java)

前言

       这里今天遇到的场景是前端打印一个pdf文件,右上角里面嵌入一个照片。照片嘛,肯定因为个体差异,机器拍出来的位置肯定是可能有瑕疵,需要人为干预剪裁,这样那里迁入的才好看。虽然pdf是设备上自己组装的,但是因为某些原因,这里需要后端吃亏处理下。


一、具体情况

  • 照片在七牛云按流量上传、下载双向收费。
  • 接口是纯数据接口,返回的数据是pdf上的数据,照片是七牛云的url。

二、分析

       因为嵌入的图片主要是要有人脸,且不能比例不能压缩,不然图像变形,审核业务要是遇到较真的人,那狠难受。
       这里跟设备端写WPF的沟通,跟我们后端梳理业务接口后,因为照片文件大小、存储机制、网络带宽等问题,确定这块工作在设备端WPF处理最好,但是很多时候有点事与愿违。我大java大度点,退一步,处理好坐标,在接口里返回,WPF端自己按照坐标剪切。
       具体代码我就不再重复了,可以见上一篇分享的基于OpenCv做照片分析
这里就实现继续再上次的测试类里定义一个方法,在具体实现体现逻辑吧。

三、思路

  • 定位到照片的人脸
  • 根据基于openVC检测到的人脸的第一个点位,做计算
  • 取4个点位(截取的具体点位)

1.PhotoInfo

代码如下(示例):


import lombok.Data;import java.util.List;/*** @author zwmac*/
@Data
public class PhotoInfo {private List<PhotoCropPoint>  photoCropPointList;
}

2.PhotoCropPoint


import lombok.Data;/*** @author zwmac*/
@Data
public class PhotoCropPoint {private Integer xPoint;private Integer yPoint;
}

3.IOpenCvService增加方法

/*** 定位并计算指标* @param faceFile* @return*/List<PhotoCropPoint> analyzeCropPointList(File faceFile,String cascadeName);

4.analyzeCropPointList方法实现

@Overridepublic List<PhotoCropPoint> analyzeCropPointList(File imageFile, String cascadeName) {List<PhotoCropPoint> photoCropPointList = new ArrayList<>();//读取检测项图片Mat src = Imgcodecs.imread(imageFile.getAbsolutePath());if (!src.empty()) {//灰度化Mat gray = new Mat();Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);//加载训练好的检测模型CascadeClassifier classifier = OpenCVUtil.getCascade(cascadeName);Assert.notNull(classifier, "模型:" + cascadeName + "加载失败");//检测检测项MatOfRect matOfRect = new MatOfRect();classifier.detectMultiScale(gray, matOfRect);//判断检测结果if (matOfRect.toArray().length != 0) {// 5. 打印检测到的矩形框Rect[] rects = matOfRect.toArray();for (Rect rect : rects) {//int x = rect.x;//int y = rect.y;//int width = rect.width;//int height = rect.height;//-120可调整,这里的依据是人肩宽平均值再45 + 手臂展开预估宽度int x = rect.x - 120;//-60是人脸识别在人头上移高度int y = rect.y - 60;int width = rect.width + 240;//我们这里拍出来的照片是640 * 480的int height = 480 - y;System.out.println("x=" + x + ", y=" + y +", width=" + width + ", height=" + height);// 在原图上画矩形Imgproc.rectangle(src,new Point(x, y),new Point(x + width, y + height),new Scalar(0, 255, 0), 2);PhotoCropPoint  photoCropPoint = new PhotoCropPoint();photoCropPoint.setXPoint(x);photoCropPoint.setYPoint(y);photoCropPointList.add(photoCropPoint);PhotoCropPoint  photoCropPoint2 = new PhotoCropPoint();photoCropPoint2.setXPoint(x);photoCropPoint2.setYPoint(height);photoCropPointList.add(photoCropPoint2);PhotoCropPoint  photoCropPoint3 = new PhotoCropPoint();photoCropPoint3.setXPoint(x + width);photoCropPoint3.setYPoint(y);photoCropPointList.add(photoCropPoint3);PhotoCropPoint  photoCropPoint4 = new PhotoCropPoint();photoCropPoint4.setXPoint(x + width);photoCropPoint4.setYPoint(height);photoCropPointList.add(photoCropPoint4);}// 6. 保存结果图String resultTime = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss");String resultPath = "/Users/zwmac/Downloads/test/result_" + resultTime + ".jpg";Imgcodecs.imwrite(resultPath, src);System.out.println("结果已保存: " + resultPath);}}return photoCropPointList;}

四、效果

在这里插入图片描述


总结

  • 没有弱语种,只有弱人
  • team也很重要
  • 纯粹证明我大java有这个能力,不是我们做不了推脱
http://www.xdnf.cn/news/19478.html

相关文章:

  • 学习记录(二十二)--Overleaf中生成的PDF左上角1.5em问题
  • 【AI编程工具】使用Cursor快速搭建一套小型项目管理系统
  • Elasticsearch vs Solr vs OpenSearch:搜索引擎方案对比与索引设计最佳实践
  • 微服务的编程测评系统18-判题功能-Rabbitmq-用户拉黑
  • 7.2elementplus的表单布局与模式
  • 从零到一:使用anisble自动化搭建kubernetes集群
  • 代码随想录算法训练营五十三天|图论part11
  • 物理气相沉积(PVD)技术及应用现状和发展趋势
  • 【线性代数基础 | 那忘算9】基尔霍夫(拉普拉斯)矩阵 矩阵—树定理证明 [详细推导]
  • unity3d 中 R3 实际使用 安装方法
  • 7.3 el-menu
  • 螺旋曲面交线投影切线角度计算与分析
  • 深度学习数据加载实战:从 PyTorch Dataset 到食品图像分类全流程解析
  • React前端开发_Day11
  • 响应式编程框架Reactor【7】
  • Spring —— 数据源配置和注解开发
  • Uniapp 项目创建与目录结构解析
  • 网站漏洞早发现:cpolar+Web-Check安全扫描组合解决方案
  • Elasticsearch面试精讲 Day 3:分片与副本策略详解
  • Win32学习笔记 | recv函数
  • 【Linux系统】线程互斥
  • 【安全学习】DVWA 靶场 SQL 注入漏洞原理分析与防御策略(教育用途)
  • C#语言入门详解(17)字段、属性、索引器、常量
  • 微软:LLM多阶段强化学习框架
  • 深入探讨JavaScript性能瓶颈:我的优化实战与思考
  • mac Monterey 安装erlang23
  • 【数据分享】上市公司-创新投入、研发投入数据(2007-2022)
  • LeetCode 287.寻找重复数
  • 基于EcuBus-Pro实现LIN UDS升级
  • 动态规划2(c++)