xiongzhu пре 7 година
родитељ
комит
fda4633a3b
100 измењених фајлова са 163 додато и 27 уклоњено
  1. 74 0
      log.txt
  2. 4 1
      src/main/java/com/izouma/awesomeadmin/service/VideoRecognitionService.java
  3. 82 24
      src/main/java/com/izouma/awesomeadmin/service/impl/VideoRecognitionServiceImpl.java
  4. 1 1
      src/main/webapp/WEB-INF/html/admin.html
  5. 0 0
      src/main/webapp/static/RongIMLib-2.2.5.min.js
  6. 0 0
      src/main/webapp/static/css/admin.2dce5488fb028ed0640b53131cad452e.css
  7. 0 0
      src/main/webapp/static/css/admin.a99382f8104ef0229e42fbe0f11ef186.css
  8. 0 1
      src/main/webapp/static/css/loginAdmin.a1de29a9f9c1d5b671b1965892c17dd1.css
  9. BIN
      src/main/webapp/static/img/demo_picture.d0e14fc.jpg
  10. 0 0
      src/main/webapp/static/js/0.89b52f55dd4626b1505f.js
  11. 0 0
      src/main/webapp/static/js/0.bdf8af6bf787f1f1b45c.js
  12. 0 0
      src/main/webapp/static/js/1.b4eec83944a0f2aab650.js
  13. 0 0
      src/main/webapp/static/js/1.c3536192453568b305ed.js
  14. 0 0
      src/main/webapp/static/js/10.7b0891c6aa5bc43d01d2.js
  15. 0 0
      src/main/webapp/static/js/10.d33e24f55d8ebf7332b6.js
  16. 0 0
      src/main/webapp/static/js/11.255577c0b445be9ca239.js
  17. 0 0
      src/main/webapp/static/js/11.73bf16410ccf67b4ed94.js
  18. 0 0
      src/main/webapp/static/js/12.69aea40e38a6cc16fa37.js
  19. 0 0
      src/main/webapp/static/js/12.77e0e31ea6e36df0f7e2.js
  20. 0 0
      src/main/webapp/static/js/13.545b34f8f6bf443c2142.js
  21. 0 0
      src/main/webapp/static/js/13.f0c3f9186a92c4ae5c46.js
  22. 0 0
      src/main/webapp/static/js/14.4435d0ad4daeeb3d1fe3.js
  23. 0 0
      src/main/webapp/static/js/14.58b6e0f57e77335a4abd.js
  24. 0 0
      src/main/webapp/static/js/15.615675d260188d2c9ab7.js
  25. 0 0
      src/main/webapp/static/js/15.ba79ba438ef0f6542037.js
  26. 0 0
      src/main/webapp/static/js/16.09d1c5d3db4ca554d41b.js
  27. 0 0
      src/main/webapp/static/js/16.7662204479a0b231c592.js
  28. 0 0
      src/main/webapp/static/js/17.0d41a6bbbbbb783d2eb7.js
  29. 0 0
      src/main/webapp/static/js/17.8d4c3a7baf43e6be1d24.js
  30. 0 0
      src/main/webapp/static/js/18.76eec28f2fbc9c819b94.js
  31. 0 0
      src/main/webapp/static/js/18.be19056c453f2f2ead21.js
  32. 0 0
      src/main/webapp/static/js/19.a7b1c4d6bad8a0cd6e93.js
  33. 0 0
      src/main/webapp/static/js/19.d4aff2a8929872295a92.js
  34. 0 0
      src/main/webapp/static/js/2.eab4a1a1e7e53e6f4763.js
  35. 0 0
      src/main/webapp/static/js/2.f94e7cc9ca86d0c399d7.js
  36. 0 0
      src/main/webapp/static/js/20.888d0bd10df89a2bc664.js
  37. 0 0
      src/main/webapp/static/js/20.cbfa5ced02f7977d9240.js
  38. 0 0
      src/main/webapp/static/js/21.086cc785a3b470339c35.js
  39. 0 0
      src/main/webapp/static/js/21.4a8b84b86ad8eb447051.js
  40. 0 0
      src/main/webapp/static/js/22.1142b320007a1bc7467b.js
  41. 0 0
      src/main/webapp/static/js/22.7da53de2e213be07f214.js
  42. 0 0
      src/main/webapp/static/js/23.19b8c6698343760153a7.js
  43. 0 0
      src/main/webapp/static/js/23.8d187990f448d6f48a4c.js
  44. 0 0
      src/main/webapp/static/js/24.2438e0b4ccc5568715b8.js
  45. 0 0
      src/main/webapp/static/js/24.cc91abaf9bb59be2c823.js
  46. 0 0
      src/main/webapp/static/js/25.4d0b84058dff129607a1.js
  47. 0 0
      src/main/webapp/static/js/25.5fb700b08a0877440593.js
  48. 0 0
      src/main/webapp/static/js/26.a84cdb4794e007209526.js
  49. 0 0
      src/main/webapp/static/js/26.b5fe423b3c16ed41cf27.js
  50. 0 0
      src/main/webapp/static/js/27.5b55df645a7d0d7f60af.js
  51. 0 0
      src/main/webapp/static/js/27.dce888c2e4f78ea683eb.js
  52. 0 0
      src/main/webapp/static/js/28.214f11b562cde930892e.js
  53. 0 0
      src/main/webapp/static/js/28.38f546a173a7d6ef39f1.js
  54. 0 0
      src/main/webapp/static/js/29.22a97493903971d34666.js
  55. 0 0
      src/main/webapp/static/js/29.5e71b7dd7ec8d4404bb0.js
  56. 0 0
      src/main/webapp/static/js/3.40033b6f489e8c3bb4b5.js
  57. 0 0
      src/main/webapp/static/js/3.ce5258fb308f9abce678.js
  58. 0 0
      src/main/webapp/static/js/30.19e0a8bdc2dc078523a2.js
  59. 0 0
      src/main/webapp/static/js/30.dcea0f469dda8fd6d322.js
  60. 0 0
      src/main/webapp/static/js/31.f1f973bf08482187d0c2.js
  61. 0 0
      src/main/webapp/static/js/32.61060dd40674e9115f93.js
  62. 0 0
      src/main/webapp/static/js/33.1786477b948415455d6c.js
  63. 0 0
      src/main/webapp/static/js/33.a35f3d8838dc3b759f6f.js
  64. 0 0
      src/main/webapp/static/js/34.2b953a54aa9fa24921a7.js
  65. 0 0
      src/main/webapp/static/js/34.5e4fcdae370c1fb13a62.js
  66. 1 0
      src/main/webapp/static/js/35.2a3cfc33ad7f8ee8d49e.js
  67. 0 0
      src/main/webapp/static/js/35.444d017f53ef1f93f9b0.js
  68. 0 0
      src/main/webapp/static/js/36.3abc3886147e7fd17908.js
  69. 0 0
      src/main/webapp/static/js/36.59545ad7951bd0982f51.js
  70. 0 0
      src/main/webapp/static/js/37.91baeb02d8e768e8e1e6.js
  71. 0 0
      src/main/webapp/static/js/37.ae929f8d43fdee3a2080.js
  72. 0 0
      src/main/webapp/static/js/38.98e35887404e6a2ea814.js
  73. 0 0
      src/main/webapp/static/js/38.e5e92b40d991ad36d0fe.js
  74. 0 0
      src/main/webapp/static/js/39.097112cda0c6b2e8a66d.js
  75. 0 0
      src/main/webapp/static/js/39.9f84388a3250b1be1d57.js
  76. 0 0
      src/main/webapp/static/js/4.70cf501cf36240661fe9.js
  77. 0 0
      src/main/webapp/static/js/4.caed50d95023811fbfa6.js
  78. 0 0
      src/main/webapp/static/js/40.6618603073a313a11aec.js
  79. 0 0
      src/main/webapp/static/js/40.c7767385ec898fe97f51.js
  80. 0 0
      src/main/webapp/static/js/41.2aff4141fb26b03ef5f3.js
  81. 0 0
      src/main/webapp/static/js/41.f2e49a4b20e50a7da5c0.js
  82. 0 0
      src/main/webapp/static/js/42.5b117eee1585032f9dec.js
  83. 0 0
      src/main/webapp/static/js/42.678b91f8cca9d4f9f2c8.js
  84. 0 0
      src/main/webapp/static/js/43.1e9ebcadcbc6de132cfc.js
  85. 0 0
      src/main/webapp/static/js/43.38754c25698eedf725d4.js
  86. 0 0
      src/main/webapp/static/js/44.e3d8b03cebf48b35ee67.js
  87. 0 0
      src/main/webapp/static/js/45.05f43016b80afcd0e4ca.js
  88. 0 0
      src/main/webapp/static/js/46.3f8e4e884a4e03630040.js
  89. 0 0
      src/main/webapp/static/js/46.a356834229838a9c870f.js
  90. 0 0
      src/main/webapp/static/js/47.3a927b6d10ebb300b50d.js
  91. 0 0
      src/main/webapp/static/js/47.be89b076546d547af1ef.js
  92. 0 0
      src/main/webapp/static/js/48.3771102cd8c85b21a591.js
  93. 0 0
      src/main/webapp/static/js/48.bca49af8c5113a5bf2e7.js
  94. 1 0
      src/main/webapp/static/js/49.eae1ac5388482869282b.js
  95. 0 0
      src/main/webapp/static/js/5.2fd39f4949a4bef57b21.js
  96. 0 0
      src/main/webapp/static/js/5.512d64fc616204c72585.js
  97. 0 0
      src/main/webapp/static/js/50.2c12a8fb61951303264b.js
  98. 0 0
      src/main/webapp/static/js/50.445d661aa960a49c5247.js
  99. 0 0
      src/main/webapp/static/js/51.a7c467d02e2b493d1b92.js
  100. 0 0
      src/main/webapp/static/js/51.cca9970d2fff8f8b6a73.js

+ 74 - 0
log.txt

@@ -657,3 +657,77 @@ Caused by: java.lang.UnsatisfiedLinkError: no opencv_java401 in java.library.pat
 	... 38 more
 [2019-01-31 15:29:59] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
 [2019-01-31 15:30:39] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 21:47:25] [WARN ] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'videoRecognitionServiceImpl' defined in file [/Users/drew/Projects/Java/shouyoudianjing/target/classes/com/izouma/awesomeadmin/service/impl/VideoRecognitionServiceImpl.class]: Instantiation of bean failed; nested exception is java.lang.UnsatisfiedLinkError: no opencv_java401 in java.library.path
+[2019-01-31 21:47:25] [ERROR] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@577f9109] to prepare test instance [RecognitionTest@4303b7f0]
+java.lang.IllegalStateException: Failed to load ApplicationContext
+	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
+	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
+	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117)
+	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
+	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)
+	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
+	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
+	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
+	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
+	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
+	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
+	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
+	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
+	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
+	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
+	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
+	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
+	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
+	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
+Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'videoRecognitionServiceImpl' defined in file [/Users/drew/Projects/Java/shouyoudianjing/target/classes/com/izouma/awesomeadmin/service/impl/VideoRecognitionServiceImpl.class]: Instantiation of bean failed; nested exception is java.lang.UnsatisfiedLinkError: no opencv_java401 in java.library.path
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1116)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1060)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759)
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
+	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:128)
+	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
+	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
+	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
+	... 24 more
+Caused by: java.lang.UnsatisfiedLinkError: no opencv_java401 in java.library.path
+	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
+	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
+	at java.lang.System.loadLibrary(System.java:1122)
+	at com.izouma.awesomeadmin.service.impl.VideoRecognitionServiceImpl.<clinit>(VideoRecognitionServiceImpl.java:54)
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
+	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
+	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
+	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
+	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
+	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1108)
+	... 38 more
+[2019-01-31 22:05:05] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:06:23] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:25:56] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:27:06] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:34:27] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:45:50] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:46:51] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:47:56] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:50:47] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:52:08] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:52:56] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:54:31] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 22:55:53] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 23:01:00] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 23:14:25] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.
+[2019-01-31 23:15:11] [WARN ] - Bad pool size config, start 3 < min 5. Using 5 as start.

+ 4 - 1
src/main/java/com/izouma/awesomeadmin/service/VideoRecognitionService.java

@@ -1,15 +1,18 @@
 package com.izouma.awesomeadmin.service;
 
 import org.opencv.core.Mat;
+import org.opencv.ml.SVM;
 
 import java.util.Map;
 
 public interface VideoRecognitionService {
     boolean start(String videoPath);
 
+    boolean matchGameOver(SVM svm, Mat inputImage);
+
     String extractRank(Mat inputImage);
 
     String extractGameTime(Mat inputImage);
 
-    Map<String,Object> stat(String videoPath);
+    Map<String, Object> stat(String videoPath);
 }

+ 82 - 24
src/main/java/com/izouma/awesomeadmin/service/impl/VideoRecognitionServiceImpl.java

@@ -11,6 +11,7 @@ import org.apache.commons.lang.StringUtils;
 import org.hibernate.validator.internal.util.privilegedactions.GetResource;
 import org.opencv.core.*;
 import org.opencv.highgui.HighGui;
+import org.opencv.imgcodecs.Imgcodecs;
 import org.opencv.imgproc.Imgproc;
 import org.opencv.ml.SVM;
 import org.opencv.videoio.VideoCapture;
@@ -23,10 +24,7 @@ import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -41,10 +39,10 @@ import static org.opencv.imgproc.Imgproc.*;
 
 @Service
 public class VideoRecognitionServiceImpl implements VideoRecognitionService {
-    public static boolean                          DEBUG     = false;
-    private       ThreadPoolExecutor               executor  = new ThreadPoolExecutor(10, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
-    private       Map<String, Map<String, Object>> resultMap = new HashMap<>();
-    private       Map<String, Long>                lastStat  = new HashMap<>();
+    public static boolean DEBUG = false;
+    private ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
+    private Map<String, Map<String, Object>> resultMap = new HashMap<>();
+    private Map<String, Long> lastStat = new HashMap<>();
 
     static {
         CLibrary.INSTANCE.setlocale(CLibrary.LC_ALL, "C");
@@ -58,9 +56,9 @@ public class VideoRecognitionServiceImpl implements VideoRecognitionService {
     public interface CLibrary extends Library {
         CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
 
-        int LC_CTYPE   = 0;
+        int LC_CTYPE = 0;
         int LC_NUMERIC = 1;
-        int LC_ALL     = 6;
+        int LC_ALL = 6;
 
         // char *setlocale(int category, const char *locale);
         String setlocale(int category, String locale);
@@ -87,20 +85,7 @@ public class VideoRecognitionServiceImpl implements VideoRecognitionService {
                     if (frameCount % 3 != 0) {
                         continue;
                     }
-                    long lastTs = lastStat.get(videoPath);
-                    if (System.currentTimeMillis() - lastTs > 60 * 1000) {
-                        break;
-                    }
-                    if (frame.cols() < frame.rows()) {
-                        rotate(frame, frame, ROTATE_90_COUNTERCLOCKWISE);
-                    }
-                    resize(frame, v, new Size(854, 480));
-                    Mat p = v.reshape(1, 1);
-                    p.convertTo(p, CV_32FC1);
-                    float res = svm.predict(p);
-                    System.out.println("predict res: " + res);
-
-                    if (res == 1) {
+                    if (matchGameOver(svm, frame)) {
                         String rank = extractRank(frame);
                         String time = extractGameTime(frame);
                         if (StringUtils.isNotEmpty(rank) && StringUtils.isNotEmpty(time)) {
@@ -142,6 +127,20 @@ public class VideoRecognitionServiceImpl implements VideoRecognitionService {
         return false;
     }
 
+    @Override
+    public boolean matchGameOver(SVM svm, Mat inputImage) {
+        if (inputImage.cols() < inputImage.rows()) {
+            rotate(inputImage, inputImage, ROTATE_90_COUNTERCLOCKWISE);
+        }
+        Mat v = new Mat();
+        removeBlackBar(inputImage, inputImage);
+        resize(inputImage, v, new Size(854, 480));
+        Mat p = v.reshape(1, 1);
+        p.convertTo(p, CV_32FC1);
+        float res = svm.predict(p);
+        return res == 1;
+    }
+
     @Override
     public String extractRank(Mat inputImage) {
         String result = null;
@@ -279,6 +278,7 @@ public class VideoRecognitionServiceImpl implements VideoRecognitionService {
         return result;
     }
 
+
     @Override
     public Map<String, Object> stat(String videoPath) {
         lastStat.put(videoPath, System.currentTimeMillis());
@@ -361,4 +361,62 @@ public class VideoRecognitionServiceImpl implements VideoRecognitionService {
             HighGui.imshow(name, copy);
         }
     }
+
+    private void removeBlackBar(Mat src, Mat dst) {
+        int[] top = new int[20];
+        int[] bottom = new int[20];
+        int[] left = new int[20];
+        int[] right = new int[20];
+        int rowStep = (int) (src.rows() * 0.4 / 20);
+        int colStep = (int) (src.cols() * 0.4 / 20);
+        int r = (int) (src.rows() * 0.3);
+        for (int i = 0; i < 20; i++) {
+            for (int c = 2; c + 2 < src.cols(); c++) {
+                double B = (src.get(r, c - 2)[0] + src.get(r, c - 1)[0] + src.get(r, c)[0] + src.get(r, c + 1)[0] + src.get(r, c + 2)[0]) / 3f;
+                double G = (src.get(r, c - 2)[1] + src.get(r, c - 1)[1] + src.get(r, c)[1] + src.get(r, c + 1)[1] + src.get(r, c + 2)[1]) / 3f;
+                double R = (src.get(r, c - 2)[2] + src.get(r, c - 1)[2] + src.get(r, c)[2] + src.get(r, c + 1)[2] + src.get(r, c + 2)[2]) / 3f;
+                if (B > 5 && G > 5 && R > 5) {
+                    left[i] = c;
+                    break;
+                }
+            }
+            for (int c = src.cols() - 3; c - 2 >= 0; c--) {
+                double B = (src.get(r, c - 2)[0] + src.get(r, c - 1)[0] + src.get(r, c)[0] + src.get(r, c + 1)[0] + src.get(r, c + 2)[0]) / 3f;
+                double G = (src.get(r, c - 2)[1] + src.get(r, c - 1)[1] + src.get(r, c)[1] + src.get(r, c + 1)[1] + src.get(r, c + 2)[1]) / 3f;
+                double R = (src.get(r, c - 2)[2] + src.get(r, c - 1)[2] + src.get(r, c)[2] + src.get(r, c + 1)[2] + src.get(r, c + 2)[2]) / 3f;
+                if (B > 5 && G > 5 && R > 5) {
+                    right[i] = c;
+                    break;
+                }
+            }
+            r += rowStep;
+        }
+        int c = (int) (src.cols() * 0.3);
+        for (int i = 0; i < 20; i++) {
+            for (r = 2; r + 2 < src.rows(); r++) {
+                double B = (src.get(r, c - 2)[0] + src.get(r, c - 1)[0] + src.get(r, c)[0] + src.get(r, c + 1)[0] + src.get(r, c + 2)[0]) / 3f;
+                double G = (src.get(r, c - 2)[1] + src.get(r, c - 1)[1] + src.get(r, c)[1] + src.get(r, c + 1)[1] + src.get(r, c + 2)[1]) / 3f;
+                double R = (src.get(r, c - 2)[2] + src.get(r, c - 1)[2] + src.get(r, c)[2] + src.get(r, c + 1)[2] + src.get(r, c + 2)[2]) / 3f;
+                if (B > 5 && G > 5 && R > 5) {
+                    top[i] = r;
+                    break;
+                }
+            }
+            for (r = src.rows() - 3; r - 2 >= 0; r--) {
+                double B = (src.get(r, c - 2)[0] + src.get(r, c - 1)[0] + src.get(r, c)[0] + src.get(r, c + 1)[0] + src.get(r, c + 2)[0]) / 3f;
+                double G = (src.get(r, c - 2)[1] + src.get(r, c - 1)[1] + src.get(r, c)[1] + src.get(r, c + 1)[1] + src.get(r, c + 2)[1]) / 3f;
+                double R = (src.get(r, c - 2)[2] + src.get(r, c - 1)[2] + src.get(r, c)[2] + src.get(r, c + 1)[2] + src.get(r, c + 2)[2]) / 3f;
+                if (B > 5 && G > 5 && R > 5) {
+                    bottom[i] = r;
+                    break;
+                }
+            }
+            c += colStep;
+        }
+        int offsetTop = (int) Math.max(Arrays.stream(top).average().getAsDouble() - 2, 0);
+        int offsetBottom = (int) Math.min(Arrays.stream(bottom).average().getAsDouble() + 2, src.rows() - 1);
+        int offsetLeft = (int) Math.max(Arrays.stream(left).average().getAsDouble() - 2, 0);
+        int offsetRight = (int) Math.min(Arrays.stream(right).average().getAsDouble() + 2, src.cols() - 1);
+        new Mat(src, new Rect(new Point(offsetLeft, offsetTop), new Point(offsetRight, offsetBottom))).copyTo(dst);
+    }
 }

+ 1 - 1
src/main/webapp/WEB-INF/html/admin.html

@@ -1 +1 @@
-<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=referrer content=origin><title>管理后台</title><link rel=icon href=/static/favicon.ico><script src=/static/polyfill.min.js></script><script src=/static/fontawesome-v5.2.0.js></script><link href=/static/css/admin.a99382f8104ef0229e42fbe0f11ef186.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.6f19a3433eca47fa8152.js></script><script type=text/javascript src=/static/js/vendor.631c08d5fc0f22d7ee46.js></script><script type=text/javascript src=/static/js/admin.00a9852ea8d0bdb19362.js></script></body></html>
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=referrer content=origin><title>管理后台</title><link rel=icon href=/static/favicon.ico><script src=/static/polyfill.min.js></script><script src=/static/fontawesome-v5.2.0.js></script><link href=/static/css/admin.2dce5488fb028ed0640b53131cad452e.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.611495a4358b04434ff2.js></script><script type=text/javascript src=/static/js/vendor.c97b4bedfdfdb8dc9880.js></script><script type=text/javascript src=/static/js/admin.a729d9a459869d201a2c.js></script></body></html>

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/RongIMLib-2.2.5.min.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/css/admin.2dce5488fb028ed0640b53131cad452e.css


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/css/admin.a99382f8104ef0229e42fbe0f11ef186.css


Разлика између датотеке није приказан због своје велике величине
+ 0 - 1
src/main/webapp/static/css/loginAdmin.a1de29a9f9c1d5b671b1965892c17dd1.css


BIN
src/main/webapp/static/img/demo_picture.d0e14fc.jpg


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/0.89b52f55dd4626b1505f.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/0.bdf8af6bf787f1f1b45c.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/1.b4eec83944a0f2aab650.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/1.c3536192453568b305ed.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/10.7b0891c6aa5bc43d01d2.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/10.d33e24f55d8ebf7332b6.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/11.255577c0b445be9ca239.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/11.73bf16410ccf67b4ed94.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/12.69aea40e38a6cc16fa37.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/12.77e0e31ea6e36df0f7e2.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/13.545b34f8f6bf443c2142.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/13.f0c3f9186a92c4ae5c46.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/14.4435d0ad4daeeb3d1fe3.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/14.58b6e0f57e77335a4abd.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/15.615675d260188d2c9ab7.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/15.ba79ba438ef0f6542037.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/16.09d1c5d3db4ca554d41b.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/16.7662204479a0b231c592.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/17.0d41a6bbbbbb783d2eb7.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/17.8d4c3a7baf43e6be1d24.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/18.76eec28f2fbc9c819b94.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/18.be19056c453f2f2ead21.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/19.a7b1c4d6bad8a0cd6e93.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/19.d4aff2a8929872295a92.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/2.eab4a1a1e7e53e6f4763.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/2.f94e7cc9ca86d0c399d7.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/20.888d0bd10df89a2bc664.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/20.cbfa5ced02f7977d9240.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/21.086cc785a3b470339c35.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/21.4a8b84b86ad8eb447051.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/22.1142b320007a1bc7467b.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/22.7da53de2e213be07f214.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/23.19b8c6698343760153a7.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/23.8d187990f448d6f48a4c.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/24.2438e0b4ccc5568715b8.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/24.cc91abaf9bb59be2c823.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/25.4d0b84058dff129607a1.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/25.5fb700b08a0877440593.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/26.a84cdb4794e007209526.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/26.b5fe423b3c16ed41cf27.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/27.5b55df645a7d0d7f60af.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/27.dce888c2e4f78ea683eb.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/28.214f11b562cde930892e.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/28.38f546a173a7d6ef39f1.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/29.22a97493903971d34666.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/29.5e71b7dd7ec8d4404bb0.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/3.40033b6f489e8c3bb4b5.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/3.ce5258fb308f9abce678.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/30.19e0a8bdc2dc078523a2.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/30.dcea0f469dda8fd6d322.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/31.f1f973bf08482187d0c2.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/32.61060dd40674e9115f93.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/33.1786477b948415455d6c.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/33.a35f3d8838dc3b759f6f.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/34.2b953a54aa9fa24921a7.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/34.5e4fcdae370c1fb13a62.js


+ 1 - 0
src/main/webapp/static/js/35.2a3cfc33ad7f8ee8d49e.js

@@ -0,0 +1 @@
+webpackJsonp([35],{"du+0":function(t,e){},izdZ:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});r("NYxO");var i={created:function(){this.getIframeSrc()},data:function(){return{iframeSrc:"/404"}},computed:{height:function(){return window.innerHeight-104+"px"}},methods:{getIframeSrc:function(){this.iframeSrc=this.$route.query.code}},watch:{$route:function(){this.getIframeSrc()}}},n={render:function(){var t=this.$createElement;return(this._self._c||t)("iframe",{staticClass:"iframe",attrs:{src:this.iframeSrc,height:this.height,width:"100%"}})},staticRenderFns:[]};var c=r("VU/8")(i,n,!1,function(t){r("du+0")},"data-v-7fa6d168",null);e.default=c.exports}});

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/35.444d017f53ef1f93f9b0.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/36.3abc3886147e7fd17908.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/36.59545ad7951bd0982f51.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/37.91baeb02d8e768e8e1e6.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/37.ae929f8d43fdee3a2080.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/38.98e35887404e6a2ea814.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/38.e5e92b40d991ad36d0fe.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/39.097112cda0c6b2e8a66d.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/39.9f84388a3250b1be1d57.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/4.70cf501cf36240661fe9.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/4.caed50d95023811fbfa6.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/40.6618603073a313a11aec.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/40.c7767385ec898fe97f51.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/41.2aff4141fb26b03ef5f3.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/41.f2e49a4b20e50a7da5c0.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/42.5b117eee1585032f9dec.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/42.678b91f8cca9d4f9f2c8.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/43.1e9ebcadcbc6de132cfc.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/43.38754c25698eedf725d4.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/44.e3d8b03cebf48b35ee67.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/45.05f43016b80afcd0e4ca.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/46.3f8e4e884a4e03630040.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/46.a356834229838a9c870f.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/47.3a927b6d10ebb300b50d.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/47.be89b076546d547af1ef.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/48.3771102cd8c85b21a591.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/48.bca49af8c5113a5bf2e7.js


+ 1 - 0
src/main/webapp/static/js/49.eae1ac5388482869282b.js

@@ -0,0 +1 @@
+webpackJsonp([49],{NRkp:function(e,t){},Wh3M:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("el-form",{ref:"form",staticStyle:{"max-width":"500px"},attrs:{model:e.formData,rules:e.rules,"label-width":"80px","label-position":"right",size:"small"}},[a("el-form-item",{attrs:{prop:"dataruleName",label:"权限名称"}},[a("el-input",{model:{value:e.formData.dataruleName,callback:function(t){e.$set(e.formData,"dataruleName",t)},expression:"formData.dataruleName"}})],1),e._v(" "),a("el-form-item",{attrs:{prop:"permission",label:"权限标识"}},[a("el-input",{model:{value:e.formData.permission,callback:function(t){e.$set(e.formData,"permission",t)},expression:"formData.permission"}})],1),e._v(" "),a("el-form-item",[a("el-button",{attrs:{loading:e.$store.state.fetchingData,type:"primary"},on:{click:e.onSave}},[e._v("保存")]),e._v(" "),a("el-button",{on:{click:function(t){e.$router.go(-1)}}},[e._v("取消")])],1)],1)],1)},staticRenderFns:[]};var s=a("VU/8")({created:function(){var e=this;this.$route.query.id&&this.$http.get({url:"/sysDatarule/getOne",data:{id:this.$route.query.id}}).then(function(t){t.success&&(e.formData=t.data)})},data:function(){return{saving:!1,formData:{},rules:{dataruleName:[{required:!0,message:"请填写权限名称",trigger:"blur"}],permission:[{required:!0,message:"请填写权限标识",trigger:"blur"}]},menus:[]}},methods:{onSave:function(){var e=this;this.$refs.form.validate(function(t){if(!t)return!1;e.submit()})},submit:function(){var e=this;this.$http.post({url:this.formData.id?"/sysDatarule/update":"/sysDatarule/save",data:this.formData}).then(function(t){t.success?(e.$message.success("成功"),e.$router.go(-1)):e.$message.warning("失败")})}}},r,!1,function(e){a("NRkp")},"data-v-3d1f3150",null);t.default=s.exports}});

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/5.2fd39f4949a4bef57b21.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/5.512d64fc616204c72585.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/50.2c12a8fb61951303264b.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/50.445d661aa960a49c5247.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/51.a7c467d02e2b493d1b92.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/webapp/static/js/51.cca9970d2fff8f8b6a73.js


Неке датотеке нису приказане због велике количине промена