|
|
@@ -5,44 +5,16 @@ import com.izouma.awesomeadmin.model.PlayerInfo;
|
|
|
import com.izouma.awesomeadmin.service.OSSFileService;
|
|
|
import com.izouma.awesomeadmin.service.PlayerInfoService;
|
|
|
import com.izouma.awesomeadmin.service.VideoRecognitionService;
|
|
|
-import com.sun.jna.Library;
|
|
|
-import com.sun.jna.Native;
|
|
|
-import com.sun.jna.Platform;
|
|
|
-import net.sourceforge.tess4j.ITesseract;
|
|
|
-import net.sourceforge.tess4j.Tesseract;
|
|
|
-import net.sourceforge.tess4j.TesseractException;
|
|
|
-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;
|
|
|
-import org.opencv.videoio.Videoio;
|
|
|
+import com.izouma.awesomeadmin.util.VideoProcessTool;
|
|
|
+import org.bytedeco.javacv.FrameGrabber;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
-import sun.misc.BASE64Encoder;
|
|
|
|
|
|
-import javax.imageio.ImageIO;
|
|
|
-import java.awt.image.BufferedImage;
|
|
|
-import java.io.ByteArrayInputStream;
|
|
|
-import java.io.ByteArrayOutputStream;
|
|
|
-import java.io.IOException;
|
|
|
-import java.io.InputStream;
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
-import java.util.*;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
|
import java.util.concurrent.ThreadPoolExecutor;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
-import java.util.regex.Pattern;
|
|
|
-
|
|
|
-import static org.opencv.core.Core.ROTATE_90_COUNTERCLOCKWISE;
|
|
|
-import static org.opencv.core.Core.rotate;
|
|
|
-import static org.opencv.core.CvType.*;
|
|
|
-import static org.opencv.highgui.HighGui.*;
|
|
|
-import static org.opencv.imgcodecs.Imgcodecs.*;
|
|
|
-import static org.opencv.imgproc.Imgproc.*;
|
|
|
|
|
|
@Service
|
|
|
public class VideoRecognitionServiceImpl implements VideoRecognitionService {
|
|
|
@@ -51,34 +23,15 @@ public class VideoRecognitionServiceImpl implements VideoRecognitionService {
|
|
|
private OSSFileService ossFileService;
|
|
|
@Autowired
|
|
|
private PlayerInfoService playerInfoService;
|
|
|
+ private VideoProcessTool videoProcessTool = new VideoProcessTool();
|
|
|
|
|
|
public static boolean DEBUG = false;
|
|
|
- private static Map<String, Map<String, Object>> resultMap = new HashMap<>();
|
|
|
+ private static Map<String, Map<String, String>> resultMap = new HashMap<>();
|
|
|
private static Map<String, Long> lastStat = new HashMap<>();
|
|
|
private static Map<String, Object> processing = new HashMap<>();
|
|
|
|
|
|
private ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
|
|
|
|
|
|
- static {
|
|
|
- System.out.println(System.getProperty("java.library.path"));
|
|
|
- CLibrary.INSTANCE.setlocale(CLibrary.LC_ALL, "C");
|
|
|
- CLibrary.INSTANCE.setlocale(CLibrary.LC_NUMERIC, "C");
|
|
|
- CLibrary.INSTANCE.setlocale(CLibrary.LC_CTYPE, "C");
|
|
|
- System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
|
|
|
- System.loadLibrary("tesseract");
|
|
|
- }
|
|
|
-
|
|
|
- public interface CLibrary extends Library {
|
|
|
- CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
|
|
|
-
|
|
|
- int LC_CTYPE = 0;
|
|
|
- int LC_NUMERIC = 1;
|
|
|
- int LC_ALL = 6;
|
|
|
-
|
|
|
- // char *setlocale(int category, const char *locale);
|
|
|
- String setlocale(int category, String locale);
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public boolean start(String videoPath) {
|
|
|
if (processing.get(videoPath) != null) {
|
|
|
@@ -87,67 +40,18 @@ public class VideoRecognitionServiceImpl implements VideoRecognitionService {
|
|
|
processing.put(videoPath, videoPath);
|
|
|
lastStat.put(videoPath, System.currentTimeMillis());
|
|
|
resultMap.remove(videoPath);
|
|
|
- VideoCapture capture = new VideoCapture();
|
|
|
- if (capture.open(videoPath)) {
|
|
|
- System.out.println(capture.get(Videoio.CAP_PROP_FRAME_WIDTH));
|
|
|
- System.out.println(capture.get(Videoio.CAP_PROP_FRAME_HEIGHT));
|
|
|
- executor.execute(() -> {
|
|
|
- SVM svm = SVM.load(GetResource.class.getClassLoader().getResource("trainneddata/pubg.xml").getPath());
|
|
|
- Mat frame = new Mat();
|
|
|
- Mat v = new Mat();
|
|
|
- long frameCount = 0;
|
|
|
- while (capture.read(frame)) {
|
|
|
- frameCount++;
|
|
|
- if (frameCount % 200 == 0) {
|
|
|
- System.gc();
|
|
|
- }
|
|
|
- if (System.currentTimeMillis() - lastStat.get(videoPath) > 60 * 1000) {
|
|
|
- break;
|
|
|
- }
|
|
|
- if (frameCount % 3 != 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (matchGameOver(svm, frame)) {
|
|
|
- String rank = extractRank(frame);
|
|
|
- String time = extractGameTime(frame);
|
|
|
- if (StringUtils.isNotEmpty(rank) && StringUtils.isNotEmpty(time)) {
|
|
|
- rank = rank.trim().replace(" ", "").replace("\n", "");
|
|
|
- time = time.trim().replace(" ", "").replace("\n", "");
|
|
|
- if (Pattern.matches("^第\\d{1,3}$", rank)
|
|
|
- && Pattern.matches("((^([0-9]+[.][0-9]*))|(^\\d{1,2}))分钟", time)) {
|
|
|
- System.out.println(rank);
|
|
|
- System.out.println(time);
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("rank", rank);
|
|
|
- map.put("time", time);
|
|
|
- BufferedImage image = createBufferedImage(frame);
|
|
|
- ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
|
|
|
- try {
|
|
|
- ImageIO.write(image, "png", baos);//写入流中
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- byte[] bytes = baos.toByteArray();//转换成字节
|
|
|
- BASE64Encoder encoder = new BASE64Encoder();
|
|
|
- String png_base64 = encoder.encodeBuffer(bytes).trim();//转换成base64串
|
|
|
- png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
|
|
|
- map.put("frame", "data:image/png;base64," + png_base64);
|
|
|
- resultMap.put(videoPath, map);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- System.out.println(frameCount + " frame processed");
|
|
|
+ executor.execute(() -> {
|
|
|
+ try {
|
|
|
+ Map<String, String> map = videoProcessTool.processVideo(videoPath, 0);
|
|
|
+ if (map != null) {
|
|
|
+ resultMap.put(videoPath, map);
|
|
|
}
|
|
|
- capture.release();
|
|
|
- frame.release();
|
|
|
- v.release();
|
|
|
- System.gc();
|
|
|
- processing.remove(videoPath);
|
|
|
- });
|
|
|
- return true;
|
|
|
- }
|
|
|
- return false;
|
|
|
+ } catch (FrameGrabber.Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ processing.remove(videoPath);
|
|
|
+ });
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -155,371 +59,30 @@ public class VideoRecognitionServiceImpl implements VideoRecognitionService {
|
|
|
if (playerInfo.getStatusFlag() > AppConstant.PlayerStatus.END) {
|
|
|
return;
|
|
|
}
|
|
|
- VideoCapture capture = new VideoCapture();
|
|
|
- if (capture.open(playerInfo.getVideo())) {
|
|
|
- System.out.println(capture.get(Videoio.CAP_PROP_FRAME_WIDTH));
|
|
|
- System.out.println(capture.get(Videoio.CAP_PROP_FRAME_HEIGHT));
|
|
|
- executor.execute(() -> {
|
|
|
- try {
|
|
|
- SVM svm = SVM.load(GetResource.class.getClassLoader().getResource("trainneddata/pubg.xml").getPath());
|
|
|
- Mat frame = new Mat();
|
|
|
- Mat v = new Mat();
|
|
|
- long frameCount = 0;
|
|
|
- while (capture.read(frame)) {
|
|
|
- frameCount++;
|
|
|
- if (frameCount % 200 == 0) {
|
|
|
- System.gc();
|
|
|
- }
|
|
|
- if (frameCount % 3 != 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (matchGameOver(svm, frame)) {
|
|
|
- String rank = extractRank(frame);
|
|
|
- String time = extractGameTime(frame);
|
|
|
- if (StringUtils.isEmpty(rank) || StringUtils.isEmpty(time)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- rank = rank.trim().replace(" ", "").replace("\n", "");
|
|
|
- time = time.trim().replace(" ", "").replace("\n", "");
|
|
|
- if (!Pattern.matches("^第\\d{1,3}$", rank)
|
|
|
- || !Pattern.matches("((^([0-9]+[.][0-9]*))|(^\\d{1,2}))分钟", time)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- System.out.println(rank);
|
|
|
- System.out.println(time);
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("rank", rank);
|
|
|
- map.put("time", time);
|
|
|
- String url = uploadImage(frame);
|
|
|
- playerInfo.setImage(url);
|
|
|
- playerInfo.setRanking(Integer.valueOf(rank.replace("第", "")));
|
|
|
- playerInfo.setLiveTime(time);
|
|
|
- playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED);
|
|
|
- break;
|
|
|
- }
|
|
|
- System.out.println(frameCount + " frame processed");
|
|
|
- }
|
|
|
- capture.release();
|
|
|
- frame.release();
|
|
|
- v.release();
|
|
|
- System.gc();
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- if (!playerInfo.getStatusFlag().equals(AppConstant.PlayerStatus.PROCESSED)) {
|
|
|
- playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED_FAIL);
|
|
|
- }
|
|
|
+ executor.execute(() -> {
|
|
|
+ try {
|
|
|
playerInfoService.updatePlayerInfo(playerInfo);
|
|
|
- });
|
|
|
- } else {
|
|
|
- playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED);
|
|
|
- playerInfoService.updatePlayerInfo(playerInfo);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @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;
|
|
|
- int m = inputImage.rows();
|
|
|
- int n = inputImage.cols();
|
|
|
- inputImage = inputImage.rowRange(0, (int) (m * 0.5)).colRange((int) (n * 0.5), n);
|
|
|
-
|
|
|
- Mat resultGray = new Mat(inputImage.rows(), inputImage.cols(), CV_8U, new Scalar(0));
|
|
|
- Mat resultColor = new Mat(inputImage.rows(), inputImage.cols(), CV_8UC3, new Scalar(255, 255, 255));
|
|
|
- HSVFilter(inputImage, resultGray, resultColor, 25, 65, 40, 255, 130, 255);
|
|
|
- imshow("gray", resultGray);
|
|
|
-
|
|
|
- int erosion_size = m / 400;
|
|
|
- erode(resultGray, resultGray, erosion_size);
|
|
|
-
|
|
|
- int dilation_size = m / 400 * 4;
|
|
|
- dilate(resultGray, resultGray, dilation_size);
|
|
|
-
|
|
|
- List<MatOfPoint> contours = new ArrayList<>();
|
|
|
- Mat hierarchy = new Mat();
|
|
|
- findContours(resultGray, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
|
|
|
- Rect textRect = new Rect();
|
|
|
- for (int i = 0; i < contours.size(); i++) {
|
|
|
- Rect rect = boundingRect(contours.get(i));
|
|
|
- if (rect.area() > textRect.area()) {
|
|
|
- textRect = rect;
|
|
|
- }
|
|
|
- }
|
|
|
- if (textRect.width > 0 && textRect.height > 0) {
|
|
|
- Mat textImg = inputImage.rowRange(textRect.y, textRect.y + textRect.height).colRange(textRect.x, textRect.x + textRect.width);
|
|
|
- Mat mat1 = new Mat(textImg.rows(), textImg.cols(), CV_8UC1);
|
|
|
- for (int i = 0; i < textImg.rows(); i++) {
|
|
|
- for (int j = 0; j < textImg.cols(); j++) {
|
|
|
- double s = (textImg.get(i, j)[1] + textImg.get(i, j)[2]) / 2;
|
|
|
- mat1.put(i, j, s > 220 ? s : 0);
|
|
|
+ Map<String, String> map = videoProcessTool.processVideo(playerInfo.getVideo(), 0);
|
|
|
+ if (map != null) {
|
|
|
+ playerInfo.setImage(map.get("image"));
|
|
|
+ playerInfo.setRanking(Integer.valueOf(map.get("rank").replace("第", "")));
|
|
|
+ playerInfo.setLiveTime(map.get("time"));
|
|
|
+ playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED);
|
|
|
+ } else {
|
|
|
+ playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED_FAIL);
|
|
|
}
|
|
|
+ } catch (FrameGrabber.Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ playerInfo.setStatusFlag(AppConstant.PlayerStatus.PROCESSED_FAIL);
|
|
|
}
|
|
|
- imshow("text", textImg);
|
|
|
- medianBlur(mat1, mat1, 3);
|
|
|
- imshow("mat1", mat1);
|
|
|
- for (MatOfPoint contour : contours) {
|
|
|
- Rect rect = boundingRect(contour);
|
|
|
- rectangle(inputImage, rect, new Scalar(0, 0, 255), 1);
|
|
|
- }
|
|
|
- rectangle(inputImage, textRect, new Scalar(0, 255, 0), 2);
|
|
|
- imshow("inputImage", inputImage);
|
|
|
- result = doOCR(mat1);
|
|
|
- textImg.release();
|
|
|
- mat1.release();
|
|
|
- }
|
|
|
- if (DEBUG) {
|
|
|
- waitKey(0);
|
|
|
- }
|
|
|
- inputImage.release();
|
|
|
- resultGray.release();
|
|
|
- resultColor.release();
|
|
|
-
|
|
|
- System.gc();
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public String extractGameTime(Mat inputImage) {
|
|
|
- String result = null;
|
|
|
- int m = inputImage.rows();
|
|
|
- int n = inputImage.cols();
|
|
|
- inputImage = inputImage.rowRange((int) (m * 0.5), (int) (m * 0.8)).colRange((int) (n * 0.5), n);
|
|
|
- Mat resultGray = new Mat(inputImage.rows(), inputImage.cols(), CV_8U, new Scalar(0));
|
|
|
- Mat resultColor = new Mat(inputImage.rows(), inputImage.cols(), CV_8UC3, new Scalar(255, 255, 255));
|
|
|
- HSVFilter(inputImage, resultGray, resultColor, 15, 28, 80, 255, 80, 255);
|
|
|
- imshow("gray", resultGray);
|
|
|
-
|
|
|
- int dilation_size = resultGray.rows() / 120 * 3;
|
|
|
- dilate(resultGray, resultGray, dilation_size);
|
|
|
-
|
|
|
- int erosion_size = resultGray.rows() / 120 * 3;
|
|
|
- erode(resultGray, resultGray, erosion_size);
|
|
|
-
|
|
|
- dilate(resultGray, resultGray, dilation_size);
|
|
|
-
|
|
|
- List<MatOfPoint> contours = new ArrayList<>();
|
|
|
- Mat hierarchy = new Mat();
|
|
|
- findContours(resultGray, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
|
|
|
- Rect textRect = new Rect();
|
|
|
- for (int i = 0; i < contours.size(); i++) {
|
|
|
- Rect rect = boundingRect(contours.get(i));
|
|
|
- if (rect.area() > textRect.area() && rect.height < inputImage.rows() / 3) {
|
|
|
- textRect = rect;
|
|
|
- }
|
|
|
- }
|
|
|
- if (textRect.width > 0 && textRect.height > 0) {
|
|
|
- Mat textImg = inputImage.rowRange(textRect.y, textRect.y + textRect.height).colRange(textRect.x, textRect.x + textRect.width);
|
|
|
- textImg.convertTo(textImg, CV_8UC3);
|
|
|
- Mat imageBf = new Mat();
|
|
|
- bilateralFilter(textImg, imageBf, 3, 3, 2);//双边滤波
|
|
|
- Mat imageEnhance = new Mat();
|
|
|
- Mat kernel = new Mat(3, 3, CV_32F);
|
|
|
- kernel.put(0, 0, 0);
|
|
|
- kernel.put(0, 1, -1);
|
|
|
- kernel.put(0, 2, 0);
|
|
|
- kernel.put(1, 0, 0);
|
|
|
- kernel.put(1, 1, 4);
|
|
|
- kernel.put(1, 2, 0);
|
|
|
- kernel.put(2, 0, 0);
|
|
|
- kernel.put(2, 1, -1);
|
|
|
- kernel.put(2, 2, 0);
|
|
|
- filter2D(imageBf, imageEnhance, CV_8UC3, kernel);
|
|
|
- imshow("text", textImg);
|
|
|
- imshow("imageBf", imageBf);
|
|
|
- imshow("imageEnhance", imageEnhance);
|
|
|
- cvtColor(textImg, textImg, COLOR_BGR2GRAY);
|
|
|
- textImg.convertTo(textImg, CV_8UC1);
|
|
|
- for (MatOfPoint contour : contours) {
|
|
|
- Rect rect = boundingRect(contour);
|
|
|
- rectangle(inputImage, rect, new Scalar(0, 0, 255), 1);
|
|
|
- }
|
|
|
- rectangle(inputImage, textRect, new Scalar(0, 255, 0), 1);
|
|
|
- imshow("inputImage", inputImage);
|
|
|
-
|
|
|
- result = doOCR(textImg);
|
|
|
- imageBf.release();
|
|
|
- imageEnhance.release();
|
|
|
- textImg.release();
|
|
|
- }
|
|
|
- if (DEBUG) {
|
|
|
- waitKey(0);
|
|
|
- }
|
|
|
- inputImage.release();
|
|
|
- resultGray.release();
|
|
|
- resultColor.release();
|
|
|
-
|
|
|
- System.gc();
|
|
|
- return result;
|
|
|
+ playerInfoService.updatePlayerInfo(playerInfo);
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
|
|
|
@Override
|
|
|
- public Map<String, Object> stat(String videoPath) {
|
|
|
+ public Map<String, String> stat(String videoPath) {
|
|
|
lastStat.put(videoPath, System.currentTimeMillis());
|
|
|
return resultMap.get(videoPath);
|
|
|
}
|
|
|
-
|
|
|
- private void dilate(Mat src, Mat dst, int dilation_size) {
|
|
|
- Mat dilationElement = getStructuringElement(MORPH_ELLIPSE,
|
|
|
- new Size(2 * dilation_size + 1, 2 * dilation_size + 1),
|
|
|
- new Point(dilation_size, dilation_size));
|
|
|
- Imgproc.dilate(src, dst, dilationElement);
|
|
|
- imshow("dilate", dst);
|
|
|
- }
|
|
|
-
|
|
|
- private void erode(Mat src, Mat dst, int erosion_size) {
|
|
|
- Mat erodeElement = getStructuringElement(MORPH_RECT,
|
|
|
- new Size(2 * erosion_size + 1, 2 * erosion_size + 1),
|
|
|
- new Point(erosion_size, erosion_size));
|
|
|
- Imgproc.erode(src, dst, erodeElement);
|
|
|
- imshow("erode", dst);
|
|
|
- }
|
|
|
-
|
|
|
- private BufferedImage createBufferedImage(Mat mat) {
|
|
|
- MatOfByte mob = new MatOfByte();
|
|
|
- imencode(".jpg", mat, mob);
|
|
|
- byte ba[] = mob.toArray();
|
|
|
- BufferedImage bi = null;
|
|
|
- try {
|
|
|
- bi = ImageIO.read(new ByteArrayInputStream(ba));
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return bi;
|
|
|
- }
|
|
|
-
|
|
|
- private void HSVFilter(Mat inputImage, Mat resultGray, Mat resultColor, int h_min, int h_max, int s_min, int s_max, int v_min, int v_max) {
|
|
|
- Mat hsvImage = new Mat();
|
|
|
- blur(inputImage, hsvImage, new Size(3, 3));
|
|
|
- cvtColor(hsvImage, hsvImage, COLOR_BGR2HSV);
|
|
|
- double H = 0.0, S = 0.0, V = 0.0;
|
|
|
- for (int i = 0; i < hsvImage.rows(); i++) {
|
|
|
- for (int j = 0; j < hsvImage.cols(); j++) {
|
|
|
- H = hsvImage.get(i, j)[0];
|
|
|
- S = hsvImage.get(i, j)[1];
|
|
|
- V = hsvImage.get(i, j)[2];
|
|
|
-
|
|
|
- if ((H >= h_min && H <= h_max)
|
|
|
- && (S >= s_min && S <= s_max)
|
|
|
- && (V >= v_min && V <= v_max)) {
|
|
|
- resultGray.put(i, j, 255d);
|
|
|
- resultColor.put(i, j, inputImage.get(i, j));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- hsvImage.release();
|
|
|
- }
|
|
|
-
|
|
|
- private String doOCR(Mat img) {
|
|
|
- BufferedImage bi = createBufferedImage(img);
|
|
|
- ITesseract instance = new Tesseract();
|
|
|
- instance.setDatapath(GetResource.class.getClassLoader().getResource("trainneddata").getPath());
|
|
|
- instance.setPageSegMode(7);
|
|
|
- instance.setLanguage("pubg");
|
|
|
- try {
|
|
|
- String result = instance.doOCR(bi);
|
|
|
- if (StringUtils.isNotEmpty(result)) {
|
|
|
- System.out.println(result);
|
|
|
- return result;
|
|
|
- }
|
|
|
- } catch (TesseractException e) {
|
|
|
- System.err.println(e.getMessage());
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- private void imshow(String name, Mat img) {
|
|
|
- if (DEBUG) {
|
|
|
- Mat copy = new Mat();
|
|
|
- img.copyTo(copy);
|
|
|
- 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);
|
|
|
- }
|
|
|
-
|
|
|
- private String uploadImage(Mat frame) {
|
|
|
- try {
|
|
|
- BufferedImage image = createBufferedImage(frame);
|
|
|
- ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
|
|
|
- ImageIO.write(image, "png", baos);//写入流中
|
|
|
- byte[] bytes = baos.toByteArray();//转换成字节
|
|
|
- InputStream in = new ByteArrayInputStream(bytes);
|
|
|
- String path = String.format("images/%s-%s.jpg", new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss").format(new Date()), UUID.randomUUID().toString());
|
|
|
- return ossFileService.upload(in, path);
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
}
|