在Java中使用 Open CV进行图片翻转和图片旋转
目录
- [在Java中使用 Open CV进行图片翻转和图片旋转](#在Java中使用 Open CV进行图片翻转和图片旋转)
前言
在Java中使用OpenCV进行图片翻转和旋转是一种基本的图像处理技术,广泛应用于计算机视觉、图像编辑和人工智能领域。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了许多常见的图像处理和分析功能,旨在为实时的图像处理提供高效能的解决方案。
图片翻转
函数
Core.flip
函数可以对图像进行沿x轴、y轴或两者都翻转的操作
java
Core.flip(Mat src, Mat dst, int flipCode)
参数说明:
- Mat src: 原始图像(输入图像)。
- Mat dst: 翻转后的图像将存储在这里(输出图像)。它需要提前初始化。
- int flipCode: 控制翻转方向的值。
- flipCode = 0:沿x轴翻转(垂直翻转)。
- flipCode > 0:沿y轴翻转(水平翻转)。
- flipCode < 0:沿两轴翻转(即先水平后垂直翻转,或者先垂直后水平翻转)
代码
此段代码先读取图像,然后创建一个空图像,然后对图像进行垂直翻转,将结果保存新创建的空图像,最后保存翻转后的这个图像到文件中
java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class ImageFlip {
static {
// 加载 OpenCV 的本地库
System.load("D:/dll/x64/opencv_java440.dll");
}
public static void main(String[] args) {
String old = "D:/to/A.jpg";
String outPut = "D:/to/A_0.jpg";
// 读取图像
Mat src = Imgcodecs.imread(old); // 替换为你的图像路径
// 如果图像未找到或无法读取,则src.empty()会返回true
if (src.empty()) {
System.out.println("Error: Image cannot be loaded!");
return;
}
// 创建一个空的图像用于存放翻转后的结果
Mat dst = new Mat();
// 对图像进行垂直翻转
Core.flip(src, dst, 0);
// 保存翻转后的图像
Imgcodecs.imwrite(outPut, dst); // 替换为你的输出图像路径
}
}
示例
- 可以看到图片沿水平方向进行了翻转
其它翻转方向
垂直翻转
沿x轴翻转,即图像进行水平翻转,将flipCode设置为0
java
// 对图像进行水平翻转,将flipCode设置为0
Core.flip(src, dst, 0);
两轴翻转
即先水平后垂直翻转,或者先垂直后水平翻转
对图像进行水平翻转,将flipCode设置为-1
java
Core.flip(src, dst, -1);
图片旋转
函数
Imgproc.getRotationMatrix2D
是OpenCV库中用于创建二维旋转矩阵的函数。在图像处理中,旋转是一种基本的仿射变换,它可以使图像围绕某一个点进行旋转。
Imgproc.getRotationMatrix2D
函数可以帮助你生成一个旋转矩阵,然后你可以使用Imgproc.warpAffine
函数应用这个矩阵到图像上,以实现旋转的效果。
该函数的原型是:
java
Mat getRotationMatrix2D(Point center, double angle, double scale)
参数说明:
- center: 旋转的中心点,通常是图像的中心,你可以指定任何点作为旋转的中心。
- angle: 旋转角度,以度为单位。正值表示逆时针旋转,负值表示顺时针旋转。
- scale: 图像缩放的比例因子。如果不希望在旋转时改变图像的尺寸,这个值应该设置为1.0。如果你想在旋转的同时缩小或放大图像,可以设置不同的值。
返回值:
函数返回一个2x3的浮点数矩阵(即OpenCV中的Mat对象)。这个矩阵就是所谓的仿射变换矩阵,你可以直接将它作为Imgproc.warpAffine
函数的参数来应用旋转。
getRotationMatrix2D
函数计算得到的矩阵可以实现旋转加上缩放的复合变换。
这个矩阵的形式通常如下所示:
[ α β (1-α)center.x - β center.y ]
[ -β α β*center.x + (1-α)*center.y ]
其中:
- α = scale * cos(θ)
- β = scale * sin(θ)
- θ 是旋转角度,此处使用的是逆时针定义。
这个变换矩阵考虑了旋转和缩放两个因素,还考虑了旋转不会改变中心点坐标的事实。而warpAffine函数会使用这个矩阵来计算图像中每个新位置上的像素值。
简而言之,通过Imgproc.getRotationMatrix2D函数,你可以创建一个仿射变换矩阵,它定义了一个围绕某一点的旋转和缩放操作。这个矩阵之后可以被用于Imgproc.warpAffine函数,以实现图像的旋转和缩放。
代码
在Java中使用OpenCV进行图片旋转的步骤:
- 加载OpenCV库:在你的Java代码中,使用System.loadLibrary(Core.NATIVE_LIBRARY_NAME);来加载OpenCV库。
- 读取图片:使用Imgcodecs.imread方法来读取图片。
- 创建旋转矩阵:使用Imgproc.getRotationMatrix2D来创建旋转矩阵。这需要中心点坐标、旋转角度和缩放因子。
- 应用旋转:应用旋转矩阵到读取的图片上,使用Imgproc.warpAffine方法。
- 保存图片:使用Imgcodecs.imwrite来保存修改后的图片。
以下是一个旋转图片的具体代码示例:
java
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class ImageRotate {
static {
// 加载 OpenCV 的本地库
System.load("D:/dll/x64/opencv_java440.dll");
}
public static void main(String[] args) {
String old = "D:/to/A.jpg";
String outPut = "D:/to/A_Rotate.jpg";
// 读取图像
Mat src = Imgcodecs.imread(old); // 替换为你的图像路径
// 如果图像未找到或无法读取,则src.empty()会返回true
if (src.empty()) {
System.out.println("Error: Image cannot be loaded!");
return;
}
// 图片的中心点
Point center = new Point(src.cols() / 2, src.rows() / 2);
// 旋转矩阵
Mat rotationMatrix = Imgproc.getRotationMatrix2D(center, 180, 1); // 90度旋转
// 旋转后的图片大小
Size rotatedSize = new Size(src.cols(), src.rows());
// 应用旋转
Mat dst = new Mat();
Imgproc.warpAffine(src, dst, rotationMatrix, rotatedSize, Imgproc.INTER_LINEAR);
// 保存旋转后的图片
Imgcodecs.imwrite(outPut, dst);
}
}
示例
可以看到旋转180度的图片和两轴翻转的图片方向一样