|
@@ -19,8 +19,8 @@ public class CornerCheck {
|
|
|
private static int EXPAND_SIZE = 3;
|
|
|
public static void main(String[] args) {
|
|
|
// harris();
|
|
|
-// detectConers();
|
|
|
- channelSplit();
|
|
|
+ detectConers();
|
|
|
+// channelSplit();
|
|
|
}
|
|
|
|
|
|
public static void channelSplit() {
|
|
@@ -45,13 +45,27 @@ public class CornerCheck {
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
try {
|
|
|
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
|
|
-
|
|
|
- final int maxCorners = 50, blockSize = 3;
|
|
|
- final double qualityLevel = 0.01, minDistance = 20.0, k = 0.04;
|
|
|
+ Mat src = Imgcodecs.imread("D:\\data\\images\\163.jpg");
|
|
|
+ if (src.empty()) {
|
|
|
+ throw new Exception("no file");
|
|
|
+ }
|
|
|
+ for (int i = 0; i < src.cols(); i++) {
|
|
|
+ for (int j = 0; j < src.rows(); j++) {
|
|
|
+ if (i > 160 && i < 470 && j > 250 && j < 750) {
|
|
|
+ Imgproc.circle(src, new Point(i, j), 1, new Scalar(0, 236, 2), Imgproc.FILLED);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ final int maxCorners = 100, blockSize = 5;
|
|
|
+ final double qualityLevel = 0.04, minDistance = 20.0, k = 0.04;
|
|
|
final boolean useHarrisDetector = false;
|
|
|
MatOfPoint corners = new MatOfPoint();
|
|
|
-
|
|
|
- Mat src = Imgcodecs.imread("D:\\data\\235.jpg");
|
|
|
+ //卷积
|
|
|
+ Mat kernel = new Mat(3, 3, CvType.CV_16SC1);
|
|
|
+ kernel.put(0, 0, 0, -1, 0, -1, 5, -1, 0, -1, 0);
|
|
|
+ Imgproc.filter2D(src, src, src.depth(), kernel);
|
|
|
+ //降噪
|
|
|
+ Imgproc.GaussianBlur(src, src, new Size(3, 3), 0, 0, 1);
|
|
|
if (src.empty()) {
|
|
|
throw new Exception("no file");
|
|
|
}
|
|
@@ -60,12 +74,26 @@ public class CornerCheck {
|
|
|
//灰度
|
|
|
Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGB2GRAY);
|
|
|
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);
|
|
|
+ //归一处理
|
|
|
+// Core.normalize(gray,gray);
|
|
|
+ //Sobel算子
|
|
|
+ Mat grad_x = new Mat(), grad_y = new Mat();
|
|
|
+ Mat abs_grad_x = new Mat(), abs_grad_y = new Mat();
|
|
|
+ int scale = 1;
|
|
|
+ int delta = 0;
|
|
|
+ //Gradient X
|
|
|
+ Imgproc.Sobel(gray, grad_x, CvType.CV_16S, 1, 0, 3, scale, delta, 1);
|
|
|
+ //Gradient y
|
|
|
+ Imgproc.Sobel(gray, grad_y, CvType.CV_16S, 0, 1, 3, scale, delta, 1);
|
|
|
+
|
|
|
+ Core.convertScaleAbs(grad_x, abs_grad_x);
|
|
|
+ Core.convertScaleAbs(grad_y, abs_grad_y);
|
|
|
+
|
|
|
+ /// Total Gradient (approximate)
|
|
|
+ Mat grad = new Mat();
|
|
|
+ Core.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);
|
|
|
+ Imgcodecs.imwrite("D:\\data\\shark.jpg", grad);
|
|
|
+ Imgproc.goodFeaturesToTrack(grad, corners, maxCorners, qualityLevel, minDistance, new Mat(new Size(grad.width(), grad.height()), CvType.CV_8UC1), blockSize, useHarrisDetector, k);
|
|
|
Point[] pCorners = corners.toArray();
|
|
|
List<Point> pointList = new ArrayList<>();
|
|
|
double maxX = 0d;
|
|
@@ -73,7 +101,7 @@ public class CornerCheck {
|
|
|
double minX = 10000d;
|
|
|
double minY = 100000d;
|
|
|
for (int i = 0; i < pCorners.length; i++) {
|
|
|
- Imgproc.circle(dst, pCorners[i], 4, new Scalar(0, 0, 0), Imgproc.FILLED);
|
|
|
+ Imgproc.circle(dst, pCorners[i], 4, new Scalar(255, 0, 255), Imgproc.FILLED);
|
|
|
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;
|
|
@@ -144,25 +172,57 @@ public class CornerCheck {
|
|
|
return matCornerList;
|
|
|
}
|
|
|
|
|
|
- public static List<Point> detectConerList() {
|
|
|
+ public static List<Point> detectConerList(String filePath) {
|
|
|
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 double qualityLevel = 0.01, minDistance = 10.0, k = 0.04;
|
|
|
final boolean useHarrisDetector = false;
|
|
|
MatOfPoint corners = new MatOfPoint();
|
|
|
|
|
|
- Mat src = Imgcodecs.imread("D:\\data\\167.jpg");
|
|
|
+ Mat src = Imgcodecs.imread(filePath);
|
|
|
+// for (int i=0;i<src.cols();i++){
|
|
|
+// for(int j=0;j<src.rows();j++){
|
|
|
+// if (i > 160 && i < 470 && j > 250 && j < 750) {
|
|
|
+// Imgproc.circle(src, new Point(i,j), 1, new Scalar(0, 236, 2), Imgproc.FILLED);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+ //卷积
|
|
|
+ Mat kernel = new Mat(3, 3, CvType.CV_16SC1);
|
|
|
+ kernel.put(0, 0, 0, -1, 0, -1, 5, -1, 0, -1, 0);
|
|
|
+ Imgproc.filter2D(src, src, src.depth(), kernel);
|
|
|
+ //降噪
|
|
|
+ Imgproc.GaussianBlur(src, src, new Size(3, 3), 0, 0, 1);
|
|
|
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);
|
|
|
+ //归一处理
|
|
|
+// Core.normalize(gray,gray);
|
|
|
+ //Sobel算子
|
|
|
+ Mat grad_x = new Mat(), grad_y = new Mat();
|
|
|
+ Mat abs_grad_x = new Mat(), abs_grad_y = new Mat();
|
|
|
+ int scale = 1;
|
|
|
+ int delta = 0;
|
|
|
+ //Gradient X
|
|
|
+ Imgproc.Sobel(gray, grad_x, CvType.CV_16S, 1, 0, 3, scale, delta, 1);
|
|
|
+ //Gradient y
|
|
|
+ Imgproc.Sobel(gray, grad_y, CvType.CV_16S, 0, 1, 3, scale, delta, 1);
|
|
|
+
|
|
|
+ Core.convertScaleAbs(grad_x, abs_grad_x);
|
|
|
+ Core.convertScaleAbs(grad_y, abs_grad_y);
|
|
|
+
|
|
|
+ /// Total Gradient (approximate)
|
|
|
+ Mat grad = new Mat();
|
|
|
+ Core.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);
|
|
|
+ Imgproc.goodFeaturesToTrack(grad, corners, maxCorners, qualityLevel, minDistance, new Mat(), blockSize, useHarrisDetector, k);
|
|
|
+// Imgproc.goodFeaturesToTrack(gray, corners, maxCorners,qualityLevel,minDistance,new Mat(), blockSize, useHarrisDetector, k);
|
|
|
Point[] pCorners = corners.toArray();
|
|
|
List<Point> pointList = new ArrayList<>();
|
|
|
double maxX = 0d;
|
|
@@ -193,10 +253,10 @@ public class CornerCheck {
|
|
|
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);
|
|
|
+// Imgproc.circle(dst, point, 10, new Scalar(0, 255, 255), Imgproc.FILLED);
|
|
|
} else {
|
|
|
cornerPoints.add(point);
|
|
|
- Imgproc.circle(dst, point, 4, new Scalar(0, 0, 255), Imgproc.FILLED);
|
|
|
+// Imgproc.circle(dst, point, 10, new Scalar(0, 255, 255), Imgproc.FILLED);
|
|
|
}
|
|
|
}
|
|
|
Collections.sort(cornerPoints, new Comparator<Point>() {
|
|
@@ -220,6 +280,7 @@ public class CornerCheck {
|
|
|
}
|
|
|
//右下
|
|
|
result.add(new Point(cornerPoints.get(3).x + EXPAND_SIZE, cornerPoints.get(3).y + EXPAND_SIZE));
|
|
|
+// Imgcodecs.imwrite("d://data/111.jpg",dst);
|
|
|
return result;
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|