工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程

news2024/11/20 13:00:47

一.背景

      公司是非煤采矿业,核心业务是采选,大型设备多,安全风险因素多。当下政府重视安全,头部技术企业的安全解决方案先进但价格不低,作为民营企业对安全投入的成本很敏感。利用我本身所学,准备搭建公司的安全管理技术平台,从视觉、传感等多方面配合,逐步将公司的生产安全管理技术平台搭建起来。也许在不久的未来,公司各层级都看到了技术的价值,会逐步过渡到一线品牌的安全产品上来,逐步推动生产安全技术在公司的应用。

      本文是安全帽的第二篇,用java简单调用OpenCV自带的面部检测器找到面部图片区域,了解整体java调用OpenCV的过程。

      本文建立在第一篇上面,请先阅读第一篇。工业生产安全-安全帽第一篇-opencv及java开发环境搭建-CSDN博客

二.思路分析

        我之前有一些目标检测、图像算法(大学时,全专业图形学数一数二,不过和专业的比起来,是菜鸟哈!!!)的粗浅经验。这里就先说说程序执行的思路。其实,很简单,就是图片准备=》检测器准备=》执行检测器=》拿结果后处理。

       图片准备,准确说是输入准备,一般都是图片,看具体的场景嘛!有的会处理成灰度图片或者二值化,具体的就看检测器的要求。

     检测器准备,形态说就是一个文件,一般是xml文件。这个文件从哪里来呢?这个就是我们平时说的模型训练的产物。不管是大模型、小模型,简单来说就是一堆数据(图片、文字、语音、文档等)丢进去,让训练器运行,得到一个结果文件。这个训练器的核心算法就决定了产物的水平,反正我个人不相信它们有智慧,我个人认为今天的人工智能发展虽然取得了很多成绩,但是与真正的智慧还有很远。当然,这并不影响我们使用它来解决一些问题。扯远了,拉回来。简单理解,检测器就是模型训练出来的产物,可以说是一个规则集,用来判断目标是否符合规则集,符合就找到了目标。

    执行检测器,这个就是一个语句,没有啥特别说的。

    结果后处理,一般来说,图片这种结果目标检测是给你一堆像素点,你自己想改个颜色、加个框框、涂个蒙版都可以,反正表示你检测到了结果嘛!

三.上代码

package com.scantt.opencv.demos.eyes;

import java.net.URL;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

public class FaceDetection {
	static {
		String path1 = ClassLoader.getSystemResource(Core.NATIVE_LIBRARY_NAME + ".dll").getPath();
		if (path1.startsWith("/")) {
			path1 = path1.substring(1);// windows系统有毒...jar包不认识 /开头这样的形式,如/c:/xx
		}
		System.load(path1);
	}

	public static void main(String[] args) {
		// 读取图像
		URL url = ClassLoader.getSystemResource("eyes/dongfang.jpg");
		String path = url.getPath();
		if (path.startsWith("/")) {
			path = path.substring(1);// windows系统有毒...jar包不认识 /开头这样的形式,如/c:/xx
		}
		Mat image = Imgcodecs.imread(path);

		// 转换为灰度图像
		Mat gray = new Mat();
		Imgproc.cvtColor(image, gray, Imgproc.COLOR_BGR2GRAY);

		// 加载面部检测器
		URL url2 = ClassLoader.getSystemResource("eyes/haarcascade_frontalface_default.xml");
		String path2 = url2.getPath();
		if (path2.startsWith("/")) {
			path2 = path2.substring(1);// windows系统有毒...jar包不认识 /开头这样的形式,如/c:/xx
		}
		CascadeClassifier faceDetector = new CascadeClassifier(path2);

		// 检测面部
		MatOfRect faceDetections = new MatOfRect();
		faceDetector.detectMultiScale(gray, faceDetections);

		// 遍历每个检测到的面部
		for (Rect rect : faceDetections.toArray()) {
			// 面部画个框
//			Imgproc.rectangle(image, rect, new Scalar(255, 0, 0), 2);
			// 面部画个圆
			Imgproc.circle(image, new Point(rect.x + rect.width / 2, rect.y + rect.height / 2), rect.width / 2,
					new Scalar(255, 0, 0));

		}

		// 显示结果
		HighGui.imshow("Eye Detection", image);
		HighGui.waitKey(0);
	}
}

图片dongfang.jpg,你随便找个包含人头像的,我是放到src/main/resources/eyes目录下的哦。

检测器文件haarcascade_frontalface_default.xml, 去OpenCV安装目录去找opencv\build\etc\haarcascades,我还是放到src/main/resources/eyes目录下的哦。

      我的检测结果是

    

四.后面干什么

      知道怎么调用检测器了,当然就是去找一个或者做一个安全帽的检测咯,先拿个别人的试试吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2244044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI人脸工具整合包及教程】Rope——重新定义你的数字形象!

引言 在这个数字时代,个人形象的重要性不言而喻。无论是社交媒体上的个人展示,还是商业活动中的品牌塑造,一个独特的形象都能让人眼前一亮。随着技术的发展,AI人脸技术逐渐从科幻走向现实,成为普通人也能轻松触及的技…

NLP论文速读(EMNLP 2024)|动态奖励与提示优化来帮助语言模型的进行自我对齐

论文速读|Dynamic Rewarding with Prompt Optimization Enables Tuning-free Self-Alignment of Language Models 论文信息: 简介: 本文讨论的背景是大型语言模型(LLMs)的自我对齐问题。传统的LLMs对齐方法依赖于昂贵的训练和人类偏好注释&am…

java CAS详解

java 中CAS是如何实现的? 在 Java 中,实现 CAS(Compare-And-Swap, 比较并交换)操作的一个关键类是Unsafe。 Unsafe类位于sun.misc包下,是一个提供低级别、不安全操作的类。由于其强大的功能和潜在的危险性&#xff0…

Gooxi受邀参加海通证券AI+应用生态大会,助力数智金融高质量发展

11月15日,由海通证券举办以”智算无界,共臻高远”为主题AI应用生态大会在上海圆满落幕。此次活动汇聚了众多人工智能领域的意见领袖、专家学者、优秀企业代表及资深投资人,共同探讨金融行业人工智能应用的前沿理论、最佳实践及发展趋势&#…

Python数据分析与可视化实验案例,所需数据已经绑定上传

大数据技术专业技能竞赛试卷 一、项目名称 农业肥料登记数据分析赛题 二、竞赛内容 赛项以大数据技术为核心内容,重点考查参赛选手数据清洗和数据分析的能力,结合Pandas和matplotlib图表展示数据。所有参赛学生在现场根据给定的项目任务,…

【竞技宝】LOL-传奇杯:姿态飞机TP绕后一锤定音

北京时间2024年11月19日,英雄联盟第二届传奇杯正在如火如荼的进行之中。昨天迎来小组赛第四个比赛日,本日一共进行了七场小组赛的对决,那么在昨日上半场的四场比赛中,登场的各支队伍都取得了什么样的表现呢?接下来小宝为大家带来小组赛day4上半场的比赛战报。 OP(宁王队) 0-1 …

qt之telnet连接目标设备在线调试功能

一、前言 在QT下使用telnet连接目标设备,进行在线命令调试,也可配合ftp或ssh使用。 telnet某些库在qt5下不可用,无法获取登录信息,只能获取到连接信息,这里我用自己的方式判断是否成功登录 二、环境 window qt5.7…

Android中常见内存泄漏的场景和解决方案

本文讲解Android 开发中常见内存泄漏场景及其解决方案,内容包括代码示例、原因分析以及最佳实践建议。 1. 静态变量导致的内存泄漏 静态变量的生命周期与应用进程一致,如果静态变量持有了对 Activity 或其他大对象的引用,就可能导致内存泄漏…

红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机 在之前的文章中红外相机和RGB相机标定:实现两种模态数据融合_红外相机标定-CSDN博客 ,介绍了如何利用标定板实现外参标定;但实测下来发现2个问题: (1)红外标定板尺寸问题,由于标定板小…

即插即用篇 | YOLOv11 引入高效的直方图Transformer模块 | 突破天气障碍:Histoformer引领高效图像修复新路径

本改进已同步到YOLO-Magic框架! 摘要:摘要。基于Transformer的恶劣天气图像修复方法取得了显著进展。大多数方法通过沿通道维度或在空间上固定范围的块内使用自注意力,以减少计算负担。然而,这种折中方式在捕获长距离空间特征方面…

ITSS服务经理: 山西科技学院智能铸造现代产业学院揭牌

记者从山西科技学院传来喜讯,近日,在该院工程训练中心与智能铸造现代产业学院于山西省晋城市泽州县绿色智能铸造创新产业园隆重举行的揭牌启动仪式上,标志着学院迈入崭新篇章。应用型本科高校,作为孕育高素质应用人才的摇篮&#…

AI时代:弯道超车的新思维与实践路径

文章目录 一、AI时代的机遇与挑战二、重新认识AI三、弯道超车的新思维四、实践路径与案例分享五、AI技术的未来发展趋势六、个人与企业如何适应AI时代《AI时代:弯道超车新思维》内容简介作者简介目录 在科技日新月异的今天,人工智能(AI&#…

‘视’不可挡:OAK相机助力无人机智控飞行!

南京邮电大学通达学院的刘同学用我们的oak-d-lite实现精确打击无人机的避障和目标识别定位功能,取得了比赛冠军。我们盼望着更多的朋友们能够加入到我们OAK的队伍中来,参与到各式各样的比赛中去。我们相信,有了我们相机的助力,大家…

网页抓取API,让数据获取更简单

网页抓取的过程通常分为以下步骤,尤其是在面对静态网页时: 获取页面 HTML:使用 HTTP 客户端下载目标页面的 HTML 内容。解析 HTML:将下载的 HTML 输入解析器,准备提取内容。提取数据:利用解析器功能&#…

Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找

一,数组翻转 1.概述:数组对称索引位置上的元素互换,最大值数组序号是数组长度减一 创建跳板temp,进行min和max的互换,然后min自增,max自减,当min>max的时候停止互换,代表到中间值 用代码实…

Office-Tab-for-Mac Office 窗口标签化,Office 多文件标签化管理

Office Tab:让操作更高效,给微软 Office 添加多标签页功能 Office 可以说是大家装机必备的软件,无论学习还是工作都少不了。其中最强大、用的最多的,还是微软的 Microsoft Office。 遗憾的是,微软的 Office 不支持多…

游戏引擎学习第12天

视频参考:https://www.bilibili.com/video/BV1yom9YnEWY 这节没讲什么东西,主要是改了一下音频的代码 后面有介绍一些alloc 和malloc,VirtualAlloc 的东西 _alloca 函数(或 alloca)分配的是栈内存,它的特点是: 生命周…

delphi fmx android 离线人脸识别

搜遍全网都没有找到delphi android 能用的 离线人脸识别,无需注册什么开发者 有这方面需求的可以用fsdk 这边用的luxand.FSDK8.0 android下的注册号要自己找下 1,用老猫的工具将android 下的sdk,FSDK.java 编译成FSDK.jar 老猫的工具 2,用上面的工具将FSDK.jar 生成de…

Java基础夯实——2.4 线程的生命周期

Java线程生命周期 Java线程的生命周期分为:新建(New)、就绪(Runnable)、阻塞(Blocked)、等待 (Waiting) 、计时等待(Timed_Waiting)、终止(Terminated&#…

实现简易计算器 网格布局 QT环境 纯代码C++实现

问题:通过代码完成一个10以内加减法计算器。不需要自适应,界面固定360*350。 ""按钮90*140,其它按钮90*70。 参考样式 #define DEFULT_BUTTON_STYLE "\ QPushButton{\color:#000000;\border:1px solid #AAAAAA;\border-radi…