Explorar el Código

Merge remote-tracking branch 'origin/master' into c_yuanren

x1ongzhu hace 7 años
padre
commit
3dbfaaf47b

+ 74 - 63
src/main/java/com/izouma/awesomeadmin/util/VideoProcessToolNew.java

@@ -27,6 +27,7 @@ import static org.bytedeco.javacpp.lept.pixRead;
 import static org.bytedeco.javacpp.opencv_core.*;
 import static org.bytedeco.javacpp.opencv_imgcodecs.imencode;
 import static org.bytedeco.javacpp.opencv_imgproc.*;
+import static org.bytedeco.javacpp.opencv_imgproc.bilateralFilter;
 import static org.bytedeco.javacpp.opencv_ml.SVM;
 import static org.bytedeco.javacpp.tesseract.PSM_SINGLE_LINE;
 
@@ -54,28 +55,45 @@ public class VideoProcessToolNew {
                 }
                 Mat frame = removeBlackBarAndRotate(converterToMat.convert(vFrame));
                 if (matchGameOver(svm, frame)) {
+                    Mat filtered = new Mat();
+                    bilateralFilter(frame, filtered, 25, 25 * 2, 25 / 2f);
                     if (map.get("rank") == null) {
-                        String rank = extractRank(frame);
+                        String rank = extractRank(filtered);
                         if (StringUtils.isNotEmpty(rank))
                             map.put("rank", rank);
                     }
                     if (map.get("total") == null) {
-                        String total = extractTotalNum(frame);
+                        String total = extractTotalNum(filtered);
                         if (StringUtils.isNotEmpty(total))
                             map.put("total", total);
                     }
                     if (map.get("参赛时间") == null) {
-                        Map<String, String> statistics = getStatistics(frame);
+                        Map<String, String> statistics = getStatistics(filtered);
                         if (statistics != null)
                             map.putAll(statistics);
                     }
+                    filtered.release();
                     if (map.get("rank") != null
                             && map.get("total") != null
-                            && map.get("参赛时间") != null) {
-                        imwrite(DateFormatUtils.format(new Date(), "yyyyMMddhhmmss") + RandomStringUtils.randomAlphabetic(4) + ".jpg", frame);
-                        map.put("image", uploadImage(frame));
-                        System.out.println(map);
-                        break;
+                            && map.get("参赛时间") != null
+                            && map.get("评分") != null) {
+                        double score = 0;
+                        double total = 0;
+                        double rank = 0;
+
+                        try {
+                            score = Double.parseDouble(map.get("评分"));
+                            total = Double.parseDouble(map.get("total"));
+                            rank = Double.parseDouble(map.get("rank").replace("第", ""));
+
+                            if (score > (total - rank) / total * 100 / 2) {
+                                imwrite(DateFormatUtils.format(new Date(), "yyyyMMddhhmmss") + RandomStringUtils.randomAlphabetic(4) + ".jpg", frame);
+                                map.put("image", uploadImage(frame));
+                                System.out.println(map);
+                                break;
+                            }
+                        } catch (Exception ignore) {
+                        }
                     }
                 }
                 frame.release();
@@ -319,14 +337,22 @@ public class VideoProcessToolNew {
         Map<String, String> map = new HashMap<>();
         Rect[] rects = {
                 new Rect(0, 0, (int) (filtered.cols() * 0.128), filtered.rows()),
-                new Rect((int) (filtered.cols() * 0.128), 0, (int) (filtered.cols() * 0.128), filtered.rows()),
+                // new Rect((int) (filtered.cols() * 0.128), 0, (int) (filtered.cols() * 0.128), filtered.rows()),
                 new Rect((int) (filtered.cols() * 0.256), 0, (int) (filtered.cols() * 0.162), filtered.rows()),
-                new Rect((int) (filtered.cols() * 0.428), 0, (int) (filtered.cols() * 0.114), filtered.rows()),
-                new Rect((int) (filtered.cols() * 0.542), 0, (int) (filtered.cols() * 0.1), filtered.rows()),
-                new Rect((int) (filtered.cols() * 0.642), 0, (int) (filtered.cols() * 0.1), filtered.rows()),
+                // new Rect((int) (filtered.cols() * 0.428), 0, (int) (filtered.cols() * 0.114), filtered.rows()),
+                // new Rect((int) (filtered.cols() * 0.542), 0, (int) (filtered.cols() * 0.1), filtered.rows()),
+                // new Rect((int) (filtered.cols() * 0.642), 0, (int) (filtered.cols() * 0.1), filtered.rows()),
                 new Rect((int) (filtered.cols() * 0.742), 0, (int) (filtered.cols() * 0.1), filtered.rows())
         };
-        String[] names = {"淘汰", "伤害", "参赛时间", "治疗量", "救援", "助攻", "评分"};
+        String[] names = {
+                "淘汰",
+                // "伤害",
+                "参赛时间",
+                // "治疗量",
+                // "救援",
+                // "助攻",
+                "评分"
+        };
         int i = 0;
         for (Rect rect : rects) {
             Mat txtImg = new Mat(filtered, new Range(rect.y(), rect.y() + rect.height()), new Range(rect.x(), rect.x() + rect.width()));
@@ -357,13 +383,34 @@ public class VideoProcessToolNew {
         roi.release();
         if (Pattern.matches("((^([0-9]+[.][0-9]*))|(^\\d{1,2}))分钟", map.get("参赛时间")) &&
                 Pattern.matches("((^([0-9]+[.][0-9]*))|(^\\d{1,2}))", map.get("评分"))) {
-            return map;
+            try {
+                double score = Double.parseDouble(map.get("评分"));
+                double time = Double.parseDouble(map.get("参赛时间").replace("分钟", ""));
+                if (score >= 0 && score <= 100 && time >= 0 && time <= 45) {
+                    return map;
+                }
+            } catch (Exception ignored) {
+            }
         }
         return null;
     }
 
-    public Mat bgrFilter(Mat src, int b, int g, int r) {
+    public Mat timeFilter(Mat src) {
+        int b = 27;
+        int g = 145;
+        int r = 211;
+
+        int hmin = 28;
+        int hmax = 28;
+        int smin = 145;
+        int smax = 145;
+        int vmin = 160;
+        int vmax = 160;
+
         Mat result = new Mat(src.rows(), src.cols(), CV_8UC1, new Scalar(0));
+        Mat hsvImg = new Mat();
+        cvtColor(src, hsvImg, COLOR_BGR2HSV);
+        UByteRawIndexer hsvIndexer = hsvImg.createIndexer();
         UByteRawIndexer srcIndexer = src.createIndexer();
         UByteRawIndexer resultIndexer = result.createIndexer();
         for (int i = 0; i < src.rows(); i++) {
@@ -372,7 +419,16 @@ public class VideoProcessToolNew {
                 int dg = Math.abs(srcIndexer.get(i, j, 1) - g);
                 int dr = Math.abs(srcIndexer.get(i, j, 2) - r);
 
-                int gray = 255 - (db + dg + dr);
+                int h = hsvIndexer.get(i, j, 0);
+                int s = hsvIndexer.get(i, j, 1);
+                int v = hsvIndexer.get(i, j, 2);
+
+                int dh = h > hmax ? (h - hmax) : (h < hmin ? (hmin - h) : 0);
+                int ds = s > smax ? (s - smax) : (s < smin ? (smin - s) : 0);
+                int dv = v > vmax ? (v - vmax) : (v < vmin ? (vmin - v) : 0);
+
+                int gray = 255 - (db * 0 + dg * 3 + dr * 2);
+                // int gray = 255 - dh * 2 - ds * 2 - dv* 2;
                 if (gray < 0) gray = 0;
                 if (gray > 255) gray = 255;
                 gray *= 1.2;
@@ -380,58 +436,13 @@ public class VideoProcessToolNew {
                 resultIndexer.put(i, j, gray);
             }
         }
-        srcIndexer.release();
-        resultIndexer.release();
-        return result;
-    }
-
-    public Mat rankFilter(Mat src) {
-        Mat result = new Mat(src.rows(), src.cols(), CV_8UC1, new Scalar(0));
-        Mat hsvImg = new Mat();
-        cvtColor(src, hsvImg, COLOR_BGR2HSV);
-
-        UByteRawIndexer hsvIndexer = hsvImg.createIndexer();
-        UByteRawIndexer resultIndexer = result.createIndexer();
-        for (int i = 0; i < src.rows(); i++) {
-            for (int j = 0; j < src.cols(); j++) {
-                int h = hsvIndexer.get(i, j, 0);
-                int s = hsvIndexer.get(i, j, 1);
-                int v = hsvIndexer.get(i, j, 2);
-                int dh = 0;
-                if (h > 26) {
-                    dh = h - 26;
-                } else if (h < 21) {
-                    dh = 21 - h;
-                }
-                int ds = 0;
-                if (s > 161) {
-                    ds = s - 161;
-                } else if (s < 120) {
-                    ds = 120 - s;
-                }
-                int dv = 0;
-                if (v > 251) {
-                    dv = v - 251;
-                } else if (v < 238) {
-                    dv = 238 - v;
-                }
-                int gray = (int) (255 - Math.min(255, dh * 50)
-                        - Math.min(255, ds * 3)
-                        - Math.min(255, dv * 10));
-                gray = gray < 0 ? 0 : gray;
-                // int gray = (h == 26 && Math.abs(s - S) < 50) ? 255 : 0;
-                resultIndexer.put(i, j, gray);
-            }
-        }
-        hsvIndexer.release();
         hsvImg.release();
+        hsvIndexer.release();
+        srcIndexer.release();
         resultIndexer.release();
         return result;
     }
 
-    public Mat timeFilter(Mat src) {
-        return bgrFilter(src, 27, 129, 243);
-    }
 
     private String doOCR(Mat img) {
         return doOCR(img, "pubg");

BIN
src/main/resources/trainneddata/pubg.traineddata


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

@@ -1,4 +1,5 @@
 import com.izouma.awesomeadmin.util.VideoProcessToolNew;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.bytedeco.javacpp.opencv_core;
 import org.bytedeco.javacpp.opencv_ml;
 import org.bytedeco.javacv.FrameGrabber;
@@ -7,6 +8,9 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import static org.bytedeco.javacpp.opencv_core.Mat;
@@ -23,7 +27,7 @@ public class VideoProcessTest {
     public void testVideoNew() {
         try {
             long ts = System.currentTimeMillis();
-            Map<String, String> result = videoProcessToolNew.processVideo("/Users/drew/Downloads/2019-05-14-03-49-26-97k0b2cq.mp4", 0);
+            Map<String, String> result = videoProcessToolNew.processVideo("/Users/drew/Downloads/464.flv", 0);
             System.out.println(result);
             System.out.println((System.currentTimeMillis() - ts) / 1000f / 60);
         } catch (FrameGrabber.Exception e) {
@@ -50,11 +54,8 @@ public class VideoProcessTest {
 
     @Test
     public void testRank() {
-        Mat img = getTestImg("/Users/drew/Pictures/Screenshots/455-0001.jpg");
+        Mat img = getTestImg("/Users/drew/Desktop/time.jpg");
         String rank = videoProcessToolNew.extractRank(img);
-        videoProcessToolNew.imgPrefix = "/tmp/1_";
-        img = getTestImg("/Users/drew/Downloads/IMG_1024.PNG");
-        videoProcessToolNew.extractRank(img);
     }
 
     @Test
@@ -78,8 +79,17 @@ public class VideoProcessTest {
 
     @Test
     public void testStatistics() {
-        Mat img = getTestImg("/Users/drew/Desktop/matched.jpg");
+        Mat img = getTestImg("/Users/drew/Desktop/time.jpg");
         Map<String, String> map = videoProcessToolNew.getStatistics(img);
         System.out.println(map);
     }
+
+    @Test
+    public void randomStr() {
+        DecimalFormat df = new DecimalFormat("#.00");
+        List<String> list = new ArrayList<>();
+        list.add(df.format(Math.random() * 40) + (Math.random() > 0.5 ? "分钟" : ""));
+        System.out.println(df.format(Math.random() * 40));
+        RandomStringUtils.random(100, "01234567890./,第分钟");
+    }
 }