在Java中使用 Open CV進(jìn)行圖片翻轉(zhuǎn)和圖片旋轉(zhuǎn)
前言
在Java中使用OpenCV進(jìn)行圖片翻轉(zhuǎn)和旋轉(zhuǎn)是一種基本的圖像處理技術(shù),廣泛應(yīng)用于計(jì)算機(jī)視覺、圖像編輯和人工智能領(lǐng)域。OpenCV(Open Source Computer Vision Library)是一個(gè)開源的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,它提供了許多常見的圖像處理和分析功能,旨在為實(shí)時(shí)的圖像處理提供高效能的解決方案。
圖片翻轉(zhuǎn)
函數(shù)
Core.flip
函數(shù)可以對(duì)圖像進(jìn)行沿x軸、y軸或兩者都翻轉(zhuǎn)的操作
Core.flip(Mat src, Mat dst, int flipCode)
參數(shù)說明:
- Mat src: 原始圖像(輸入圖像)。
- Mat dst: 翻轉(zhuǎn)后的圖像將存儲(chǔ)在這里(輸出圖像)。它需要提前初始化。
- int flipCode: 控制翻轉(zhuǎn)方向的值。
- flipCode = 0:沿x軸翻轉(zhuǎn)(垂直翻轉(zhuǎn))。
- flipCode > 0:沿y軸翻轉(zhuǎn)(水平翻轉(zhuǎn))。
- flipCode < 0:沿兩軸翻轉(zhuǎn)(即先水平后垂直翻轉(zhuǎn),或者先垂直后水平翻轉(zhuǎn))
代碼
此段代碼先讀取圖像,然后創(chuàng)建一個(gè)空?qǐng)D像,然后對(duì)圖像進(jìn)行垂直翻轉(zhuǎn),將結(jié)果保存新創(chuàng)建的空?qǐng)D像,最后保存翻轉(zhuǎn)后的這個(gè)圖像到文件中
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()會(huì)返回true
if (src.empty()) {
System.out.println("Error: Image cannot be loaded!");
return;
}
// 創(chuàng)建一個(gè)空的圖像用于存放翻轉(zhuǎn)后的結(jié)果
Mat dst = new Mat();
// 對(duì)圖像進(jìn)行垂直翻轉(zhuǎn)
Core.flip(src, dst, 0);
// 保存翻轉(zhuǎn)后的圖像
Imgcodecs.imwrite(outPut, dst); // 替換為你的輸出圖像路徑
}
}
示例
- 可以看到圖片沿水平方向進(jìn)行了翻轉(zhuǎn)
其它翻轉(zhuǎn)方向
垂直翻轉(zhuǎn)
沿x軸翻轉(zhuǎn),即圖像進(jìn)行水平翻轉(zhuǎn),將flipCode設(shè)置為0
// 對(duì)圖像進(jìn)行水平翻轉(zhuǎn),將flipCode設(shè)置為0
Core.flip(src, dst, 0);
兩軸翻轉(zhuǎn)
即先水平后垂直翻轉(zhuǎn),或者先垂直后水平翻轉(zhuǎn)
對(duì)圖像進(jìn)行水平翻轉(zhuǎn),將flipCode設(shè)置為-1
Core.flip(src, dst, -1);
圖片旋轉(zhuǎn)
函數(shù)
Imgproc.getRotationMatrix2D
是OpenCV庫中用于創(chuàng)建二維旋轉(zhuǎn)矩陣的函數(shù)。在圖像處理中,旋轉(zhuǎn)是一種基本的仿射變換,它可以使圖像圍繞某一個(gè)點(diǎn)進(jìn)行旋轉(zhuǎn)。Imgproc.getRotationMatrix2D
函數(shù)可以幫助你生成一個(gè)旋轉(zhuǎn)矩陣,然后你可以使用Imgproc.warpAffine
函數(shù)應(yīng)用這個(gè)矩陣到圖像上,以實(shí)現(xiàn)旋轉(zhuǎn)的效果。
該函數(shù)的原型是:
Mat getRotationMatrix2D(Point center, double angle, double scale)
參數(shù)說明:
- center: 旋轉(zhuǎn)的中心點(diǎn),通常是圖像的中心,你可以指定任何點(diǎn)作為旋轉(zhuǎn)的中心。
- angle: 旋轉(zhuǎn)角度,以度為單位。正值表示逆時(shí)針旋轉(zhuǎn),負(fù)值表示順時(shí)針旋轉(zhuǎn)。
- scale: 圖像縮放的比例因子。如果不希望在旋轉(zhuǎn)時(shí)改變圖像的尺寸,這個(gè)值應(yīng)該設(shè)置為1.0。如果你想在旋轉(zhuǎn)的同時(shí)縮小或放大圖像,可以設(shè)置不同的值。
返回值:
函數(shù)返回一個(gè)2x3的浮點(diǎn)數(shù)矩陣(即OpenCV中的Mat對(duì)象)。這個(gè)矩陣就是所謂的仿射變換矩陣,你可以直接將它作為Imgproc.warpAffine
函數(shù)的參數(shù)來應(yīng)用旋轉(zhuǎn)。getRotationMatrix2D
函數(shù)計(jì)算得到的矩陣可以實(shí)現(xiàn)旋轉(zhuǎn)加上縮放的復(fù)合變換。
這個(gè)矩陣的形式通常如下所示:
[ α β (1-α)center.x - βcenter.y ]
[ -β α β*center.x + (1-α)*center.y ]
其中:
- α = scale * cos(θ)
- β = scale * sin(θ)
- θ 是旋轉(zhuǎn)角度,此處使用的是逆時(shí)針定義。
這個(gè)變換矩陣考慮了旋轉(zhuǎn)和縮放兩個(gè)因素,還考慮了旋轉(zhuǎn)不會(huì)改變中心點(diǎn)坐標(biāo)的事實(shí)。而warpAffine函數(shù)會(huì)使用這個(gè)矩陣來計(jì)算圖像中每個(gè)新位置上的像素值。
簡(jiǎn)而言之,通過Imgproc.getRotationMatrix2D函數(shù),你可以創(chuàng)建一個(gè)仿射變換矩陣,它定義了一個(gè)圍繞某一點(diǎn)的旋轉(zhuǎn)和縮放操作。這個(gè)矩陣之后可以被用于Imgproc.warpAffine函數(shù),以實(shí)現(xiàn)圖像的旋轉(zhuǎn)和縮放。
代碼
在Java中使用OpenCV進(jìn)行圖片旋轉(zhuǎn)的步驟:
- 加載OpenCV庫:在你的Java代碼中,使用System.loadLibrary(Core.NATIVE_LIBRARY_NAME);來加載OpenCV庫。
- 讀取圖片:使用Imgcodecs.imread方法來讀取圖片。
- 創(chuàng)建旋轉(zhuǎn)矩陣:使用Imgproc.getRotationMatrix2D來創(chuàng)建旋轉(zhuǎn)矩陣。這需要中心點(diǎn)坐標(biāo)、旋轉(zhuǎn)角度和縮放因子。
- 應(yīng)用旋轉(zhuǎn):應(yīng)用旋轉(zhuǎn)矩陣到讀取的圖片上,使用Imgproc.warpAffine方法。
- 保存圖片:使用Imgcodecs.imwrite來保存修改后的圖片。
以下是一個(gè)旋轉(zhuǎn)圖片的具體代碼示例:
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()會(huì)返回true
if (src.empty()) {
System.out.println("Error: Image cannot be loaded!");
return;
}
// 圖片的中心點(diǎn)
Point center = new Point(src.cols() / 2, src.rows() / 2);
// 旋轉(zhuǎn)矩陣
Mat rotationMatrix = Imgproc.getRotationMatrix2D(center, 180, 1); // 90度旋轉(zhuǎn)
// 旋轉(zhuǎn)后的圖片大小
Size rotatedSize = new Size(src.cols(), src.rows());
// 應(yīng)用旋轉(zhuǎn)
Mat dst = new Mat();
Imgproc.warpAffine(src, dst, rotationMatrix, rotatedSize, Imgproc.INTER_LINEAR);
// 保存旋轉(zhuǎn)后的圖片
Imgcodecs.imwrite(outPut, dst);
}
}
示例
可以看到旋轉(zhuǎn)180度的圖片和兩軸翻轉(zhuǎn)的圖片方向一樣文章來源:http://www.zghlxwxcb.cn/news/detail-789959.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-789959.html
Open CV 專欄導(dǎo)航
- (一)Open CV 在windows環(huán)境初始化和 Java 動(dòng)態(tài)庫加載方式介紹
- (二)Open CV 從基本概念到實(shí)踐操作
- (三)使用 Open CV 在 Java 中進(jìn)行基本的圖片縮放操作
- (四)使用 Open CV 在 Java 中進(jìn)行基本的圖片模糊處理
- (五)Java 使用 Open CV 的繪圖函數(shù)
- (六)在Java中使用 Open CV進(jìn)行圖片翻轉(zhuǎn)和圖片旋轉(zhuǎn)
- (七)學(xué)習(xí) OpenCV 的圖像增強(qiáng)和邊緣檢測(cè)功能
到了這里,關(guān)于Open CV 圖像處理基礎(chǔ):(六)在Java中使用 Open CV進(jìn)行圖片翻轉(zhuǎn)和圖片旋轉(zhuǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!