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

Java 使用 Open CV 的绘图函数

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

Java 使用 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 专栏导航

相关推荐
吴声子夜歌12 分钟前
Java面试——Spark原理及应用(二)
java·面试·spark
码视野15 分钟前
基于 Vue3 + Element Plus 的【微短剧剧本智能创作与分镜生产协同系统】设计与实现(含PRD/三端源码/大屏)
前端·人工智能·vue3
axiao922 分钟前
2026年呼和浩特集团品牌全域传播服务商推荐:GEO优化+短视频+网站+广告全链路机构
大数据·人工智能
吴声子夜歌24 分钟前
Java面试——Spark原理及应用(一)
java·面试·spark
朴实赋能24 分钟前
妇儿医院 AI 助手怎么落地?CareWork 本地化智能体的多 Agent 协同与合规边界设计
大数据·人工智能·腾讯云ai代码助手·ai 智能体·医疗多 agent 协同·妇儿医院 ai 助手·本地化部署 ai
慧一居士1 小时前
ThreadLocal 功能及使用场景介绍,使用详解
java
zh73142 小时前
typephp的编译核心phpx原理解析
android·java·开发语言
circuitsosk2 小时前
NL2SQL在工业级场景下的精度优化:Schema Linking + 动态Few-shot实战
人工智能·python·sql·大模型·nl2sql
9000AI2 小时前
9000AI如何工业化生产流量?高质量规模生产与矩阵化饱和覆盖
人工智能
字节数据平台3 小时前
iDA:从 ChatBI 到专业数据分析助手的演进之路
大数据·人工智能·机器学习·数据分析