在Java中使用OpenCV进行图片翻转和旋转是一种基本的图像处理技术,广泛应用于计算机视觉、图像编辑和人工智能领域。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了许多常见的图像处理和分析功能,旨在为实时的图像处理提供高效能的解决方案。
Core.flip
函数可以对图像进行沿x轴、y轴或两者都翻转的操作
Core.flip(Mat src, Mat dst, int flipCode)
参数说明:
此段代码先读取图像,然后创建一个空图像,然后对图像进行垂直翻转,将结果保存新创建的空图像,最后保存翻转后的这个图像到文件中
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
// 对图像进行水平翻转,将flipCode设置为0
Core.flip(src, dst, 0);
即先水平后垂直翻转,或者先垂直后水平翻转
对图像进行水平翻转,将flipCode设置为-1
Core.flip(src, dst, -1);
Imgproc.getRotationMatrix2D
是OpenCV库中用于创建二维旋转矩阵的函数。在图像处理中,旋转是一种基本的仿射变换,它可以使图像围绕某一个点进行旋转。
Imgproc.getRotationMatrix2D
函数可以帮助你生成一个旋转矩阵,然后你可以使用Imgproc.warpAffine
函数应用这个矩阵到图像上,以实现旋转的效果。
该函数的原型是:
Mat getRotationMatrix2D(Point center, double angle, double scale)
参数说明:
返回值:
函数返回一个2x3的浮点数矩阵(即OpenCV中的Mat对象)。这个矩阵就是所谓的仿射变换矩阵,你可以直接将它作为Imgproc.warpAffine
函数的参数来应用旋转。
getRotationMatrix2D
函数计算得到的矩阵可以实现旋转加上缩放的复合变换。
这个矩阵的形式通常如下所示:
[ α β (1-α)center.x - βcenter.y ]
[ -β α β*center.x + (1-α)*center.y ]
其中:
这个变换矩阵考虑了旋转和缩放两个因素,还考虑了旋转不会改变中心点坐标的事实。而warpAffine函数会使用这个矩阵来计算图像中每个新位置上的像素值。
简而言之,通过Imgproc.getRotationMatrix2D函数,你可以创建一个仿射变换矩阵,它定义了一个围绕某一点的旋转和缩放操作。这个矩阵之后可以被用于Imgproc.warpAffine函数,以实现图像的旋转和缩放。
在Java中使用OpenCV进行图片旋转的步骤:
以下是一个旋转图片的具体代码示例:
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度的图片和两轴翻转的图片方向一样