JavaCV入门指南:调用opencv原生API和JavaCV是如何封装了opencv的图像处理操作?

本文是JavaCV入门指南的一部分,介绍了如何通过javaCPP直接调用OpenCV的API,以及JavaCV如何封装opencv的音视频和图像处理操作。内容涵盖OpenCVFrameGrabber读取设备、媒体文件,OpenCVFrameRecorder录制媒体,以及Mat与Frame之间的转换。
摘要由CSDN通过智能技术生成

JavaCV入门指南系列:

JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到《快速上手篇》)

JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作

JavaCV入门指南:调用opencv原生API和JavaCV是如何封装了opencv的图像处理操作

JavaCV入门指南:帧抓取器(FrameGrabber)的原理与应用

JavaCV入门指南:帧录制器/推流器(FrameRecorder)的原理与应用

JavaCV入门指南:帧过滤器(FrameFilter)的原理与应用

JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类

《快速上手篇》(为了区别,单独划分):

JavaCV入门指南之快速上手篇:快速上手视频拉流、推流、录制文件、录屏、截图和编解码复用解复用等常用音视频处理操作

一、前言

通过第二章的JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作大家已经知道javacv的答题结构如图:

二、javaCPP直接调用opencv的API

我们通过《实时视频添加文字水印并截取视频图像保存成图片》作为实例来阐述,实例地址:

openCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作

以及javacv进阶opencv图像检测/识别系列

JavaCV进阶opencv图像检测识别:摄像头画面人脸检测

JavaCV进阶opencv图像检测识别:ffmpeg视频图像画面人脸检测

这部分内容主要是如何调用opencv的API,本系列作为JavaCV入门指南不会讲解opencv的具体用法,如果想要深入学习opencv部分,除了博主的opencv系列之外,还可以参考opencv的官方文档及实例。

三、JavaCV是如何封装了opencv的音视频及图像处理操作?

与ffmpeg相似的是,JavaCV把opencv的操作也抽象成了“读取媒体文件或地址,循环抓取图像,停止”的流程,其中不同的是,opencv可以直接循环读取设备列表:详细请参考:

opencv图像处理3:使用opencv原生方法遍历摄像头设备及调用(方便多摄像头遍历及调用,相比javacv更快的摄像头读取速度和效率,方便读取后的图像处理)

JavaCV把opencv的操作分成了两大块:OpenCVFrameGrabber和OpenCVFrameRecorder。其中OpenCVFrameGrabber用来读取设备、视频流媒体和图片文件等,而OpenCVFrameRecorder则用来录制文件。

1、OpenCVFrameGrabber读取设备、媒体文件及流

OpenCVFrameGrabber其实内部封装了opencv的VideoCapture操作,支持设备、视频文件、图片文件和流媒体地址(rtsp/rtmp等)。

可以通过 ImageMode设置色彩模式,支持ImageMode.COLOR(色彩图)和ImageMode.GRAY(灰度图)

支持的格式请参考:The 'MP4' Registration AuthorityVideo Codecs by FOURCC - fourcc.org这两个列表。

注意:opencv并不支持音频读取和录制等操作,只支持视频文件、视频流媒体、图像采集设备的画面抓取。

另外需要注意的是,读取非动态图片,只能读取一帧。

通过OpenCVFrameRecorder的grab()抓取到的图像是Frame,其实javaCV内部通过OpenCVFrameConverter把opencv的Mat转换为了Frame,也即是说,Frame中可以直接获取Mat或者也可以通过OpenCVFrameConverter实现Mat和Frame的互转。

2、OpenCVFrameGrabber获取的Frame和Mat之间的关系

OpenCVFrameGrabber既然内部封装的是opencv的VideoCapture,那么获取的数据结构应该是Mat,通过OpenCVFrameGrabber源码也证实了这一点,那么我们如何直接获取Mat呢?

实际上在OpenCVFrameGrabber中把获取到的Mat转换为Frame,并且在Frame中使用opaque字段引用了Mat结构体。

在上一章FFmpegFrameGrabber中也有提到opaque字段的说明,Frame中的opaque字段引用了opencv的Mat结构体,小伙伴们在使用OpenCVFrameGrabber获取Frame的时候不需要再进行Frame和Mat转换,只需要使用

Mat img=(Mat)frame.opaque;

即可获得Mat结构体。

3、OpenCVFrameRecorder录制媒体文件

opencv的录制支持的视频编码fourCC的编码集请参考:The 'MP4' Registration AuthorityVideo Codecs by FOURCC - fourcc.org这两个列表。

OpenCVFrameRecorder主要封装了opencv的VideoWriter模块,用来实现视频流媒体的录制操作,支持的格式同样参考:The 'MP4' Registration AuthorityVideo Codecs by FOURCC - fourcc.org这两个列表。

通过循环recordFrame就可以录制视频流媒体,当然如果是进行图像处理操作,得到的是mat,就可以通过OpenCVFrameConverter把Mat转换成Frame即可进行record()录制操作。

4、OpenCVFrameConverter进行Mat、 IplImage和Frame的互转

由于我们使用opencv需要进行图像处理等操作,处理完得到的是Mat或者IplImage,读取和录制却是Frame,所以需要使用OpenCVFrameConverter提供的转换操作来完成两个对象间的转换操作。

注意:此转换操作实际上常用于FFmpeg获取到的视频图像转换为Mat,因为OpencvFrameGrabber本身获取到的Frame包含Mat的引用,参考上面的“OpenCVFrameGrabber获取的Frame和Mat之间的关系”

IplImage与Frame互转

//把frame转换成IplImage

IplImage convertToIplImage(Frame frame)

//把IplImage转换成frame

 Frame convert(IplImage img) 

Mat与Frame互转

//frame转换成Mat

Mat convertToMat(Frame frame)

//mat转换成frame

Frame convert(Mat mat)

下一章可以一起阅读这两章:

JavaCV入门指南:帧抓取器(FrameGrabber)的原理与应用JavaCV入门指南:帧录制器/推流器(FrameRecorder)的原理与应用

支持eguid原创技术分享,欢迎“关注、点赞、收藏”一键三连!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eguid_1

感谢支持eguid原创技术文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值