java基于OpenCv图像处理_读取_保存图片_javacv 读取图片-程序员宅基地

技术标签: java  图像处理  javaCv  opencv  

java基于openCv图像处理_读取_保存图片

本文使用javaCV封装后的OpenCv

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.5</version>
</dependency>

1、图片读取、保存

在openCv中有一函数用于读取图片 imread(),保存图片imwrite()
由于javaCv二次封装,所以函数目录和openCv目录不同,javaCv函数在opencv_imgcodecs中,因为javaCv目前没有完整的文档所以只能查看源代码一个个找,后面自己使用别的功能时是需要自己看源代码的,反正挺苦逼的。

1.1、图片读取

public static void main(String[] args) {
    
        Mat mat = opencv_imgcodecs.imread("D:\\leiningen\\cat.jpg");
        ImageViewer imageViewer = new ImageViewer(mat);
        imageViewer.imshow();
}

ImageViewer 我着实没有找到在javaCv中相应的类,不过找到一个opencv_highgui.imshow()方法但是用不了,我看了里面的注释需要搭配线程使用反正我没搞出来。所以我也把这个类ImageViewer源代码贴出来吧(我放在最后了)。

1.2、图片保存

public static void main(String[] args) {
    
        Mat mat = opencv_imgcodecs.imread("D:\\leiningen\\cat.jpg");
        opencv_imgcodecs.imwrite("D:\\leiningen\\cat1.png",mat);
}

补充:

从代码中可以看到陌生的对象Mat,这个是矩阵的意思,这个对象是openCv的核心,简单介绍一下。
首先我们来创建一个矩阵开始。

public static void main(String[] args) {
    
        //创建RGB颜色当前是蓝色
        Scalar scalar = new Scalar(255, 0, 0, 0); // R G B 0
        //Size:width、height
        Mat mat = new Mat(new Size(100,200), opencv_core.CV_8UC3,scalar);
        ImageViewer imageViewer = new ImageViewer(mat);
        imageViewer.imshow();
}

上面代码片先是读取在保存,唯一区别就是保存时用的格式使用的是png,不需要进行图像编码和令人发狂的字节操作
按照官方说法:
JPEG可以使用CV_IMWRITE_JPEG_OUALITY参数,参数值范围在0 ~ 100 (值越大图像质量越高)默认值是95。
PNG,可以使用0 ~ 9 作为压缩程度的参数值,值越大图像质量越小,压缩时间越长,默认值是3.

package com.cloud.iot.util;

import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.opencv.opencv_core.Mat;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.nio.ByteBuffer;


public class ImageViewer {
    

    private JLabel imageView;
    private Mat image;
    private String windowName;


    public ImageViewer(Mat image) {
    
        this.image = image;
    }



    public ImageViewer(Mat image, String windowName) {
    
        this.image = image;
        this.windowName = windowName;
    }

    /**
     * 窗口展示
     */
    public void imshow() {
    
        setSystemLookAndFeel();
        Image loadedImage = toBufferedImage(image);
        JFrame frame = createJFrame(windowName, image.arrayWidth(), image.arrayHeight());
        imageView.setIcon(new ImageIcon(loadedImage));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 用户点击窗口关闭
    }

    private void setSystemLookAndFeel() {
    
        try {
    
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e) {
    
            e.printStackTrace();
        } catch (InstantiationException e) {
    
            e.printStackTrace();
        } catch (IllegalAccessException e) {
    
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
    
            e.printStackTrace();
        }
    }

    private JFrame createJFrame(String windowName, int width, int height) {
    
        JFrame frame = new JFrame(windowName);
        imageView = new JLabel();
        final JScrollPane imageScrollPane = new JScrollPane(imageView);
        imageScrollPane.setPreferredSize(new Dimension(width, height));
        frame.add(imageScrollPane, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        return frame;
    }


    private Image toBufferedImage(Mat matrix) {
    
        int type = BufferedImage.TYPE_BYTE_GRAY;
        if (matrix.channels() > 1) {
    
            type = BufferedImage.TYPE_3BYTE_BGR;
        }
        ByteBuffer byteBuffer = matrix.getByteBuffer();
        byte[] b = new byte[byteBuffer.remaining()];
        byteBuffer.get(b,0,b.length);
        BufferedImage image = new BufferedImage(matrix.cols(), matrix.rows(), type);
        final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
        System.arraycopy(b, 0, targetPixels, 0, b.length);
        return image;
    }
}

今天就到这·······································································over
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42566182/article/details/121013343

智能推荐

ROS1快速入门学习笔记 - 10服务数据的定义和使用

三个横线作为一个区分,上面是request,下面是response;创建完之后如下所示。

017、Python+fastapi,第一个Python项目走向第17步:ubuntu24.04 无界面服务器版下安装nvidia显卡驱动

新的ubuntu24.04正式版发布了,前段时间玩了下桌面版,感觉还行,先安装一个服务器无界面版本吧安装时有一个openssh选择安装,要不然就不能ssh远程,我就是没选,后来重新安装ssh。另外一个就是安装过程中静态ip设置下在etc/netplan 文件夹下,有一个yaml文件,我的是50-cloud-init.yaml,先用ip a看看network:ethernets:enp3s0:routes:version: 2。

不是阿里P8级大佬,岂能错过这篇MySQL运维内参?啃透涨薪so easy-程序员宅基地

文章浏览阅读176次。写在前面MySQL被设计为一个可移植的数据库,几乎在当前所有系统上都能运行,如Linux、Solaris、 FreeBSD、 Mac和Windows。尽管各平台在底层(如线程)实现方面都各有不同,但是MySQL基本上能保证在各平台上的物理体系结构的一致性。因此,用户应该能很好地理解MySQL数据库在所有这些平台上是如何运作的。由于工作的缘故,笔者的大部分时间需要与开发人员进行数据库方面的沟通,并对他们进行培训。不论他们是DBA,还是开发人员,似乎都对MySQL的体系结构了解得不够透彻。很多人喜欢把M_mysql运维内参

百度正用谷歌AlphaGo,解决一个比围棋更难的问题 | 300块GPU在燃烧-程序员宅基地

文章浏览阅读382次。晓查 发自 凹非寺量子位 报道 | 公众号 QbitAI9102年,人类依然不断回想起围棋技艺被AlphaGo所碾压的恐怖。却也有不以为然的声音:只会下棋的AI,再厉害..._alpha go训练用了多少个gpu

docker 容器 设置网络代理_docker export http_proxy-程序员宅基地

文章浏览阅读3.3k次。docker 容器 设置网络代理以/bin/bash 形式进入容器:【设置http 及https代理】,如下:export http_proxy=http://172.16.0.20:3128export https_proxy=https://172.16.0.20:3128要取消该设置:unsethttp_proxyunset https_proxy..._docker export http_proxy

linux之笔记_linux 0775十六進制-程序员宅基地

文章浏览阅读263次。授课环境: 结束程序运行: ctrl + c 共享目录(工作目录): /kyo /Videos 访问共享目录流程: 是否能连通服务器 ping 3.3.3.9 是否服务器开启共享 showmount -e 3.3.3.9 挂载共享目录到本地: _linux 0775十六進制

随便推点

K210与STM32之间的通信_k210与stm32通信-程序员宅基地

文章浏览阅读5.1k次,点赞2次,收藏70次。K210与STM32之间使用串口进行通信_k210与stm32通信

OpenHarmony语言基础类库【@ohos.util.List (线性容器List)】

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点。

[自学笔记] ESP32-C3 Micropython初次配置

2、本次测试了两款IDE,分别是"thonny-4.1.4.exe"和"uPyCraft-v1.0.exe"。Thonny支持中文及多语言。而uPyCraft-v1.0只支持英文语言。因此入门时选用了Thonny作为IDE。(注:1、测试过程中IDE正常连接ESP32C3简约版的虚拟串口。不受简约版无串口芯片的影响。

初识Electron,创建桌面应用

古有匈奴犯汉,晋室不纲,铁木夺宋,虏清入关,神舟陆沉二百年有余,中国之见灭于满清初非满人能灭之,能有之也因有汉奸以作虎怅,残同胞媚异种,始有吴三桂洪承畴,继有曾国藩袁世凯以为厉。今率堂堂之师,征讨汉贼袁氏筑共和之体,或免于我子子孙孙被异族奴役。---- 《讨汉贼袁世凯檄文》- DOMContentLoaded事件:此时浏览器已经完全加载了HTML文件,并且DOM树已经生成好了。- Load事件:此时浏览器已经将所有的资源都加载完毕,可以正确读取页面中的资源。补充知识:Electron 生命周期。

Xcode 15构建问题

将ENABLE_USER_SCRIPT_SANDBOXING设为“no”即可!

OpenVINO应用案例:部署YOLO模型到边缘计算摄像头_openvino yolo-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏23次。一、实现路径通过OpenVINO部署YOLO模型到边缘计算摄像头,其实现路径为:训练(YOLO)->转换(OpenVINO)->部署运行(OpenNCC)。二、具体步骤1、训练YOLO模型1.1 安装环境依赖有关安装详情请参阅 https://github.com/AlexeyAB/darknet#requirements-for-windows-linux-and-macos 。1.2 编译训练工具git clone https://github.com/AlexeyAB/da_openvino yolo

推荐文章

热门文章

相关标签