JavaCV

调用摄像头

public class Camera {public static void main(String[] args) throws FrameGrabber.Exception {// 开启抓取器OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);grabber.start();// 开启窗口CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);canvasFrame.setAlwaysOnTop(true);// 设置窗口大小canvasFrame.setCanvasSize(800, 600);// 循环展示while (canvasFrame.isVisible()) {canvasFrame.showImage(grabber.grab());}grabber.close();//关闭抓取器}
}

录制视频

public class Recording {private static final String FILE_NAME = "D://recording.mp4";@SuppressWarnings("resource")public static void main(String[] args) throws FrameGrabber.Exception, FrameRecorder.Exception {// 开启抓取器OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);grabber.start();//转换器,抓取一帧视频并将其转换为图像OpenCVFrameConverter<IplImage> converter = new OpenCVFrameConverter.ToIplImage();IplImage iplImage = converter.convertToIplImage(grabber.grab());// 开启录制器OpenCVFrameRecorder recorder = new OpenCVFrameRecorder(FILE_NAME, iplImage.width(), iplImage.height());recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);recorder.setFormat("mp4");recorder.start();// 开启窗口CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);canvasFrame.setAlwaysOnTop(true);// 设置窗口大小canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());// 循环展示Frame image;while (canvasFrame.isVisible()) {image = grabber.grab();canvasFrame.showImage(image);recorder.record(image);}recorder.close();// 关闭推流录制器,close包含release和stop操作grabber.close();// 关闭抓取器}
}

录制带音频的视频

public class Audio {// 采样率private final static int SAMPLE_RATE = 44100;// 音频通道数,2表示立体声private final static int CHANNEL_NUM = 2;private static final String FILE_NAME = "D://recording.mp4";@SuppressWarnings("resource")public static void main(String[] args) throws FrameGrabber.Exception, FrameRecorder.Exception, LineUnavailableException {// 音频格式的参数AudioFormat audioFormat = new AudioFormat(SAMPLE_RATE, 16, CHANNEL_NUM, true, false);// 获取数据线所需的参数DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);// 从音频捕获设备取得其数据的数据线,之后的音频数据就从该数据线中获取TargetDataLine line = (TargetDataLine) AudioSystem.getLine(dataLineInfo);line.open(audioFormat);// 数据线与音频数据的IO建立联系line.start();// 每次取得的原始数据大小final int audioBufferSize = SAMPLE_RATE * CHANNEL_NUM;// 初始化数组,用于暂存原始音频采样数据byte[] audioBytes = new byte[audioBufferSize];// 开启抓取器OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);grabber.start();//转换器,抓取一帧视频并将其转换为图像OpenCVFrameConverter<IplImage> converter = new OpenCVFrameConverter.ToIplImage();IplImage iplImage = converter.convertToIplImage(grabber.grab());// 开启录制器FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(FILE_NAME, iplImage.width(), iplImage.height());recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);recorder.setFormat("mp4");// 码率恒定recorder.setAudioOption("crf", "0");// 最高音质recorder.setAudioQuality(0);// 192 Kbpsrecorder.setAudioBitrate(192000);// 采样率recorder.setSampleRate(SAMPLE_RATE);// 立体声recorder.setAudioChannels(2);// 编码器recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);recorder.start();// 开启窗口CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);canvasFrame.setAlwaysOnTop(true);// 设置窗口大小canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());// 循环展示Frame image;while (canvasFrame.isVisible()) {image = grabber.grab();canvasFrame.showImage(image);recorder.record(image);int nBytesRead = line.read(audioBytes, 0, line.available());// 采样数据是16比特,也就是2字节,对应的数据类型就是short,// 所以准备一个short数组来接受原始的byte数组数据// short是2字节,所以数组长度就是byte数组长度的二分之一int nSamplesRead = nBytesRead / 2;short[] samples = new short[nSamplesRead];// 两个byte放入一个short中的时候,谁在前谁在后?这里用LITTLE_ENDIAN指定拜访顺序,ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(samples);// 将short数组转为ShortBuffer对象,因为帧录制器的入参需要该类型ShortBuffer sBuff = ShortBuffer.wrap(samples, 0, nSamplesRead);// 音频帧交给帧录制器输出recorder.recordSamples(SAMPLE_RATE, CHANNEL_NUM, sBuff);}recorder.close();// 关闭推流录制器,close包含release和stop操作grabber.close();// 关闭抓取器}
}

人脸识别

public class Face {@SuppressWarnings("resource")public static void main(String[] args) throws FrameGrabber.Exception {CascadeClassifier cascadeClassifier = new CascadeClassifier("D:\\Workspace\\javacv-demo\\src\\main\\resources\\haarcascade_frontalface_alt.xml");OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);grabber.start();// 转换器,抓取一帧视频并将其转换为图像,获取图像大小OpenCVFrameConverter.ToIplImage imageConverter = new OpenCVFrameConverter.ToIplImage();Frame grab = grabber.grab();IplImage iplImage = imageConverter.convertToIplImage(grab);OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();// 开启窗口CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);canvasFrame.setAlwaysOnTop(true);// 设置窗口大小canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());// 循环展示Frame frame;while (canvasFrame.isVisible()) {frame = grabber.grab();Mat image = converter.convertToMat(frame);RectVector faces = new RectVector();cascadeClassifier.detectMultiScale(image, faces);for (int i = 0; i < faces.size(); i++) {opencv_imgproc.rectangle(image, faces.get(i), new Scalar().green(255));}canvasFrame.showImage(frame);}grabber.close();// 关闭抓取器}
}

人脸64关键点

public class FacemarkDemo {@SuppressWarnings("resource")public static void main(String[] args) throws FrameGrabber.Exception {CascadeClassifier cascadeClassifier = new CascadeClassifier("D:\\Workspace\\javacv-demo\\src\\main\\resources\\haarcascade_frontalface_alt.xml");Facemark facemark = createFacemarkLBF();facemark.loadModel("D:\\Workspace\\javacv-demo\\src\\main\\resources\\lbfmodel.yaml");OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);grabber.start();// 转换器,抓取一帧视频并将其转换为图像,获取图像大小OpenCVFrameConverter.ToIplImage imageConverter = new OpenCVFrameConverter.ToIplImage();Frame grab = grabber.grab();IplImage iplImage = imageConverter.convertToIplImage(grab);OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();// 开启窗口CanvasFrame canvasFrame = new CanvasFrame("OpenCV Frame");canvasFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);// 设置窗口大小canvasFrame.setCanvasSize(iplImage.width(), iplImage.height());// 循环展示Frame frame;while (canvasFrame.isVisible()) {frame = grabber.grab();Mat image = converter.convertToMat(frame);RectVector faces = new RectVector();cascadeClassifier.detectMultiScale(image, faces);Point2fVectorVector landmarks = new Point2fVectorVector();if (!image.empty() && faces.size() > 0) {facemark.fit(image, faces, landmarks);for (int i = 0; i < landmarks.size(); i++) {drawFacemarks(image, landmarks.get(i), new Scalar().red(255));}}for (int i = 0; i < faces.size(); i++) {opencv_imgproc.rectangle(image, faces.get(i), new Scalar().green(255));}canvasFrame.showImage(frame);}grabber.close();// 关闭抓取器}
}

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

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

相关文章

凝思linux修改mac地址

临时性修改 /sbin/ifconfig eth0 hw ether 00:0C:29:36:97:20

前端UI编程基础知识:基础三要素(结构→表现→行为)

以下是重新梳理的前端UI编程基础知识体系&#xff0c;结合最新技术趋势与实战要点&#xff0c;以更适合快速掌握的逻辑结构呈现&#xff1a; 一、基础三要素&#xff08;结构→表现→行为&#xff09; 1. HTML5 核心能力 • 语义化标签&#xff1a;<header>, <nav&g…

面试题:实现学生管理系统

这是我在以前面试中遇到的一个问题&#xff0c; 面试官说&#xff1a;你能现场实现一个学生管理系统吗&#xff0c;实现对学生的增删查改这4个功能 当时写了半天没写出来.....&#xff0c;所以我在这里记录一下 10分钟实现学生管理系统并实现 增删查改 功能 #include <iostr…

大语言模型基础—语言模型的发展历程--task1

目录 1.语言模型的发展历程 1.1 统计语言模型 1.2 神经语言模型 1.3 预训练语言模型 1.4 大语言模型 1.5 总结 1.6 各阶段对比与演进逻辑 1.语言模型的发展历程 语言模型的发展历程经历了四个主要阶段&#xff1a;统计语言模型、神经语言模型、预训练语言模型和大语言模…

BIG_EVENT

环境准备: 开发: 跨域问题: 只有浏览器才存在跨域问题, 此时浏览器的地址和前端服务一致,所以不存在跨域问题, 但是当浏览器中的js代码需要向8080发送请求时就会由于存在跨域问题而失败. 简单的说前端和浏览器的地址端口是一致的,浏览器只能向前端服务发送请求, 所以可以使用配…

DAY33 贪心算法Ⅱ

122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 想到把整体利润分解为每天的利润&#xff0c;就豁然开朗了。 class Solution { public:int maxProfit(vector<int>& prices) {int result0;for(int i1;i<prices.size();i){resultmax(0,pric…

【Qt】qApp简单介绍

1. 介绍 在Qt中&#xff0c;qApp是一个全局指针&#xff0c;它指向当前的QApplication或QGuiApplication对象。这个全局指针在Qt应用程序中非常有用&#xff0c;因为它可以让你在任何地方访问到应用程序对象。 在C中&#xff0c;全局指针是一个可以在程序的任何地方访问的指针…

Redis 设置密码无效问题解决

一、验证密码有没有生效 运行cmd&#xff0c;cd到redis的目录下 输入“redis-cli.exe” 回车 输入“auth 123456” 回车 若错误&#xff0c;说明没有设置密码或者设置的密码没有生效 输入“exit” 回车就立即退出redis 二、解决方案是&#xff1a;直接修改后缀是 .conf 的…

手写一些常见算法

手写一些常见算法 快速排序归并排序Dijkstra自定义排序交替打印0和1冒泡排序插入排序堆排序 快速排序 public class Main {public static void main(String[] args) {int nums[] {1,3,2,5,4,6,8,7,9};quickSort(nums,0,nums.length - 1);}private static void quickSort(int[…

VBA即用型代码手册:选择、转到Select、 Go To

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

[CISSP] [1] 访问控制//入侵检测与网络防护

访问控制 检测性访问控制&#xff08;Detective Access Control&#xff09; 作用&#xff1a;用于发现和记录未经授权的活动。方式&#xff1a;这类控制本身不直接阻止攻击或违规行为&#xff0c;而是监测、检测并记录这些事件&#xff0c;以便后续调查或响应。例子&#xff1…

【SpringBoot】MD5加盐算法的详解

目录 一、什么是加盐算法 二、如何实现加盐算法 2.1 加盐算法代码实现 2.2 注册页面中进行密码加盐 2.3 登录页面进行加盐的解密 2.4 注册和登录 一、什么是加盐算法 加盐算法是一种用于增强密码安全性的技术。这种技术通过在密码存储过程中添加一个随机生成的盐值&…

uniapp移动端图片比较器组件,仿英伟达官网rtx光追图片比较器功能

组件下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id22609 已测试h5和微信小程序&#xff0c;理论支持全平台 亮点&#xff1a; 简单易用 使用js计算而不是resize属性&#xff0c;定制化程度更高 组件挂在后可播放指示线动画&#xff0c;提示用户可以拖拽比较图片…

CI/CD—Jenkins实现自动构建Docker镜像运行Java程序

实现原理 1、Java代码中创建一个dockerfile文件 --> 2、代码上传至GitLab --> 3、Jenkins同步GitLab的代码进行构建生成jar --> 4、Jenkins将jar包和dockerfile文件传到测试服务器上 --> 5、在测试服务器上执行dockerfile构建jar镜像 --> 6、镜像构建完运行容器…

docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境

docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境 docker-compose.yml services:mysql-8.0:container_name: mysql-8.0image: mysql:8.0restart: always#ports:#- "3306:3306"volumes:- ./etc/mysql/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro- ./var/log…

队列的简单例题

题目如下 模拟队列 首先你要明白队列的话 只有队尾才能进行新增&#xff0c;也就是入队 只有队首才能出队&#xff0c;也就是删除 队首队尾指针一开始默认都是0 相当于队列中一开始是有一个元素的就是 0的位置 队首指针head0 队尾指针tail0 1.入队也就是队尾要先赋值&#xf…

vue3+elementuiplus的table表格动态高度

table表格流体高度 1、前提 了解自定义指令、hooks 2、核心思路 通过自定义指令&#xff08;new ResizeObserver&#xff09;监听表格变化&#xff0c;然后通过hooks去更新表格高度。 3、核心代码 src/directives/resize.ts // import { debounce } from /utils;import { t…

Apache POI详解

目录 前言 Apache POI是一个强大的Java库&#xff0c;广泛用于处理Microsoft Office文档&#xff0c;包括Word、Excel和PowerPoint等。本文将详细介绍如何使用Apache POI库操作Word模板&#xff08;包括替换占位符、操作表格&#xff09;、将Word文档转换为PDF&#xff0c;以及…

AutoGen多角色、多用户、多智能体对话系统

2023-03-11-AutoGen 使用【autoGenchainlitdeepSeek】实现【多角色、多用户、多智能体对话系统】 1-核心思路 01&#xff09;技术要点&#xff1a;autoGenchainlitdeepSeek02&#xff09;什么是autoGen->autogen是微软旗下的多智能体的框架03&#xff09;什么是chainlit-&g…

问deepseek: OpenFOAM并行分区后,是如何实现ldumatrix矩阵向量乘法计算逻辑的?

在OpenFOAM中&#xff0c;lduMatrix 是用于存储稀疏矩阵的类&#xff0c;支持并行计算。并行分区后&#xff0c;lduMatrix 的矩阵向量乘法通过以下步骤实现&#xff1a; 1. 矩阵分区 分区&#xff1a;将矩阵和向量分配到多个处理器上&#xff0c;每个处理器负责一部分。接口&…