javacv中byte[]、BufferImage、Mat的互转

Wesley13
• 阅读 1285

最近在研究使用opencv对普通图片进行扣章的功能,在python上实现了,然后想使用在java上,java在选择jar包时选择了javacv(当然还有更原生的opencv,但由于考虑到后面可能会用到ffmpeg所以还是使用javacv) 到javacv的官网(http://bytedeco.org)上看了下,果然很强大,很多其它的包也有比如:numpy,tensorflow等python中使用到的库。 我是在javacv的sample中找到的相关方法。

/**
     * BufferImage转byte[]
     * @param original
     * @return
     */
    public static byte[] bufImg2Bytes(BufferedImage original){
        ByteArrayOutputStream bStream = new ByteArrayOutputStream();
        try {
            ImageIO.write(original, "png", bStream);
        } catch (IOException e) {
            throw new RuntimeException("bugImg读取失败:"+e.getMessage(),e);
        }
        return bStream.toByteArray();
    }

    /**
     * byte[]转BufferImage
     * @param imgBytes
     * @return
     */
    public static BufferedImage bytes2bufImg(byte[] imgBytes){
        BufferedImage tagImg = null;
        try {
            tagImg = ImageIO.read(new ByteArrayInputStream(imgBytes));
            return tagImg;
        } catch (IOException e) {
            throw new RuntimeException("bugImg写入失败:"+e.getMessage(),e);
        }
    }
    /**
     * BufferedImage 转 mat
     * 参考https://github.com/bytedeco/javacv-examples/blob/master/OpenCV_Cookbook/src/main/scala/opencv_cookbook/OpenCVUtils.scala
     * @param original
     * @return
     */
    public static Mat bufImg2Mat (BufferedImage original) {
        OpenCVFrameConverter.ToMat openCVConverter = new OpenCVFrameConverter.ToMat();
        Java2DFrameConverter java2DConverter = new Java2DFrameConverter();
        Mat mat= openCVConverter.convert(java2DConverter.convert(original));
        return mat;
    }

    /**
     * mat转BufferedImage
     * 参考https://github.com/bytedeco/javacv-examples/blob/master/OpenCV_Cookbook/src/main/scala/opencv_cookbook/OpenCVUtils.scala
     * @param matrix
     * @return
     */
    public static BufferedImage mat2BufImg (Mat matrix) {
        Mat tempMat=new Mat();
        cvtColor(matrix,tempMat,COLOR_BGRA2RGBA);//先要转bgra->rgba
        OpenCVFrameConverter.ToMat openCVConverter = new OpenCVFrameConverter.ToMat();
        Java2DFrameConverter java2DConverter = new Java2DFrameConverter();
        return java2DConverter.convert(openCVConverter.convert(tempMat));
    }

需要说明的opencv中的默认读取的颜色是bgr不是rgb,所以在mat转BufferImage时需要先cvtColor转换一下。

还有更简单的:Java2DFrameUtils 这个类,封装好了。

在使用中发现问题如果BufferedImage为4通道时转Mat会有问题要单独处理,Mat转BufferedImage颜色为蓝色时会有问题建议imwrite后直接用java读

BufferedImage为4通道时是ARGB

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java Compiler API
在早期的版本中(JavaSE5及以前版本)中只能通过tools.jar中的com.sun.tools.javac包来调用Java编译器,但由于tools.jar不是标准的Java库,在使用时必须要设置这个jar的路径。而在JavaSE6中为我们提供了标准的包来操作Java编译器,这就是javax.tools包。编译java文件
Wesley13 Wesley13
3年前
javaCV
  最近有视频处理的需求,自己调研javaCV。  官网没有详细的API,各种轮子翻遍了也没找到几个有用的,以下是自己整理一些视频处理功能:截取视频指定帧生成gif,将图片旋转指定度,截取视频指定帧保存为指定格式的图片(图片保存在视频同文件夹下),_调整视频清晰度(只能降低),_视频转音频__。  先上代码。packagecom.ric
Wesley13 Wesley13
3年前
javacv开发详解之1:调用本机摄像头视频
前言:javacv开发包是用于支持java多媒体开发的一套开发包,可以适用于本地多媒体(音视频)调用以及音视频,图片等文件后期操作(图片修改,音视频解码剪辑等等功能),这里只使用最简单的本地摄像头调用来演示一下javacv的基础功能重要:建议使用最新javaCV1.3版本,该版本已解决更早版本中已发现的大部分bugjavacv系
Stella981 Stella981
3年前
Cmake opencv_videoio_ffmpeg.dll下载失败
用Cmake对OpenCV进行Configure,下载opencv\_videoio\_ffmpeg.dll和opencv\_videoio\_ffmpeg\_64.dll经常失败,解决方案是:到CMake中设置的Wheretobuildthebinaries的路径下去找名为CMakeDownloadLog.txt的文件,里面会有ffmpeg.dll
Wesley13 Wesley13
3年前
Java基于百度AI+JavaCV+OpenCV 实现摄像头人数动态统计
!(https://oscimg.oschina.net/oscnet/e889839109f8dc7ab4b109f6abd9288b8dc.jpg)【Java】人流量统计动态版之视频转图识别请访问http://ai.baidu.com/forum/topic/show/940413本文是基于上一篇进行迭代的。本文主要是以摄像头
Stella981 Stella981
3年前
SpringBoot使用OpenCV总结
前言最近有个项目需要对图片图像进行处理,使用到了开源框架OpenCV全称是OpenSourceComputerVisionLibrary,是一个跨平台的计算机视觉库;而现在的项目都是基于SpringBoot,需要把OpenCv整合进去,下面把在使用中遇到的问题进行一个汇总整理。下载安装Opencv官网提供了一个多个平台的版
Stella981 Stella981
3年前
Docker下使用selenium+testng实现web自动化
Windows下seleniumtestng的web自动化环境搭建做过自动化的人,肯定对seleniumweb环境的搭建非常熟悉了,特别是selenium在java中的使用。先搭建好安装好JDK,配置好java开发环境(这个如果还是不知怎么操作的话可是要打PP了)。然后从官网下载对应selenium的jar包,加载到项目里;或者是使用maven,
Easter79 Easter79
3年前
SpringBoot使用OpenCV总结
前言最近有个项目需要对图片图像进行处理,使用到了开源框架OpenCV全称是OpenSourceComputerVisionLibrary,是一个跨平台的计算机视觉库;而现在的项目都是基于SpringBoot,需要把OpenCv整合进去,下面把在使用中遇到的问题进行一个汇总整理。下载安装Opencv官网提供了一个多个平台的版
Opencv入门篇:简介与基本使用 | 京东物流技术团队
1Opencv简介Opencv是计算机视觉中经典的专用库,其支持多语言,跨平台,功能强大。OpencvPython为Opencv提供了Python接口,使得使用者在Python中能够调用C/C,在保证易读性和运行效率的前提下,实现所需的功能。Openc