x1ongzhu 6 лет назад
Родитель
Сommit
11ec569cf6

+ 132 - 5
src/main/java/com/izouma/awesomeadmin/util/VideoProcessTool.java

@@ -19,10 +19,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 import java.util.regex.Pattern;
 
 import static org.bytedeco.javacpp.lept.pixRead;
@@ -113,7 +110,7 @@ public class VideoProcessTool {
         String result = null;
         int m = inputImage.rows();
         int n = inputImage.cols();
-        Mat roi = inputImage.rowRange(0, (int) (m * 0.5)).colRange((int) (n * 0.5), n);
+        Mat roi = inputImage.rowRange(0, (int) (m * 0.4)).colRange((int) (n * 0.75), n);
 
         Mat resultGray = new Mat(roi.rows(), roi.cols(), CV_8U, new Scalar(0));
         HSVFilter(roi, resultGray, 25, 65, 40, 255, 130, 255);
@@ -165,6 +162,7 @@ public class VideoProcessTool {
             }
             rectangle(roi, textRect, new Scalar(0, 255, 0, 0), 2, LINE_AA, 0);
             result = doOCR(blurred);
+            imwrite("/Users/drew/Desktop/img/text.jpg", blurred);
             blurred.release();
         }
         roi.release();
@@ -231,6 +229,88 @@ public class VideoProcessTool {
         return result;
     }
 
+    public String extractRank1(Mat src) {
+        String result = null;
+        int m = src.rows();
+        int n = src.cols();
+        Mat roi = src.rowRange(0, (int) (m * 0.4)).colRange((int) (n * 0.75), n);
+        Mat filtered = rankFilter(roi);
+        Mat gray = new Mat();
+        adaptiveThreshold(filtered, gray, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 15, 12);
+        MatVector contours = new MatVector();
+        findContours(gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
+        List<Rect> rects = new ArrayList<>();
+        for (int i = 0; i < contours.size(); i++) {
+            Mat contour = contours.get(i);
+            Rect rect = boundingRect(contour);
+            rects.add(rect);
+            contour.release();
+        }
+        rects.sort((o1, o2) -> o2.area() - o1.area());
+        for (int i = 0; i < rects.size(); i++) {
+            Rect rect = rects.get(i);
+            if (i < 5) {
+                imwrite("/Users/drew/Desktop/img/" + System.currentTimeMillis() + ".jpg", filtered.rowRange(rect.y(), rect.y() + rect.height()).colRange(rect.x(), rect.x() + rect.width()));
+                String str = doOCR(filtered.rowRange(rect.y(), rect.y() + rect.height()).colRange(rect.x(), rect.x() + rect.width()));
+                System.out.println(str);
+                rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
+                if (str != null) {
+                    str = str.replaceAll("[ \n]", "");
+                    if (Pattern.matches("^第\\d{1,3}$", str)) {
+                        rectangle(roi, rect, new Scalar(0, 255, 0, 0), 2, LINE_AA, 0);
+                        result = str;
+                        break;
+                    }
+                }
+            }
+        }
+        filtered.release();
+        gray.release();
+        roi.release();
+        return result;
+    }
+
+    public String extractGameTime1(Mat src) {
+        String result = null;
+        int m = src.rows();
+        int n = src.cols();
+        Mat roi = src.rowRange((int) (m * 0.5), (int) (m * 0.8)).colRange((int) (n * 0.5), n);
+        Mat filtered = timeFilter(roi);
+        Mat gray = new Mat();
+        adaptiveThreshold(filtered, gray, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 15, 12);
+        MatVector contours = new MatVector();
+        findContours(gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
+        List<Rect> rects = new ArrayList<>();
+        for (int i = 0; i < contours.size(); i++) {
+            Mat contour = contours.get(i);
+            Rect rect = boundingRect(contour);
+            rects.add(rect);
+            contour.release();
+        }
+        rects.sort((o1, o2) -> o2.area() - o1.area());
+        for (int i = 0; i < rects.size(); i++) {
+            Rect rect = rects.get(i);
+            if (i < 5) {
+                imwrite("/Users/drew/Desktop/img/" + System.currentTimeMillis() + ".jpg", filtered.rowRange(rect.y(), rect.y() + rect.height()).colRange(rect.x(), rect.x() + rect.width()));
+                String str = doOCR(filtered.rowRange(rect.y(), rect.y() + rect.height()).colRange(rect.x(), rect.x() + rect.width()));
+                System.out.println(str);
+                rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
+                if (str != null) {
+                    str = str.replaceAll("[ \n]", "");
+                    if (Pattern.matches("((^([0-9]+[.][0-9]*))|(^\\d{1,2}))分钟", str)) {
+                        rectangle(roi, rect, new Scalar(0, 255, 0, 0), 2, LINE_AA, 0);
+                        result = str;
+                        break;
+                    }
+                }
+            }
+        }
+        filtered.release();
+        gray.release();
+        roi.release();
+        return result;
+    }
+
     private void dilate(Mat src, Mat dst, int dilation_size) {
         Mat dilationElement = getStructuringElement(MORPH_ELLIPSE,
                 new Size(2 * dilation_size + 1, 2 * dilation_size + 1),
@@ -268,12 +348,59 @@ public class VideoProcessTool {
                 }
             }
         }
+        imwrite("/Users/drew/Desktop/img/text0.jpg", resultGray);
         hsvImage.release();
         blurred.release();
         hsvIndexer.release();
         resultGrayIndexer.release();
     }
 
+    public Mat rankFilter(Mat src) {
+        Mat result = new Mat(src.rows(), src.cols(), CV_8UC1, new Scalar(0));
+        UByteRawIndexer srcIndexer = src.createIndexer();
+        UByteRawIndexer resultIndexer = result.createIndexer();
+        for (int i = 0; i < src.rows(); i++) {
+            for (int j = 0; j < src.cols(); j++) {
+                int db = Math.abs(srcIndexer.get(i, j, 0) - 12);
+                int dg = Math.abs(srcIndexer.get(i, j, 1) - 243);
+                int dr = Math.abs(srcIndexer.get(i, j, 2) - 252);
+
+                int gray = 255 - (db + dg + dr);
+                if (gray < 0) gray = 0;
+                if (gray > 255) gray = 255;
+                gray *= 1.2;
+                if (gray > 255) gray = 255;
+                resultIndexer.put(i, j, gray);
+            }
+        }
+        srcIndexer.release();
+        resultIndexer.release();
+        return result;
+    }
+
+    public Mat timeFilter(Mat src) {
+        Mat result = new Mat(src.rows(), src.cols(), CV_8UC1, new Scalar(0));
+        UByteRawIndexer srcIndexer = src.createIndexer();
+        UByteRawIndexer resultIndexer = result.createIndexer();
+        for (int i = 0; i < src.rows(); i++) {
+            for (int j = 0; j < src.cols(); j++) {
+                int db = Math.abs(srcIndexer.get(i, j, 0) - 36);
+                int dg = Math.abs(srcIndexer.get(i, j, 1) - 183);
+                int dr = Math.abs(srcIndexer.get(i, j, 2) - 230);
+
+                int gray = 255 - (db + dg + dr);
+                if (gray < 0) gray = 0;
+                if (gray > 255) gray = 255;
+                gray *= 1.2;
+                if (gray > 255) gray = 255;
+                resultIndexer.put(i, j, gray);
+            }
+        }
+        srcIndexer.release();
+        resultIndexer.release();
+        return result;
+    }
+
     private String doOCR(Mat img) {
         imwrite("/tmp/text.jpg", img);
         final tesseract.TessBaseAPI baseApi = new tesseract.TessBaseAPI();

+ 16 - 4
src/test/java/VideoProcessTest.java

@@ -37,15 +37,27 @@ public class VideoProcessTest {
 
     @Test
     public void testTime() {
-        Mat img = imread("/Users/drew/Pictures/Screenshots/record1553759305785-0001.jpg");
-        String time = videoProcessTool.extractGameTime(img);
+        Mat img = imread("/Users/drew/Pictures/Screenshots/2019-03-29-03-20-01-svu0rzwo-0001.jpg");
+        String time = videoProcessTool.extractGameTime1(img);
         System.out.println("time:" + time);
     }
 
     @Test
     public void testRank() {
-        Mat img = imread("/Users/drew/Pictures/Screenshots/record1553760548328-0001.jpg");
-        String rank = videoProcessTool.extractRank(img);
+        Mat img = imread("/Users/drew/Pictures/Screenshots/2019-03-29-03-20-01-svu0rzwo-0001.jpg");
+        String rank = videoProcessTool.extractRank1(img);
         System.out.println("rank:" + rank);
     }
+
+    @Test
+    public void testRankFilter() {
+        Mat img = imread("/Users/drew/Pictures/Screenshots/2019-03-29-03-20-01-svu0rzwo-0001.jpg");
+        videoProcessTool.rankFilter(img);
+    }
+
+    @Test
+    public void testTimeFilter() {
+        Mat img = imread("/Users/drew/Pictures/Screenshots/2019-03-29-03-20-01-svu0rzwo-0001.jpg");
+        videoProcessTool.timeFilter(img);
+    }
 }