x1ongzhu 6 лет назад
Родитель
Сommit
2563badb29

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

@@ -4,7 +4,7 @@ import com.izouma.awesomeadmin.constant.AppConstant;
 import com.izouma.awesomeadmin.model.PlayerInfo;
 import com.izouma.awesomeadmin.service.PlayerInfoService;
 import com.izouma.awesomeadmin.service.VideoRecognitionService;
-import com.izouma.awesomeadmin.util.VideoProcessTool;
+import com.izouma.awesomeadmin.util.VideoProcessToolNew;
 import org.bytedeco.javacv.FrameGrabber;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -19,8 +19,8 @@ import java.util.concurrent.TimeUnit;
 public class VideoRecognitionServiceImpl implements VideoRecognitionService {
 
     @Autowired
-    private PlayerInfoService playerInfoService;
-    private VideoProcessTool  videoProcessTool = new VideoProcessTool();
+    private PlayerInfoService   playerInfoService;
+    private VideoProcessToolNew videoProcessTool = new VideoProcessToolNew();
 
     public static  boolean                          DEBUG      = false;
     private static Map<String, Map<String, String>> resultMap  = new HashMap<>();

+ 6 - 20
src/main/java/com/izouma/awesomeadmin/util/VideoProcessTool.java

@@ -90,9 +90,8 @@ public class VideoProcessTool {
             inputImage.copyTo(rotated);
         }
         Mat resized = new Mat();
-        Mat noBlackBar = new Mat();
-        removeBlackBar(rotated, noBlackBar);
-        resize(noBlackBar, resized, new Size(854, 480));
+        removeBlackBar(rotated);
+        resize(rotated, resized, new Size(854, 480));
         Mat reshaped = resized.reshape(1, 1);
         Mat toPredict = new Mat();
         reshaped.convertTo(toPredict, CV_32F);
@@ -100,7 +99,6 @@ public class VideoProcessTool {
 
         rotated.release();
         resized.release();
-        noBlackBar.release();
         reshaped.release();
         toPredict.release();
         return res == 1;
@@ -285,25 +283,13 @@ public class VideoProcessTool {
         return recognizedText;
     }
 
-    private void removeBlackBar(Mat src, Mat dst) {
+    private void removeBlackBar(Mat src) {
         Mat gray = new Mat();
         cvtColor(src, gray, COLOR_BGR2GRAY);
-        Mat thres = new Mat();
-        threshold(gray, thres, 2, 255, THRESH_BINARY);
-        MatVector contours = new MatVector();
-        findContours(thres, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
-        Rect rect = boundingRect(contours.get(0));
-        for (int i = 1; i < contours.size(); i++) {
-            Rect r = boundingRect(contours.get(i));
-            if (r.area() > rect.area()) {
-                rect.deallocate();
-                rect = r;
-            }
-        }
-        src.colRange(rect.x(), rect.x() + rect.width()).rowRange(rect.y(), rect.y() + rect.height()).copyTo(dst);
+        threshold(gray, gray, 2, 255, THRESH_BINARY);
+        Rect rect = boundingRect(gray);
+        src.colRange(rect.x(), rect.x() + rect.width()).rowRange(rect.y(), rect.y() + rect.height());
         gray.release();
-        thres.release();
-        contours.deallocate();
         rect.deallocate();
     }
 

+ 22 - 34
src/main/java/com/izouma/awesomeadmin/util/VideoProcessToolNew.java

@@ -50,7 +50,7 @@ public class VideoProcessToolNew {
                 if (frameSkip > 0 && frameCount % frameSkip != 0) {
                     continue;
                 }
-                Mat frame = converterToMat.convert(vFrame);
+                Mat frame = removeBlackBarAndRotate(converterToMat.convert(vFrame));
                 if (matchGameOver(svm, frame)) {
                     String rank = extractRank(frame);
                     if (StringUtils.isEmpty(rank)) continue;
@@ -75,24 +75,14 @@ public class VideoProcessToolNew {
     }
 
     public boolean matchGameOver(SVM svm, Mat inputImage) {
-        Mat rotated = new Mat();
-        if (inputImage.cols() < inputImage.rows()) {
-            rotate(inputImage, rotated, ROTATE_90_COUNTERCLOCKWISE);
-        } else {
-            inputImage.copyTo(rotated);
-        }
         Mat resized = new Mat();
-        Mat noBlackBar = new Mat();
-        removeBlackBar(rotated, noBlackBar);
-        resize(noBlackBar, resized, new Size(854, 480));
+        resize(inputImage, resized, new Size(854, 480));
         Mat reshaped = resized.reshape(1, 1);
         Mat toPredict = new Mat();
         reshaped.convertTo(toPredict, CV_32F);
         float res = svm.predict(toPredict);
 
-        rotated.release();
         resized.release();
-        noBlackBar.release();
         reshaped.release();
         toPredict.release();
         return res == 1;
@@ -103,7 +93,7 @@ public class VideoProcessToolNew {
         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 roi = new Mat(src, new Range(0, (int) (m * 0.4)), new Range((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);
@@ -120,8 +110,9 @@ public class VideoProcessToolNew {
         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()));
+                Mat txtImg = new Mat(filtered, new Range(rect.y(), rect.y() + rect.height()), new Range(rect.x(), rect.x() + rect.width()));
+                String str = doOCR(txtImg);
+                txtImg.release();
                 System.out.println(str);
                 rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
                 if (str != null) {
@@ -141,13 +132,16 @@ public class VideoProcessToolNew {
     }
 
     public String extractGameTime(Mat src) {
+        imwrite("/tmp/time.jpg", 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 roi = new Mat(src, 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 gray = new Mat();
         adaptiveThreshold(filtered, gray, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 15, 12);
+        imwrite("/tmp/time_gray.jpg", gray);
         MatVector contours = new MatVector();
         findContours(gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
         List<Rect> rects = new ArrayList<>();
@@ -161,8 +155,9 @@ public class VideoProcessToolNew {
         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()));
+                Mat txtImg = new Mat(filtered, new Range(rect.y(), rect.y() + rect.height()), new Range(rect.x(), rect.x() + rect.width()));
+                String str = doOCR(txtImg);
+                txtImg.release();
                 System.out.println(str);
                 rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
                 if (str != null) {
@@ -222,26 +217,19 @@ public class VideoProcessToolNew {
         return recognizedText;
     }
 
-    private void removeBlackBar(Mat src, Mat dst) {
+    public Mat removeBlackBarAndRotate(Mat src) {
+        if (src.cols() < src.rows()) {
+            rotate(src, src, ROTATE_90_COUNTERCLOCKWISE);
+        }
         Mat gray = new Mat();
         cvtColor(src, gray, COLOR_BGR2GRAY);
-        Mat thres = new Mat();
-        threshold(gray, thres, 2, 255, THRESH_BINARY);
-        MatVector contours = new MatVector();
-        findContours(thres, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
-        Rect rect = boundingRect(contours.get(0));
-        for (int i = 1; i < contours.size(); i++) {
-            Rect r = boundingRect(contours.get(i));
-            if (r.area() > rect.area()) {
-                rect.deallocate();
-                rect = r;
-            }
-        }
-        src.colRange(rect.x(), rect.x() + rect.width()).rowRange(rect.y(), rect.y() + rect.height()).copyTo(dst);
+        threshold(gray, gray, 2, 255, THRESH_BINARY);
+        Rect rect = boundingRect(gray);
+        Mat dst = new Mat(src, new Range(rect.y(), rect.y() + rect.height()), new Range(rect.x(), rect.x() + rect.width()));
+        src.release();
         gray.release();
-        thres.release();
-        contours.deallocate();
         rect.deallocate();
+        return dst;
     }
 
     public BufferedImage createBufferedImage(Mat mat) {

+ 8 - 0
src/test/java/VideoProcessTest.java

@@ -11,6 +11,7 @@ import java.util.Map;
 
 import static org.bytedeco.javacpp.opencv_core.Mat;
 import static org.bytedeco.javacpp.opencv_imgcodecs.imread;
+import static org.bytedeco.javacpp.opencv_imgcodecs.imwrite;
 
 
 @RunWith(JUnit4.class)
@@ -93,4 +94,11 @@ public class VideoProcessTest {
         Mat img = imread("/Users/drew/Pictures/Screenshots/2019-03-29-03-20-01-svu0rzwo-0001.jpg");
         videoProcessToolNew.timeFilter(img);
     }
+
+    @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);
+    }
 }