x1ongzhu преди 6 години
родител
ревизия
57cc73cccb

+ 2 - 2
src/main/java/com/izouma/awesomeadmin/dao/PlayerInfoMapper.xml

@@ -29,7 +29,7 @@
         <result column="game_type" property="gameType" jdbcType="VARCHAR"/>
         <result column="game_type" property="gameType" jdbcType="VARCHAR"/>
         <result column="season_id" property="seasonId" jdbcType="INTEGER"/>
         <result column="season_id" property="seasonId" jdbcType="INTEGER"/>
         <result column="house_rank" property="houseRank" jdbcType="INTEGER"/>
         <result column="house_rank" property="houseRank" jdbcType="INTEGER"/>
-        <result column="score" property="score" jdbcType="INTEGER"/>
+        <result column="score" property="score" jdbcType="FLOAT"/>
     </resultMap>
     </resultMap>
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
         <trim suffixOverrides=",">
         <trim suffixOverrides=",">
@@ -273,7 +273,7 @@
                 #{houseRank,jdbcType=INTEGER},
                 #{houseRank,jdbcType=INTEGER},
             </if>
             </if>
             <if test="score != null">
             <if test="score != null">
-                #{score,jdbcType=INTEGER},
+                #{score,jdbcType=FLOAT},
             </if>
             </if>
         </trim>
         </trim>
     </insert>
     </insert>

+ 3 - 3
src/main/java/com/izouma/awesomeadmin/model/PlayerInfo.java

@@ -41,7 +41,7 @@ public class PlayerInfo {
 
 
     private Integer rank;
     private Integer rank;
 
 
-    private Integer score;
+    private Float score;
 
 
     private Integer scoreType;
     private Integer scoreType;
 
 
@@ -346,11 +346,11 @@ public class PlayerInfo {
         this.gameInfo = gameInfo;
         this.gameInfo = gameInfo;
     }
     }
 
 
-    public Integer getScore() {
+    public Float getScore() {
         return score;
         return score;
     }
     }
 
 
-    public void setScore(Integer score) {
+    public void setScore(Float score) {
         this.score = score;
         this.score = score;
     }
     }
 
 

+ 6 - 1
src/main/java/com/izouma/awesomeadmin/service/impl/VideoNotifyServiceImpl.java

@@ -2,7 +2,9 @@ package com.izouma.awesomeadmin.service.impl;
 
 
 import com.izouma.awesomeadmin.constant.AppConstant;
 import com.izouma.awesomeadmin.constant.AppConstant;
 import com.izouma.awesomeadmin.dto.VideoNotifyParam;
 import com.izouma.awesomeadmin.dto.VideoNotifyParam;
+import com.izouma.awesomeadmin.model.HouseInfo;
 import com.izouma.awesomeadmin.model.PlayerInfo;
 import com.izouma.awesomeadmin.model.PlayerInfo;
+import com.izouma.awesomeadmin.service.HouseInfoService;
 import com.izouma.awesomeadmin.service.PlayerInfoService;
 import com.izouma.awesomeadmin.service.PlayerInfoService;
 import com.izouma.awesomeadmin.service.VideoNotifyService;
 import com.izouma.awesomeadmin.service.VideoNotifyService;
 import com.izouma.awesomeadmin.service.VideoRecognitionService;
 import com.izouma.awesomeadmin.service.VideoRecognitionService;
@@ -20,13 +22,16 @@ public class VideoNotifyServiceImpl implements VideoNotifyService {
     @Autowired
     @Autowired
     private PlayerInfoService       playerInfoService;
     private PlayerInfoService       playerInfoService;
     @Autowired
     @Autowired
+    private HouseInfoService        houseInfoService;
+    @Autowired
     private VideoRecognitionService videoRecognitionService;
     private VideoRecognitionService videoRecognitionService;
 
 
     @Override
     @Override
     public void onConnect(VideoNotifyParam param, HttpServletRequest request, HttpServletResponse response) {
     public void onConnect(VideoNotifyParam param, HttpServletRequest request, HttpServletResponse response) {
         try {
         try {
             PlayerInfo playerInfo = playerInfoService.getPlayerInfoById(param.getPlayerInfoId().toString());
             PlayerInfo playerInfo = playerInfoService.getPlayerInfoById(param.getPlayerInfoId().toString());
-            if (AppConstant.PlayerStatus.START.equals(playerInfo.getStatusFlag())) {
+            HouseInfo houseInfo = houseInfoService.getHouseInfoById(playerInfo.getHouseId().toString());
+            if (AppConstant.HouseStatus.START.equals(houseInfo.getStatusFlag())) {
                 response.setStatus(200);
                 response.setStatus(200);
                 return;
                 return;
             }
             }

+ 9 - 1
src/main/java/com/izouma/awesomeadmin/service/impl/VideoRecognitionServiceImpl.java

@@ -63,7 +63,15 @@ public class VideoRecognitionServiceImpl implements VideoRecognitionService {
                 if (map != null) {
                 if (map != null) {
                     playerInfo.setImage(map.get("image"));
                     playerInfo.setImage(map.get("image"));
                     playerInfo.setRanking(Integer.valueOf(map.get("rank").replace("第", "")));
                     playerInfo.setRanking(Integer.valueOf(map.get("rank").replace("第", "")));
-                    playerInfo.setLiveTime(map.get("time"));
+                    playerInfo.setLiveTime(map.get("参赛时间"));
+                    try {
+                        playerInfo.setKillNumber(Integer.parseInt(map.get("淘汰")));
+                    } catch (Exception ignore) {
+                    }
+                    try {
+                        playerInfo.setScore(Float.parseFloat(map.get("淘汰")));
+                    } catch (Exception ignore) {
+                    }
                     playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED);
                     playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED);
                 } else {
                 } else {
                     playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED_FAIL);
                     playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED_FAIL);

+ 268 - 40
src/main/java/com/izouma/awesomeadmin/util/VideoProcessToolNew.java

@@ -1,8 +1,9 @@
 package com.izouma.awesomeadmin.util;
 package com.izouma.awesomeadmin.util;
 
 
 import com.izouma.awesomeadmin.service.OSSFileService;
 import com.izouma.awesomeadmin.service.OSSFileService;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.bytedeco.javacpp.indexer.UByteArrayIndexer;
+import org.apache.commons.lang3.time.DateFormatUtils;
 import org.bytedeco.javacpp.indexer.UByteRawIndexer;
 import org.bytedeco.javacpp.indexer.UByteRawIndexer;
 import org.bytedeco.javacpp.tesseract;
 import org.bytedeco.javacpp.tesseract;
 import org.bytedeco.javacv.FFmpegFrameGrabber;
 import org.bytedeco.javacv.FFmpegFrameGrabber;
@@ -25,13 +26,13 @@ import java.util.regex.Pattern;
 import static org.bytedeco.javacpp.lept.pixRead;
 import static org.bytedeco.javacpp.lept.pixRead;
 import static org.bytedeco.javacpp.opencv_core.*;
 import static org.bytedeco.javacpp.opencv_core.*;
 import static org.bytedeco.javacpp.opencv_imgcodecs.imencode;
 import static org.bytedeco.javacpp.opencv_imgcodecs.imencode;
-import static org.bytedeco.javacpp.opencv_imgcodecs.imwrite;
 import static org.bytedeco.javacpp.opencv_imgproc.*;
 import static org.bytedeco.javacpp.opencv_imgproc.*;
 import static org.bytedeco.javacpp.opencv_ml.SVM;
 import static org.bytedeco.javacpp.opencv_ml.SVM;
 import static org.bytedeco.javacpp.tesseract.PSM_SINGLE_LINE;
 import static org.bytedeco.javacpp.tesseract.PSM_SINGLE_LINE;
 
 
 public class VideoProcessToolNew {
 public class VideoProcessToolNew {
     private OSSFileService ossFileService = new OSSFileService();
     private OSSFileService ossFileService = new OSSFileService();
+    public  String         imgPrefix      = "/tmp/";
 
 
     public Map<String, String> processVideo(String path, int frameSkip) throws FrameGrabber.Exception {
     public Map<String, String> processVideo(String path, int frameSkip) throws FrameGrabber.Exception {
         SVM svm = SVM.load(GetResource.class.getClassLoader().getResource("trainneddata/pubg.xml").getPath());
         SVM svm = SVM.load(GetResource.class.getClassLoader().getResource("trainneddata/pubg.xml").getPath());
@@ -53,16 +54,29 @@ public class VideoProcessToolNew {
                 }
                 }
                 Mat frame = removeBlackBarAndRotate(converterToMat.convert(vFrame));
                 Mat frame = removeBlackBarAndRotate(converterToMat.convert(vFrame));
                 if (matchGameOver(svm, frame)) {
                 if (matchGameOver(svm, frame)) {
-                    String rank = extractRank(frame);
-                    if (StringUtils.isEmpty(rank)) continue;
-                    String time = extractGameTime(frame);
-                    if (StringUtils.isEmpty(time)) continue;
-
-                    map.put("rank", rank);
-                    map.put("time", time);
-                    map.put("image", uploadImage(frame));
-                    System.out.println(map);
-                    break;
+                    if (map.get("rank") == null) {
+                        String rank = extractRank(frame);
+                        if (StringUtils.isNotEmpty(rank))
+                            map.put("rank", rank);
+                    }
+                    if (map.get("total") == null) {
+                        String total = extractTotalNum(frame);
+                        if (StringUtils.isNotEmpty(total))
+                            map.put("total", total);
+                    }
+                    if (map.get("参赛时间") == null) {
+                        Map<String, String> statistics = getStatistics(frame);
+                        if (statistics != null)
+                            map.putAll(statistics);
+                    }
+                    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;
+                    }
                 }
                 }
                 frame.release();
                 frame.release();
                 System.out.println(frameCount + " frame processed");
                 System.out.println(frameCount + " frame processed");
@@ -94,10 +108,54 @@ public class VideoProcessToolNew {
         String result = null;
         String result = null;
         int m = src.rows();
         int m = src.rows();
         int n = src.cols();
         int n = src.cols();
-        Mat roi = new Mat(src, new Range(0, (int) (m * 0.4)), new Range((int) (n * 0.75), n));
-        Mat filtered = rankFilter(roi);
+        Mat roi = new Mat(src, new Range(0, (int) (m * 0.093)), new Range((int) (n * 0.44), (int) (n * 0.56)));
+        imwrite("rank.jpg", roi);
+
+        Mat filtered = new Mat(roi.rows(), roi.cols(), CV_8UC1, new Scalar(0));
+        Mat hsvImg = new Mat();
+        cvtColor(roi, hsvImg, COLOR_BGR2HSV);
+
+        UByteRawIndexer hsvIndexer = hsvImg.createIndexer();
+        UByteRawIndexer filteredIndexer = filtered.createIndexer();
+        for (int i = 0; i < roi.rows(); i++) {
+            for (int j = 0; j < roi.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;
+                filteredIndexer.put(i, j, gray);
+            }
+        }
+        hsvIndexer.release();
+        hsvImg.release();
+        filteredIndexer.release();
+
+        imwrite("rank_filtered.jpg", filtered);
         Mat gray = new Mat();
         Mat gray = new Mat();
         adaptiveThreshold(filtered, gray, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 15, 12);
         adaptiveThreshold(filtered, gray, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 15, 12);
+        imwrite("rank_gray.jpg", gray);
         MatVector contours = new MatVector();
         MatVector contours = new MatVector();
         findContours(gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
         findContours(gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
         List<Rect> rects = new ArrayList<>();
         List<Rect> rects = new ArrayList<>();
@@ -115,11 +173,9 @@ public class VideoProcessToolNew {
                 String str = doOCR(txtImg);
                 String str = doOCR(txtImg);
                 txtImg.release();
                 txtImg.release();
                 System.out.println(str);
                 System.out.println(str);
-                rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
                 if (str != null) {
                 if (str != null) {
                     str = str.replaceAll("[ \n]", "");
                     str = str.replaceAll("[ \n]", "");
                     if (Pattern.matches("^第\\d{1,3}$", str)) {
                     if (Pattern.matches("^第\\d{1,3}$", str)) {
-                        rectangle(roi, rect, new Scalar(0, 255, 0, 0), 2, LINE_AA, 0);
                         result = str;
                         result = str;
                         break;
                         break;
                     }
                     }
@@ -132,20 +188,37 @@ public class VideoProcessToolNew {
         return result;
         return result;
     }
     }
 
 
-    public String extractGameTime(Mat src) {
-        Mat out = new Mat();
-        bilateralFilter(src, out, 25, 25 * 2, 25 / 2f);
-
-        imwrite("/tmp/time.jpg", out);
+    public String extractTotalNum(Mat src) {
         String result = null;
         String result = null;
         int m = src.rows();
         int m = src.rows();
         int n = src.cols();
         int n = src.cols();
-        Mat roi = new Mat(out, new Range((int) (m * 0.5), (int) (m * 0.8)), new Range((int) (n * 0.5), n));
-        Mat filtered = timeFilter(roi);
-        imwrite("/tmp/time_filtered.jpg", filtered);
+        Mat roi = new Mat(src, new Range(0, (int) (m * 0.08)), new Range((int) (n * 0.42), (int) (n * 0.58)));
+        imwrite("total.png", roi);
+
+        Mat totalFiltered = new Mat(roi.rows(), roi.cols(), CV_8UC1, new Scalar(0));
+        Mat hsvImg = new Mat();
+        cvtColor(roi, hsvImg, COLOR_BGR2HSV);
+
+        UByteRawIndexer hsvIndexer = hsvImg.createIndexer();
+        UByteRawIndexer resultIndexer = totalFiltered.createIndexer();
+        for (int i = 0; i < roi.rows(); i++) {
+            for (int j = 0; j < roi.cols(); j++) {
+                int h = hsvIndexer.get(i, j, 0);
+                int s = hsvIndexer.get(i, j, 1);
+                int v = hsvIndexer.get(i, j, 2);
+
+                int gray = 255 - 2 * s;
+                gray = gray < 0 ? 0 : gray;
+                resultIndexer.put(i, j, gray);
+            }
+        }
+        hsvIndexer.release();
+        hsvImg.release();
+        resultIndexer.release();
+        imwrite("total_filtered.png", totalFiltered);
         Mat gray = new Mat();
         Mat gray = new Mat();
-        adaptiveThreshold(filtered, gray, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 15, 12);
-        imwrite("/tmp/time_gray.jpg", gray);
+        adaptiveThreshold(totalFiltered, gray, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 15, 12);
+        imwrite("rank_gray.jpg", gray);
         MatVector contours = new MatVector();
         MatVector contours = new MatVector();
         findContours(gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
         findContours(gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
         List<Rect> rects = new ArrayList<>();
         List<Rect> rects = new ArrayList<>();
@@ -159,29 +232,136 @@ public class VideoProcessToolNew {
         for (int i = 0; i < rects.size(); i++) {
         for (int i = 0; i < rects.size(); i++) {
             Rect rect = rects.get(i);
             Rect rect = rects.get(i);
             if (i < 5) {
             if (i < 5) {
-                Mat txtImg = new Mat(filtered, new Range(rect.y(), rect.y() + rect.height()), new Range(rect.x(), rect.x() + rect.width()));
-                resize(txtImg, txtImg, new Size(0, 0), 3, 3, INTER_LINEAR);
-
+                Mat txtImg = new Mat(totalFiltered, new Range(rect.y(), rect.y() + rect.height()), new Range(rect.x(), rect.x() + rect.width()));
                 String str = doOCR(txtImg);
                 String str = doOCR(txtImg);
                 txtImg.release();
                 txtImg.release();
-                System.out.println(str);
-                rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
                 if (str != null) {
                 if (str != null) {
                     str = str.replaceAll("[ \n]", "");
                     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;
+                    if (Pattern.matches("^/\\d{1,3}$", str)) {
+                        result = str.replace("/", "");
                         break;
                         break;
                     }
                     }
                 }
                 }
             }
             }
         }
         }
-        filtered.release();
+        totalFiltered.release();
         gray.release();
         gray.release();
+        System.out.println(result);
+        return result;
+    }
+
+    public String extractMode(Mat src) {
+        String result = null;
+        int m = src.rows();
+        int n = src.cols();
+        Mat roi = new Mat(src, new Range(0, (int) (m * 0.065)), new Range(0, (int) (n * 0.2)));
+        imwrite("mode.png", roi);
+
+        Mat filtered = new Mat(roi.rows(), roi.cols(), CV_8UC1, new Scalar(0));
+        Mat hsvImg = new Mat();
+        cvtColor(roi, hsvImg, COLOR_BGR2HSV);
+
+        UByteRawIndexer hsvIndexer = hsvImg.createIndexer();
+        UByteRawIndexer bgrIndexer = roi.createIndexer();
+        UByteRawIndexer resultIndexer = filtered.createIndexer();
+        for (int i = 0; i < roi.rows(); i++) {
+            for (int j = 0; j < roi.cols(); j++) {
+                int h = hsvIndexer.get(i, j, 0);
+                int s = hsvIndexer.get(i, j, 1);
+                int v = hsvIndexer.get(i, j, 2);
+                int b = bgrIndexer.get(i, j, 0);
+                int g = bgrIndexer.get(i, j, 1);
+                int r = bgrIndexer.get(i, j, 2);
+
+                int dr = Math.abs(r - 220);
+                int dg = Math.abs(g - 220);
+                int db = Math.abs(b - 220);
+
+                int dbgr = Math.abs(b - g) + Math.abs(b - r) + Math.abs(r - g);
+
+                int gray = (int) (255 - Math.pow(dr, 2) * 0.015 - Math.pow(dg, 2) * 0.015 - Math.pow(db, 2) * 0.015 - Math.pow(dbgr, 2) * 0.015);
+                // gray = (int) (gray / 128f * 255);
+                // gray = 255 - Math.abs(gray - 200) * 2;
+                if (gray > 220) {
+                    gray = 0;
+                } else if (gray > 190) {
+                    gray = 220 - 190;
+                } else {
+                    gray = 255;
+                }
+                resultIndexer.put(i, j, gray);
+            }
+        }
+
+        hsvIndexer.release();
+        bgrIndexer.release();
+        hsvImg.release();
+        resultIndexer.release();
+        imwrite("mode_filtered.png", filtered);
+        result = doOCR(filtered, "chi_sim");
+        if (StringUtils.isNotEmpty(result)) {
+            result = result.replace(" ", "").replace("\n", "");
+        }
+        System.out.println(result);
+        filtered.release();
         roi.release();
         roi.release();
         return result;
         return result;
     }
     }
 
 
+    public Map<String, String> getStatistics(Mat src) {
+        imwrite("time.jpg", src);
+        int m = src.rows();
+        int n = src.cols();
+        Mat roi = new Mat(src, new Range((int) (m * 0.569), (int) (m * 0.625)), new Range((int) (n * 0.3), (int) (n * 0.8)));
+        Mat filtered = timeFilter(roi);
+        imwrite("time_filtered.jpg", filtered);
+
+        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.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.742), 0, (int) (filtered.cols() * 0.1), filtered.rows())
+        };
+        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()));
+
+            Rect rect1 = boundingRect(txtImg);
+            int y1 = rect1.y() - 5;
+            y1 = y1 < 0 ? 0 : y1;
+            int y2 = rect1.y() + rect1.height() + 5;
+            y2 = y2 > (txtImg.rows() - 1) ? (txtImg.rows() - 1) : y2;
+            int x1 = rect1.x() - 5;
+            x1 = x1 < 0 ? 0 : x1;
+            int x2 = rect1.x() + rect1.width() + 5;
+            x2 = x2 > (txtImg.cols() - 1) ? (txtImg.cols() - 1) : x2;
+            txtImg = txtImg.rowRange(y1, y2).colRange(x1, x2);
+            bitwise_not(txtImg, txtImg);
+            resize(txtImg, txtImg, new Size(0, 0), 3, 3, INTER_LINEAR);
+            String str = doOCR(txtImg);
+            if (StringUtils.isNotEmpty(str)) {
+                str = str.replaceAll("[ \n]", "");
+            }
+            map.put(names[i], str);
+            System.out.println(names[i] + str);
+            imwrite(names[i] + ".png", txtImg);
+            i++;
+        }
+
+        filtered.release();
+        roi.release();
+        if (map.get("参赛时间") != null) {
+            if (Pattern.matches("((^([0-9]+[.][0-9]*))|(^\\d{1,2}))分钟", map.get("参赛时间")))
+                return map;
+        }
+        return null;
+    }
+
     public Mat bgrFilter(Mat src, int b, int g, int r) {
     public Mat bgrFilter(Mat src, int b, int g, int r) {
         Mat result = new Mat(src.rows(), src.cols(), CV_8UC1, new Scalar(0));
         Mat result = new Mat(src.rows(), src.cols(), CV_8UC1, new Scalar(0));
         UByteRawIndexer srcIndexer = src.createIndexer();
         UByteRawIndexer srcIndexer = src.createIndexer();
@@ -206,19 +386,63 @@ public class VideoProcessToolNew {
     }
     }
 
 
     public Mat rankFilter(Mat src) {
     public Mat rankFilter(Mat src) {
-        return bgrFilter(src, 12, 243, 252);
+        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();
+        resultIndexer.release();
+        return result;
     }
     }
 
 
     public Mat timeFilter(Mat src) {
     public Mat timeFilter(Mat src) {
-        return bgrFilter(src, 40, 183, 210);
+        return bgrFilter(src, 27, 129, 243);
     }
     }
 
 
     private String doOCR(Mat img) {
     private String doOCR(Mat img) {
-        imwrite("/tmp/text.jpg", img);
+        return doOCR(img, "pubg");
+    }
+
+    private String doOCR(Mat img, String lang) {
+        imwrite("text.jpg", img);
         final tesseract.TessBaseAPI baseApi = new tesseract.TessBaseAPI();
         final tesseract.TessBaseAPI baseApi = new tesseract.TessBaseAPI();
-        baseApi.Init(GetResource.class.getClassLoader().getResource("trainneddata").getPath(), "pubg");
+        baseApi.Init(GetResource.class.getClassLoader().getResource("trainneddata").getPath(), lang);
         baseApi.SetPageSegMode(PSM_SINGLE_LINE);
         baseApi.SetPageSegMode(PSM_SINGLE_LINE);
-        baseApi.SetImage(pixRead("/tmp/text.jpg"));
+        baseApi.SetImage(pixRead(imgPrefix + "text.jpg"));
         String recognizedText = baseApi.GetUTF8Text().getString();
         String recognizedText = baseApi.GetUTF8Text().getString();
         return recognizedText;
         return recognizedText;
     }
     }
@@ -265,4 +489,8 @@ public class VideoProcessToolNew {
         }
         }
         return null;
         return null;
     }
     }
+
+    private void imwrite(String name, Mat img) {
+        org.bytedeco.javacpp.opencv_imgcodecs.imwrite(imgPrefix + name, img);
+    }
 }
 }

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


Файловите разлики са ограничени, защото са твърде много
+ 562593 - 901001
src/main/resources/trainneddata/pubg.xml


+ 34 - 54
src/test/java/VideoProcessTest.java

@@ -1,5 +1,6 @@
 import com.izouma.awesomeadmin.util.VideoProcessTool;
 import com.izouma.awesomeadmin.util.VideoProcessTool;
 import com.izouma.awesomeadmin.util.VideoProcessToolNew;
 import com.izouma.awesomeadmin.util.VideoProcessToolNew;
+import org.bytedeco.javacpp.opencv_core;
 import org.bytedeco.javacpp.opencv_ml;
 import org.bytedeco.javacpp.opencv_ml;
 import org.bytedeco.javacv.FrameGrabber;
 import org.bytedeco.javacv.FrameGrabber;
 import org.hibernate.validator.internal.util.privilegedactions.GetResource;
 import org.hibernate.validator.internal.util.privilegedactions.GetResource;
@@ -7,13 +8,12 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 import org.junit.runners.JUnit4;
 
 
-import java.io.File;
-import java.nio.file.Path;
 import java.util.Map;
 import java.util.Map;
 
 
 import static org.bytedeco.javacpp.opencv_core.Mat;
 import static org.bytedeco.javacpp.opencv_core.Mat;
 import static org.bytedeco.javacpp.opencv_imgcodecs.imread;
 import static org.bytedeco.javacpp.opencv_imgcodecs.imread;
 import static org.bytedeco.javacpp.opencv_imgcodecs.imwrite;
 import static org.bytedeco.javacpp.opencv_imgcodecs.imwrite;
+import static org.bytedeco.javacpp.opencv_imgproc.*;
 
 
 
 
 @RunWith(JUnit4.class)
 @RunWith(JUnit4.class)
@@ -26,7 +26,7 @@ public class VideoProcessTest {
     public void testVideo() {
     public void testVideo() {
         try {
         try {
             long ts = System.currentTimeMillis();
             long ts = System.currentTimeMillis();
-            Map<String, String> result = videoProcessTool.processVideo("/Users/drew/Downloads/2019-03-29-03-41-57-5o8n74nz.flv", 0);
+            Map<String, String> result = videoProcessTool.processVideo("/Users/drew/Downloads/2019-05-14-03-49-26-97k0b2cq.mp4", 0);
             System.out.println(result);
             System.out.println(result);
             System.out.println((System.currentTimeMillis() - ts) / 1000f / 60);
             System.out.println((System.currentTimeMillis() - ts) / 1000f / 60);
         } catch (FrameGrabber.Exception e) {
         } catch (FrameGrabber.Exception e) {
@@ -38,7 +38,7 @@ public class VideoProcessTest {
     public void testVideoNew() {
     public void testVideoNew() {
         try {
         try {
             long ts = System.currentTimeMillis();
             long ts = System.currentTimeMillis();
-            Map<String, String> result = videoProcessToolNew.processVideo("/Users/drew/Downloads/2019-03-29-03-41-57-5o8n74nz.flv", 0);
+            Map<String, String> result = videoProcessToolNew.processVideo("/Users/drew/Downloads/2019-05-14-03-49-26-97k0b2cq.mp4", 0);
             System.out.println(result);
             System.out.println(result);
             System.out.println((System.currentTimeMillis() - ts) / 1000f / 60);
             System.out.println((System.currentTimeMillis() - ts) / 1000f / 60);
         } catch (FrameGrabber.Exception e) {
         } catch (FrameGrabber.Exception e) {
@@ -49,72 +49,52 @@ public class VideoProcessTest {
     @Test
     @Test
     public void testMatch() {
     public void testMatch() {
         opencv_ml.SVM svm = opencv_ml.SVM.load(GetResource.class.getClassLoader().getResource("trainneddata/pubg.xml").getPath());
         opencv_ml.SVM svm = opencv_ml.SVM.load(GetResource.class.getClassLoader().getResource("trainneddata/pubg.xml").getPath());
-        Mat img = imread("/Users/drew/Pictures/Screenshots/2019-03-27-04-12-40-mm7ni1ku-0001.jpg");
+        Mat img = imread("/Users/drew/Desktop/samples/has/1.jpg");
         boolean b = videoProcessTool.matchGameOver(svm, img);
         boolean b = videoProcessTool.matchGameOver(svm, img);
         System.out.println(b);
         System.out.println(b);
     }
     }
 
 
+    Mat getTestImg(String path) {
+        Mat img = imread(path);
+        img = videoProcessToolNew.removeBlackBarAndRotate(img);
+        Mat out = new Mat();
+        bilateralFilter(img, out, 25, 25 * 2, 25 / 2f);
+        img.release();
+        return out;
+    }
+
     @Test
     @Test
     public void testRank() {
     public void testRank() {
-        Mat img = imread("/Users/drew/Pictures/Screenshots/2019-03-29-03-20-01-svu0rzwo-0001.jpg");
+        Mat img = getTestImg("/Users/drew/Pictures/Screenshots/455-0001.jpg");
         String rank = videoProcessToolNew.extractRank(img);
         String rank = videoProcessToolNew.extractRank(img);
-        System.out.println("rank:" + rank);
-
-        long ts = System.currentTimeMillis();
-        videoProcessTool.extractRank(img);
-        System.out.println(System.currentTimeMillis() - ts);
-
-        ts = System.currentTimeMillis();
+        videoProcessToolNew.imgPrefix = "/tmp/1_";
+        img = getTestImg("/Users/drew/Downloads/IMG_1024.PNG");
         videoProcessToolNew.extractRank(img);
         videoProcessToolNew.extractRank(img);
-        System.out.println(System.currentTimeMillis() - ts);
-    }
-
-    @Test
-    public void testTime() {
-        Mat img = imread("/Users/drew/Desktop/samples/has/IMG_0785.JPG");
-        String time = videoProcessToolNew.extractGameTime(img);
-        System.out.println("time:" + time);
     }
     }
 
 
-
     @Test
     @Test
-    public void testRankFilter() {
-        // Mat img = imread("/Users/drew/Pictures/Screenshots/2019-03-29-03-20-01-svu0rzwo-0001.jpg");
-        // videoProcessToolNew.rankFilter(img);
-
-        String[] list = new File("/Users/drew/Desktop/1").list();
-        int i = 14;
-        for (String file : list) {
-            if (file.contains(".tif")) {
-                System.out.println(file);
-                i++;
-                Mat img = imread("/Users/drew/Desktop/1/" + file);
-                imwrite("/Users/drew/Desktop/1/" + i + ".tif", videoProcessToolNew.rankFilter(img));
-            }
-        }
+    public void testTotal() {
+        Mat img = getTestImg("/Users/drew/Pictures/Screenshots/455-0001.jpg");
+        videoProcessToolNew.extractTotalNum(img);
     }
     }
 
 
     @Test
     @Test
-    public void testTimeFilter() {
-        // Mat img = imread("/Users/drew/Pictures/Screenshots/2019-03-29-03-20-01-svu0rzwo-0001.jpg");
-        // videoProcessToolNew.timeFilter(img);
-
-        String[] list = new File("/Users/drew/Desktop/2").list();
-        int i = 0;
-        for (String file : list) {
-            if (file.contains(".png")) {
-                System.out.println(file);
-                i++;
-                Mat img = imread("/Users/drew/Desktop/2/" + file);
-                imwrite("/Users/drew/Desktop/2/" + i + ".tif", videoProcessToolNew.timeFilter(img));
-            }
-        }
+    public void testMode() {
+        Mat img = imread("/Users/drew/Pictures/Screenshots/455-0001.jpg");
+        int scale = (int) Math.ceil(5760 / img.cols());
+        resize(img, img, new opencv_core.Size(0, 0), scale, scale, INTER_LINEAR);
+        Mat out = new Mat();
+        int size = (int) (img.cols() * 0.0043);
+        if (size % 2 == 0) size++;
+        System.out.println(size);
+        bilateralFilter(img, out, size, size * 2, size / 2f);
+        videoProcessToolNew.extractMode(out);
     }
     }
 
 
     @Test
     @Test
-    public void testRemoveBlackBar() {
-        Mat img = imread("/Users/drew/Downloads/2019-03-29-10-21-53-ffbb8482-1fde-49b9-827b-955b0353a510.jpg");
-        Mat dst = videoProcessToolNew.removeBlackBarAndRotate(img);
-        imwrite("/Users/drew/Desktop/1.jpg", dst);
+    public void testStatistics() {
+        Mat img = getTestImg("/Users/drew/Desktop/matched.jpg");
+        Map<String, String> map = videoProcessToolNew.getStatistics(img);
+        System.out.println(map);
     }
     }
 }
 }

Някои файлове не бяха показани, защото твърде много файлове са промени