Open CV 图像处理基础:(五)Java 使用 Open CV 的绘图函数

news/2024/7/21 6:09:06 标签: 图像处理, java, 人工智能, opencv

Java 使用 Open CV 的绘图函数

使用 Open CV 在 Java 中对图片使用绘图函数,分别绘制矩形、斜线、圆形、椭圆形以及添加文本

Java 使用 Open CV 的绘图函数

  • Java 使用 Open CV 的绘图函数
    • 函数
      • 绘制矩形
      • 绘制线
      • 绘制圆形
      • 绘制椭圆
      • 添加文本
    • 代码
    • 示例
    • Open CV 专栏导航

函数

绘制矩形

java">Imgproc.rectangle(Mat img, Point pt1, Point pt2, Scalar color, int thickness);

参数说明:

  • Mat img: 要绘制矩形的图像。
  • Point pt1: 矩形的一个顶点。
  • Point pt2: 与 pt1 相对的矩形的另一个顶点(不是矩形的对角线上的相邻顶点)。
  • Scalar color: 矩形的颜色。Scalar(B,G,R,A) 分别表示蓝色、绿色、红色和 Alpha(透明度)值,用于定义颜色。在不需要透明度时,可忽略最后一个参数。
  • int thickness: 矩形边框的厚度。正值表示矩形轮廓的厚度,负值(如 Imgproc.FILLED)表示填充整个矩形。

此外,Imgproc.rectangle 还有一个重载版本,它接受线型和偏移量:

java">Imgproc.rectangle(Mat img, Point pt1, Point pt2, Scalar color, int thickness, int lineType, int shift);
  • int lineType: 绘制线条的类型,它可以是 Imgproc.LINE_8、Imgproc.LINE_4 或 Imgproc.LINE_AA,其中 LINE_AA 是抗锯齿线型。
  • int shift: 点坐标中小数点后的位数。

绘制线

java">Imgproc.line(Mat img, Point pt1, Point pt2, Scalar color, int thickness);

参数说明:

  • Mat img: 要绘制直线的图像。
  • Point pt1: 直线起点的坐标。
  • Point pt2: 直线终点的坐标。
  • Scalar color: 直线的颜色。Scalar 对象包含四个元素,按顺序表示蓝色、绿色、红色通道的强度(BGR格式),以及可选的 Alpha 通道(透明度),取值范围通常是 0 到 255。如果不涉及 Alpha 通道,你可以忽略第四个值。
  • int thickness: 直线的厚度。
  • Imgproc.line 还有一个重载版本,它允许你指定线条类型和点坐标的小数位:
java">Imgproc.line(Mat img, Point pt1, Point pt2, Scalar color, int thickness, int lineType, int shift);
  • int lineType: 绘制线条的类型。可以是 Imgproc.LINE_8, Imgproc.LINE_4 或 Imgproc.LINE_AA,其中 LINE_AA 表示抗锯齿线条。
  • int shift: 顶点坐标中小数点后的位数。如果 shift 是非零值,那么所有的坐标值都将被相应地左移 shift 位。这可以用来精确绘制直线,特别是当你在一个更精细的网格中工作时。

绘制圆形

java">Imgproc.circle(image, circleCenter, radius, circleColor, -1);

参数说明:

  • Mat img: 要绘制圆形的图像。
  • Point center: 圆心的坐标。
  • int radius: 圆的半径。
  • Scalar color: 圆形的颜色。Scalar 对象包含四个元素,按顺序表示蓝色、绿色、红色通道的强度(BGR格式),以及可选的 Alpha 通道(透明度),取值范围通常是 0 到 255。如果不涉及 Alpha 通道,你可以忽略第四个值。
  • int thickness: 圆形边框的厚度。正值表示圆周的厚度,特殊值Imgproc.FILLED(或-1)表示填充整个圆。

Imgproc.circle 函数也可以通过指定线条类型来绘制:

java">Imgproc.circle(Mat img, Point center, int radius, Scalar color, int thickness, int lineType, int shift);
  • int lineType: 绘制线条的类型,可以是 Imgproc.LINE_8, Imgproc.LINE_4 或 Imgproc.LINE_AA,其中 LINE_AA 是抗锯齿线条。
  • int shift: 圆心坐标中小数点后的位数。如果 shift 是非零值,那么所有的坐标值都将被相应地左移 shift 位。这可以用来精确绘制圆形,尤其是在需要超高精度定位时。

绘制椭圆

java">Imgproc.ellipse(image, ellipseCenter, axes, 45, 0, 360, ellipseColor, 2);

添加文本

java">Imgproc.putText(image, text, textOrg, fontFace, fontScale, textColor, 2);

代码

这段代码首先加载了OpenCV的本地库,然后创建了一个400x400像素的黑色图像。之后,在图像上绘制了一个绿色的矩形、一个蓝色的斜线、一个红色的圆形、一个黄色的椭圆形,并添加了白色的文本“OpenCV”。

java">
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import static org.opencv.imgproc.Imgproc.FONT_HERSHEY_COMPLEX;

public class ImageDrawing {
    static {
        // 加载 OpenCV 的本地库
        System.load("D:/dll/x64/opencv_java440.dll");
    }
    public static void main(String[] args) {
        String outPut = "D:/to/image_draw.jpg";
        // 创建一个空的Mat对象(图像)
        Mat image = Mat.zeros(new Size(400, 400), CvType.CV_8UC3);
        // 绘制矩形
        // 参数:目标图像,左上角点,右下角点,颜色(BGR格式),线条粗细
        Point rectStart = new Point(50, 50);
        Point rectEnd = new Point(150, 150);
        Scalar rectColor = new Scalar(0, 255, 0); // 绿色
        Imgproc.rectangle(image, rectStart, rectEnd, rectColor, 3);

        // 绘制斜线
        // 参数:目标图像,起点,终点,颜色,线条粗细
        Point lineStart = new Point(200, 50);
        Point lineEnd = new Point(300, 150);
        Scalar lineColor = new Scalar(255, 0, 0); // 蓝色
        Imgproc.line(image, lineStart, lineEnd, lineColor, 3);

        // 绘制圆形
        // 参数:目标图像,圆心,半径,颜色,线条粗细(负值代表填充)
        Point circleCenter = new Point(100, 300);
        int radius = 40;
        Scalar circleColor = new Scalar(0, 0, 255); // 红色
        Imgproc.circle(image, circleCenter, radius, circleColor, -1);

        // 绘制椭圆形
        // 参数:目标图像,椭圆中心,半轴长度,旋转角度,开始角度,结束角度,颜色,线条粗细
        Point ellipseCenter = new Point(300, 300);
        Size axes = new Size(50, 80);
        Scalar ellipseColor = new Scalar(255, 255, 0); // 黄色
        Imgproc.ellipse(image, ellipseCenter, axes, 45, 0, 360, ellipseColor, 2);

        // 添加文本
        // 参数:目标图像,文本内容,文本位置,字体类型,字体大小,颜色,线条粗细
        String text = "OpenCV";
        int fontFace = FONT_HERSHEY_COMPLEX;
        Point textOrg = new Point(50, 200);
        double fontScale = 1.0;
        Scalar textColor = new Scalar(255, 255, 255); // 白色
        Imgproc.putText(image, text, textOrg, fontFace, fontScale, textColor, 2);

        // 保存图像
        Imgcodecs.imwrite(outPut, image);

        // 注意:如果需要在窗口中直接显示图像,Java版OpenCV可能不包括HighGui模块。
        // 如果你的环境支持HighGui,你可以取消注释以下代码来显示图像:
         HighGui.imshow("Drawing Example", image);
         HighGui.waitKey(0);
    }
}

示例

在这里插入图片描述

Open CV 专栏导航

  • (一)Open CV 在windows环境初始化和 Java 动态库加载方式介绍
  • (二)Open CV 从基本概念到实践操作
  • (三)使用 Open CV 在 Java 中进行基本的图片缩放操作
  • (四)使用 Open CV 在 Java 中进行基本的图片模糊处理
  • (五)Java 使用 Open CV 的绘图函数
  • (六)在Java中使用 Open CV进行图片翻转和图片旋转

http://www.niftyadmin.cn/n/5318115.html

相关文章

【Proteus仿真】【Arduino单片机】智能窗户设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用蜂鸣器模块、LCD1602显示模块、雨滴传感器、风速传感器、人体红外模块、ADC模块、按键模块、28BYJ48步进电机 模块、DS18B20温度传感器等。 …

【AI视野·今日NLP 自然语言处理论文速览 第七十四期】Wed, 10 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 10 Jan 2024 Totally 38 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Model Editing Can Hurt General Abilities of Large Language Models Authors Jia Chen Gu, Hao Xiang Xu, J…

Linux命令实战:解决日常问题的利器

目录 前言: 1、文件管理 2、文档编辑 3、文件传输 4、磁盘管理 5、磁盘维护 6、网络通讯 7、系统管理 8、系统设置 9、备份压缩 10、设备管理 前言: 随着信息技术的飞速发展,Linux系统已成为许多领域的核心工具。无论是服务器管理…

架构01 - 知识体系详解

架构,又称为知识体系,是指在特定领域或系统中的组织结构和设计原则。它涵盖了该领域或系统的核心概念、基础理论、方法技术以及实践经验等。架构的主要作用是提供一个全面且系统化的视角,帮助人们理解和应用相关知识,并指导系统的…

win系统搭建Minecraft世界服务器,MC开服教程,小白开服教程

Windows系统搭建我的世界世界服务器,Minecraft开服教程,小白开服教程,MC 1.19.4版本服务器搭建教程。 此教程使用 Mohist 1.19.4 服务端,此服务端支持Forge模组和Bukkit/Spigot/Paper插件,如果需要开其他服务端也可参…

微信小程序开发WebSocket通讯

官方文档说明:入口 WebSocket连接的链接只支持wss加密方式,且只能用域名的方式 该域名还要在微信公众平台的小程序中登记才能使用,开发->开发管理->服务器域名->修改 该域名要和https使用的一致 以域名地址:dtu.aab…

修改idea或者pycharm或者android studio的快捷键,快速跳转到行尾

ctrl enter这个快捷键是idea默认配置的,就是将光标所在的行切一刀,并且换到下一行。但是在我的开发习惯里面不怎么使用ctrl enter这个快捷键, 反而开发java或者flutter软件需要快速跳转到行尾添加分号 ; ,但是使用end键脱离了我…

python函数装饰器参数统计调用时间和次数

1 python函数装饰器参数统计调用时间和次数 python在函数装饰器外层定义一个函数生成封闭作用域来保存装饰器入参,供装饰器使用。 1.1 装饰器统计调用时间和次数 描述 通过类的可调用实例装饰器来统计函数每次调用时间和总调用时间,以及调用次数。 …