diff --git a/src/main/java/Test.java b/src/main/java/Test.java index e975bf8..4ba0080 100644 --- a/src/main/java/Test.java +++ b/src/main/java/Test.java @@ -7,8 +7,6 @@ import org.opencv.core.Point; import org.opencv.core.Rect; import org.opencv.core.RotatedRect; import org.opencv.core.Scalar; -import org.opencv.core.Size; -import org.opencv.highgui.HighGui; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; @@ -139,21 +137,22 @@ public class Test extends DllLoad { Imgproc.line(src, point[2], point[3], new Scalar(0, 0, 255)); Imgproc.line(src, point[3], point[0], new Scalar(0, 0, 255)); - Mat dst = new Mat(src,rotatedRect.boundingRect()); + Mat dst = new Mat(src, rotatedRect.boundingRect()); show(dst); Mat dst2 = new Mat(dst.size(), dst.type()); //旋转中心点 - Point cp = new Point(src.width() / 2, src.height() / 2); + Point cp = new Point(dst.width() / 2, dst.height() / 2); + System.out.println(rotatedRect.angle); //旋转角度 - int angle = 45; + double angle = rotatedRect.angle - 90; //缩放系数 int scale = 1; //获取变换矩阵 Mat matrix2D = Imgproc.getRotationMatrix2D(cp, angle, scale); - Imgproc.warpAffine(dst,dst2,matrix2D,dst2.size(),Imgproc.INTER_NEAREST); + Imgproc.warpAffine(dst, dst2, matrix2D, dst2.size(), Imgproc.INTER_NEAREST); -// show(dst2); + show(dst2); // Mat mat = new Mat(); // Imgproc.Sobel(src, mat, -1, 0, 1); @@ -170,7 +169,8 @@ public class Test extends DllLoad { // Imgproc.drawContours(src, matOfPoints, -1, new Scalar(0, 255, 0), 1, Imgproc.LINE_AA); } - show(src); +// show(src); + System.exit(0); // // // 创建输出单通道图像 // Mat grayImage = new Mat(src.rows(), src.cols(), CvType.CV_8SC1); diff --git a/src/main/java/base/ImageGray.java b/src/main/java/base/ImageGray.java new file mode 100644 index 0000000..f4f2b6f --- /dev/null +++ b/src/main/java/base/ImageGray.java @@ -0,0 +1,25 @@ +package base; + +import org.opencv.core.Mat; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; + +import java.io.File; + +/** + * 图片转为灰色 + */ +public class ImageGray extends DllLoad { + + public static void main(String[] args) { + File file = new File("imgs/3.png"); + Mat src = Imgcodecs.imread(file.getAbsolutePath()); + + Mat dst = new Mat(); + //图片灰度化 https://blog.csdn.net/ren365880/article/details/103869207 + Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY); + + show(dst); + System.exit(0); + } +} diff --git a/src/main/java/base/ImageThreshold.java b/src/main/java/base/ImageThreshold.java new file mode 100644 index 0000000..e9cb177 --- /dev/null +++ b/src/main/java/base/ImageThreshold.java @@ -0,0 +1,46 @@ +package base; + +import org.opencv.core.Mat; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; + +import java.io.File; + +/** + * 图片二值化 + */ +public class ImageThreshold extends DllLoad { + + public static void main(String[] args) { + File file = new File("imgs/1.png"); + Mat src = Imgcodecs.imread(file.getAbsolutePath()); + + Mat gray = new Mat(); + //图片灰度化 + Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); + + {// 全局二值化 - 适应OTSU算法实 + //一般,我们不知道用什么阈值可以获得更好的二值化图像.OTSU会通过一系列计算,计算出,比较优的阈值(可以理解为,在 + //图像直方图中,如果存在两峰,那么,我们的阈值应该尽可能的在两峰之间的峰谷).因此,对于非双峰图,用这种方法可能效果 + //不太理想,OTSU是计算二值化的算法,计算二值化的算法有很多,一般使用OTSU + Mat dst = new Mat(); + Imgproc.threshold(gray, dst, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU); + show(dst); + } + + {// 全局二值化 - 不适应OTSU算法实 + // 这里指定127为阔值,127以下转为黑色,127以上转为255(白)色 + Mat dst2 = new Mat(); + Imgproc.threshold(gray, dst2, 127, 255, Imgproc.THRESH_BINARY); + show(dst2); + } + + {// 局部二值化 + Mat dst = new Mat(); + Imgproc.adaptiveThreshold(gray,dst,255,Imgproc.ADAPTIVE_THRESH_MEAN_C,Imgproc.THRESH_BINARY,11,2); + show(dst); + } + + System.exit(0); + } +}