JavaCV的摄像头实战之一:基础,java面试常考的编程题

1.0-SNAPSHOT

simple-grab-push

jar

<javacpp.version>1.5.6</javacpp.version>

org.projectlombok

lombok

ch.qos.logback

logback-classic

1.2.3

org.apache.logging.log4j

log4j-to-slf4j

2.13.3

org.bytedeco

javacv-platform

${javacpp.version}

  • 接下来就是AbstractCameraApplication.java的完整代码,这些代码的流程和方法命名都与上图保持一致,并且添加了详细的注释,有几处要注意的地方稍后会提到:

package com.bolingcavalry.grabpush.camera;

import lombok.Getter;

import lombok.extern.slf4j.Slf4j;

import org.bytedeco.ffmpeg.global.avutil;

import org.bytedeco.javacv.*;

import org.bytedeco.opencv.global.opencv_imgproc;

import org.bytedeco.opencv.opencv_core.Mat;

import org.bytedeco.opencv.opencv_core.Scalar;

import java.text.SimpleDateFormat;

import java.util.Date;

/**

  • @author will

  • @email zq2599@gmail.com

  • @date 2021/11/19 8:07 上午

  • @description 摄像头应用的基础类,这里面定义了拉流和推流的基本流程,子类只需实现具体的业务方法即可

*/

@Slf4j

public abstract class AbstractCameraApplication {

/**

  • 摄像头序号,如果只有一个摄像头,那就是0

*/

protected static final int CAMERA_INDEX = 0;

/**

  • 帧抓取器

*/

protected FrameGrabber grabber;

/**

  • 输出帧率

*/

@Getter

private final double frameRate = 30;

/**

  • 摄像头视频的宽

*/

@Getter

private final int cameraImageWidth = 1280;

/**

  • 摄像头视频的高

*/

@Getter

private final int cameraImageHeight = 720;

/**

  • 转换器

*/

private final OpenCVFrameConverter.ToIplImage openCVConverter = new OpenCVFrameConverter.ToIplImage();

/**

  • 实例化、初始化输出操作相关的资源

*/

protected abstract void initOutput() throws Exception;

/**

  • 输出

*/

protected abstract void output(Frame frame) throws Exception;

/**

  • 释放输出操作相关的资源

*/

protected abstract void releaseOutputResource() throws Exception;

/**

  • 两帧之间的间隔时间

  • @return

*/

protected int getInterval() {

// 假设一秒钟15帧,那么两帧间隔就是(1000/15)毫秒

return (int)(1000/ frameRate);

}

/**

  • 实例化帧抓取器,默认OpenCVFrameGrabber对象,

  • 子类可按需要自行覆盖

  • @throws FFmpegFrameGrabber.Exception

*/

protected void instanceGrabber() throws FrameGrabber.Exception {

grabber = new OpenCVFrameGrabber(CAMERA_INDEX);

}

/**

  • 用帧抓取器抓取一帧,默认调用grab()方法,

  • 子类可以按需求自行覆盖

  • @return

*/

protected Frame grabFrame() throws FrameGrabber.Exception {

return grabber.grab();

}

/**

  • 初始化帧抓取器

  • @throws Exception

*/

protected void initGrabber() throws Exception {

// 实例化帧抓取器

instanceGrabber();

// 摄像头有可能有多个分辨率,这里指定

// 可以指定宽高,也可以不指定反而调用grabber.getImageWidth去获取,

grabber.setImageWidth(cameraImageWidth);

grabber.setImageHeight(cameraImageHeight);

// 开启抓取器

grabber.start();

}

/**

  • 预览和输出

  • @param grabSeconds 持续时长

  • @throws Exception

*/

private void grabAndOutput(int grabSeconds) throws Exception {

// 添加水印时用到的时间工具

SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

long endTime = System.currentTimeMillis() + 1000L *grabSeconds;

// 两帧输出之间的间隔时间,默认是1000除以帧率,子类可酌情修改

int interVal = getInterval();

// 水印在图片上的位置

org.bytedeco.opencv.opencv_core.Point point = new org.bytedeco.opencv.opencv_core.Point(15, 35);

Frame captureFrame;

Mat mat;

// 超过指定时间就结束循环

while (System.currentTimeMillis()<endTime) {

// 取一帧

captureFrame = grabFrame();

if (null==captureFrame) {

log.error(“帧对象为空”);

break;

}

// 将帧对象转为mat对象

mat = openCVConverter.convertToMat(captureFrame);

// 在图片上添加水印,水印内容是当前时间,位置是左上角

opencv_imgproc.putText(mat,

simpleDateFormat.format(new Date()),

point,

opencv_imgproc.CV_FONT_VECTOR0,

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-Y7xmM5pL-1710821801379)]
[外链图片转存中…(img-x1ttCGBl-1710821801380)]
[外链图片转存中…(img-vG6hWDvC-1710821801380)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-avOTrfEc-1710821801381)]

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值