|
@@ -1,12 +1,12 @@
|
|
|
package org.jeecg.modules.demo.opencv;
|
|
|
|
|
|
+import cn.com.ctop.common.module.utils.ResultMapUtils;
|
|
|
+import cn.com.ctop.common.module.utils.StatusCode;
|
|
|
import org.opencv.core.*;
|
|
|
-import org.opencv.highgui.HighGui;
|
|
|
import org.opencv.imgcodecs.Imgcodecs;
|
|
|
import org.opencv.imgproc.Imgproc;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* 角点检测
|
|
@@ -16,48 +16,33 @@ public class CornerCheck {
|
|
|
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
|
|
}
|
|
|
|
|
|
+ private static int EXPAND_SIZE = 3;
|
|
|
public static void main(String[] args) {
|
|
|
// harris();
|
|
|
- detectConers();
|
|
|
-// getConers();
|
|
|
+// detectConers();
|
|
|
+ channelSplit();
|
|
|
}
|
|
|
|
|
|
- public static void getConers() {
|
|
|
- Mat src = Imgcodecs.imread("D:\\data\\167.jpg");
|
|
|
- List<Point> points = new ArrayList<>();
|
|
|
- int minX = 10000;
|
|
|
- int minY = 10000;
|
|
|
- int maxX = 0;
|
|
|
- int maxY = 0;
|
|
|
- for (int j = 0; j < src.rows(); j++) {
|
|
|
- for (int i = 0; i < src.cols(); i++) {
|
|
|
- double[] details = src.get(j, i);
|
|
|
- if (null != details && details.length > 0) {
|
|
|
- if (details[0] == 0 && details[1] == 236 && details[2] == 2) {
|
|
|
- System.out.print("{" + j + "," + i + "}:");
|
|
|
- Point point = new Point();
|
|
|
- point.x = i;
|
|
|
- point.y = j;
|
|
|
- if (minX >= i) {
|
|
|
- minX = i;
|
|
|
- }
|
|
|
- if (maxX <= i) {
|
|
|
- maxX = i;
|
|
|
- }
|
|
|
- if (maxY <= j) {
|
|
|
- maxY = j;
|
|
|
- }
|
|
|
- points.add(point);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ public static void channelSplit() {
|
|
|
+ Mat srcImage = Imgcodecs.imread("D:\\data\\235.jpg", Imgcodecs.IMREAD_COLOR);
|
|
|
+ List<Mat> channels = new ArrayList<>();
|
|
|
+ Core.split(srcImage, channels);
|
|
|
|
|
|
- System.out.println(minX);
|
|
|
+ //创建类型为Mat,数组长度为3的变量mbgr
|
|
|
+ List<Mat> mbgr = new ArrayList<>();
|
|
|
+ Mat hideChannel = new Mat(srcImage.size(), CvType.CV_8UC1, new Scalar(0));
|
|
|
+
|
|
|
+ Mat imageB = new Mat(srcImage.size(), CvType.CV_8UC3);
|
|
|
+ mbgr.add(channels.get(0));
|
|
|
+ mbgr.add(hideChannel);
|
|
|
+ mbgr.add(hideChannel);
|
|
|
+ Core.merge(mbgr, imageB);
|
|
|
+ Imgcodecs.imwrite("D:\\data\\imageB.jpg", imageB);
|
|
|
|
|
|
}
|
|
|
|
|
|
- public static void detectConers() {
|
|
|
+ public static Map<String, Object> detectConers() {
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
try {
|
|
|
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
|
|
|
|
@@ -66,65 +51,179 @@ public class CornerCheck {
|
|
|
final boolean useHarrisDetector = false;
|
|
|
MatOfPoint corners = new MatOfPoint();
|
|
|
|
|
|
- Mat src = Imgcodecs.imread("D:\\data\\167.jpg");
|
|
|
+ Mat src = Imgcodecs.imread("D:\\data\\235.jpg");
|
|
|
if (src.empty()) {
|
|
|
throw new Exception("no file");
|
|
|
}
|
|
|
Mat dst = src.clone();
|
|
|
Mat gray = new Mat();
|
|
|
+ //灰度
|
|
|
Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGB2GRAY);
|
|
|
- Imgproc.goodFeaturesToTrack(gray, corners, maxCorners, qualityLevel, minDistance,
|
|
|
+ Imgcodecs.imwrite("D:\\data\\gray.jpg", gray);
|
|
|
+ Mat binary = new Mat();
|
|
|
+ //二值化
|
|
|
+ Imgproc.threshold(gray, binary, 1, 255, Imgproc.THRESH_TOZERO);
|
|
|
+ Imgcodecs.imwrite("D:\\data\\binary.jpg", binary);
|
|
|
+ Imgproc.goodFeaturesToTrack(binary, corners, maxCorners, qualityLevel, minDistance,
|
|
|
new Mat(), blockSize, useHarrisDetector, k);
|
|
|
Point[] pCorners = corners.toArray();
|
|
|
-
|
|
|
+ List<Point> pointList = new ArrayList<>();
|
|
|
+ double maxX = 0d;
|
|
|
+ double maxY = 0d;
|
|
|
+ double minX = 10000d;
|
|
|
+ double minY = 100000d;
|
|
|
for (int i = 0; i < pCorners.length; i++) {
|
|
|
- double[] details = src.get((int) pCorners[i].y, (int) pCorners[i].x);
|
|
|
+ Imgproc.circle(dst, pCorners[i], 4, new Scalar(0, 0, 0), Imgproc.FILLED);
|
|
|
if (pCorners[i].x > 130 && pCorners[i].x < 570 && pCorners[i].y > 200 && pCorners[i].y < 850) {
|
|
|
- System.out.println(pCorners[i].toString());
|
|
|
- Imgproc.circle(dst, pCorners[i], 4, new Scalar(0, 0, 255), Imgproc.FILLED);
|
|
|
+ if (pCorners[i].x >= maxX) {
|
|
|
+ maxX = pCorners[i].x;
|
|
|
+ }
|
|
|
+ if (pCorners[i].y >= maxY) {
|
|
|
+ maxY = pCorners[i].y;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pCorners[i].x <= minX) {
|
|
|
+ minX = pCorners[i].x;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pCorners[i].y <= minY) {
|
|
|
+ minY = pCorners[i].y;
|
|
|
+ }
|
|
|
+ pointList.add(pCorners[i]);
|
|
|
}
|
|
|
}
|
|
|
+ Imgcodecs.imwrite("D:\\data\\allConers.jpg", dst);
|
|
|
+ List<Point> cornerPoints = new ArrayList<>();
|
|
|
+ for (Point point : pointList) {
|
|
|
+ double getX = point.x;
|
|
|
+ double getY = point.y;
|
|
|
+ if ((getY >= (minY + 20) && getY <= (maxY - 20))) {
|
|
|
+ Imgproc.circle(dst, point, 4, new Scalar(255, 255, 255), Imgproc.FILLED);
|
|
|
+ } else {
|
|
|
+ cornerPoints.add(point);
|
|
|
+ Imgproc.circle(dst, point, 4, new Scalar(0, 0, 0), Imgproc.FILLED);
|
|
|
+ }
|
|
|
+ }
|
|
|
+// {139.0, 240.0} 左上 {144.0, 837.0} 左下
|
|
|
+// {482.0, 238.0} 右上 {532.0, 825.0} 右下
|
|
|
+ Collections.sort(cornerPoints, new Comparator<Point>() {
|
|
|
+ @Override
|
|
|
+ public int compare(Point p1, Point p2) {
|
|
|
+ return (int) (p1.x + p1.y - p2.x - p2.y);
|
|
|
+ }
|
|
|
+ });
|
|
|
Imgcodecs.imwrite("D:\\data\\coners.jpg", dst);
|
|
|
+ for (Point p : cornerPoints) {
|
|
|
+ System.out.println(p.toString());
|
|
|
+ }
|
|
|
+ result.put("leftTop", cornerPoints.get(0));
|
|
|
+ result.put("rightBottom", cornerPoints.get(3));
|
|
|
+ if (cornerPoints.get(2).y > cornerPoints.get(1).y) {
|
|
|
+ result.put("rightTop", cornerPoints.get(1));
|
|
|
+ result.put("leftBottom", cornerPoints.get(2));
|
|
|
+ } else {
|
|
|
+ result.put("rightTop", cornerPoints.get(2));
|
|
|
+ result.put("leftBottom", cornerPoints.get(1));
|
|
|
+ }
|
|
|
+ ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
|
|
|
+ System.out.println(result.toString());
|
|
|
+ return result;
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
- System.out.println("例外:" + e);
|
|
|
+ ResultMapUtils.setResultMap(result, StatusCode.COMMON_SERVER_ERROR);
|
|
|
+ return result;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * OpenCV-4.1.0 Harris 角点检测
|
|
|
- *
|
|
|
- * @return void
|
|
|
- * @Author: hyacinth
|
|
|
- * @Title: harris
|
|
|
- * @Description: TODO
|
|
|
- * @date: 2019年8月26日 下午10:13:10
|
|
|
- */
|
|
|
- public static void harris() {
|
|
|
- //载入图片
|
|
|
- Mat src = Imgcodecs.imread("D:\\data\\167.jpg");
|
|
|
- Mat gray = new Mat();
|
|
|
- Mat dst = new Mat();
|
|
|
- //灰度处理
|
|
|
- Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
|
|
|
- HighGui.imshow("灰度处理", gray);
|
|
|
- Imgproc.cornerHarris(gray, dst, 2, 3, 0.06);
|
|
|
- HighGui.imshow("角点检测", dst);
|
|
|
- Core.normalize(dst, dst, 0, 255, Core.NORM_MINMAX, -1, new Mat());
|
|
|
- HighGui.imshow("归一处理", dst);
|
|
|
- Core.convertScaleAbs(dst, dst);
|
|
|
-
|
|
|
- Mat result = src.clone();
|
|
|
- for (int i = 0, row = result.rows(); i < row; i++) {
|
|
|
- for (int j = 0, col = result.cols(); j < col; j++) {
|
|
|
- if (dst.get(i, j).clone()[0] > 180) {
|
|
|
- Imgproc.circle(result, new Point(j, i), 1, new Scalar(0, 0, 255), Imgproc.FILLED);
|
|
|
- System.out.println("像素点位:" + j + "," + i);
|
|
|
+ public static List<Point> matCornerList(List<Point> points) {
|
|
|
+ List<Point> matCornerList = new ArrayList<>();
|
|
|
+ matCornerList.add(points.get(0));
|
|
|
+ matCornerList.add(points.get(1));
|
|
|
+ matCornerList.add(points.get(3));
|
|
|
+ matCornerList.add(points.get(2));
|
|
|
+ return matCornerList;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static List<Point> detectConerList() {
|
|
|
+ List<Point> result = new ArrayList<>();
|
|
|
+ try {
|
|
|
+ System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
|
|
+
|
|
|
+ final int maxCorners = 50, blockSize = 3;
|
|
|
+ final double qualityLevel = 0.01, minDistance = 20.0, k = 0.04;
|
|
|
+ final boolean useHarrisDetector = false;
|
|
|
+ MatOfPoint corners = new MatOfPoint();
|
|
|
+
|
|
|
+ Mat src = Imgcodecs.imread("D:\\data\\167.jpg");
|
|
|
+ if (src.empty()) {
|
|
|
+ throw new Exception("no file");
|
|
|
+ }
|
|
|
+ Mat dst = src.clone();
|
|
|
+ Mat gray = new Mat();
|
|
|
+ Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGB2GRAY);
|
|
|
+ Imgproc.goodFeaturesToTrack(gray, corners, maxCorners, qualityLevel, minDistance,
|
|
|
+ new Mat(), blockSize, useHarrisDetector, k);
|
|
|
+ Point[] pCorners = corners.toArray();
|
|
|
+ List<Point> pointList = new ArrayList<>();
|
|
|
+ double maxX = 0d;
|
|
|
+ double maxY = 0d;
|
|
|
+ double minX = 10000d;
|
|
|
+ double minY = 100000d;
|
|
|
+ for (int i = 0; i < pCorners.length; i++) {
|
|
|
+ if (pCorners[i].x > 130 && pCorners[i].x < 570 && pCorners[i].y > 200 && pCorners[i].y < 850) {
|
|
|
+ if (pCorners[i].x >= maxX) {
|
|
|
+ maxX = pCorners[i].x;
|
|
|
+ }
|
|
|
+ if (pCorners[i].y >= maxY) {
|
|
|
+ maxY = pCorners[i].y;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pCorners[i].x <= minX) {
|
|
|
+ minX = pCorners[i].x;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pCorners[i].y <= minY) {
|
|
|
+ minY = pCorners[i].y;
|
|
|
+ }
|
|
|
+ pointList.add(pCorners[i]);
|
|
|
}
|
|
|
}
|
|
|
+ List<Point> cornerPoints = new ArrayList<>();
|
|
|
+ for (Point point : pointList) {
|
|
|
+ double getX = point.x;
|
|
|
+ double getY = point.y;
|
|
|
+ if ((getY >= (minY + 20) && getY <= (maxY - 20))) {
|
|
|
+ Imgproc.circle(dst, point, 4, new Scalar(255, 255, 255), Imgproc.FILLED);
|
|
|
+ } else {
|
|
|
+ cornerPoints.add(point);
|
|
|
+ Imgproc.circle(dst, point, 4, new Scalar(0, 0, 255), Imgproc.FILLED);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Collections.sort(cornerPoints, new Comparator<Point>() {
|
|
|
+ @Override
|
|
|
+ public int compare(Point p1, Point p2) {
|
|
|
+ return (int) (p1.x + p1.y - p2.x - p2.y);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ //左上
|
|
|
+ result.add(new Point(cornerPoints.get(0).x - EXPAND_SIZE, cornerPoints.get(0).y - EXPAND_SIZE));
|
|
|
+ if (cornerPoints.get(2).y > cornerPoints.get(1).y) {
|
|
|
+ //右上
|
|
|
+ result.add(new Point(cornerPoints.get(1).x + EXPAND_SIZE, cornerPoints.get(1).y - EXPAND_SIZE));
|
|
|
+ //左下
|
|
|
+ result.add(new Point(cornerPoints.get(2).x - EXPAND_SIZE, cornerPoints.get(2).y + EXPAND_SIZE));
|
|
|
+ } else {
|
|
|
+ //右上
|
|
|
+ result.add(new Point(cornerPoints.get(2).x + EXPAND_SIZE, cornerPoints.get(2).y - EXPAND_SIZE));
|
|
|
+ //左下
|
|
|
+ result.add(new Point(cornerPoints.get(1).x - EXPAND_SIZE, cornerPoints.get(1).y + EXPAND_SIZE));
|
|
|
+ }
|
|
|
+ //右下
|
|
|
+ result.add(new Point(cornerPoints.get(3).x + EXPAND_SIZE, cornerPoints.get(3).y + EXPAND_SIZE));
|
|
|
+ return result;
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return result;
|
|
|
}
|
|
|
-
|
|
|
- HighGui.imshow("Harris 角点检测", result);
|
|
|
- HighGui.waitKey(0);
|
|
|
}
|
|
|
}
|