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 还有一个重载版本,它接受线型和偏移量:
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: 点坐标中小数点后的位数。
绘制线
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 还有一个重载版本,它允许你指定线条类型和点坐标的小数位:
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 位。这可以用来精确绘制直线,特别是当你在一个更精细的网格中工作时。
绘制圆形
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 函数也可以通过指定线条类型来绘制:
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 位。这可以用来精确绘制圆形,尤其是在需要超高精度定位时。
绘制椭圆
Imgproc.ellipse(image, ellipseCenter, axes, 45, 0, 360, ellipseColor, 2);
添加文本
Imgproc.putText(image, text, textOrg, fontFace, fontScale, textColor, 2);
代码
这段代码首先加载了OpenCV的本地库,然后创建了一个400x400像素的黑色图像。之后,在图像上绘制了一个绿色的矩形、一个蓝色的斜线、一个红色的圆形、一个黄色的椭圆形,并添加了白色的文本“OpenCV”。
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);
}
}