|
|
@@ -19,10 +19,7 @@ import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
|
import java.nio.ByteBuffer;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.UUID;
|
|
|
+import java.util.*;
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
import static org.bytedeco.javacpp.lept.pixRead;
|
|
|
@@ -113,7 +110,7 @@ public class VideoProcessTool {
|
|
|
String result = null;
|
|
|
int m = inputImage.rows();
|
|
|
int n = inputImage.cols();
|
|
|
- Mat roi = inputImage.rowRange(0, (int) (m * 0.5)).colRange((int) (n * 0.5), n);
|
|
|
+ Mat roi = inputImage.rowRange(0, (int) (m * 0.4)).colRange((int) (n * 0.75), n);
|
|
|
|
|
|
Mat resultGray = new Mat(roi.rows(), roi.cols(), CV_8U, new Scalar(0));
|
|
|
HSVFilter(roi, resultGray, 25, 65, 40, 255, 130, 255);
|
|
|
@@ -165,6 +162,7 @@ public class VideoProcessTool {
|
|
|
}
|
|
|
rectangle(roi, textRect, new Scalar(0, 255, 0, 0), 2, LINE_AA, 0);
|
|
|
result = doOCR(blurred);
|
|
|
+ imwrite("/Users/drew/Desktop/img/text.jpg", blurred);
|
|
|
blurred.release();
|
|
|
}
|
|
|
roi.release();
|
|
|
@@ -231,6 +229,88 @@ public class VideoProcessTool {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ public String extractRank1(Mat src) {
|
|
|
+ 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 filtered = rankFilter(roi);
|
|
|
+ Mat gray = new Mat();
|
|
|
+ adaptiveThreshold(filtered, gray, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 15, 12);
|
|
|
+ MatVector contours = new MatVector();
|
|
|
+ findContours(gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
|
|
|
+ List<Rect> rects = new ArrayList<>();
|
|
|
+ for (int i = 0; i < contours.size(); i++) {
|
|
|
+ Mat contour = contours.get(i);
|
|
|
+ Rect rect = boundingRect(contour);
|
|
|
+ rects.add(rect);
|
|
|
+ contour.release();
|
|
|
+ }
|
|
|
+ rects.sort((o1, o2) -> o2.area() - o1.area());
|
|
|
+ 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()));
|
|
|
+ System.out.println(str);
|
|
|
+ rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
|
|
|
+ if (str != null) {
|
|
|
+ str = str.replaceAll("[ \n]", "");
|
|
|
+ if (Pattern.matches("^第\\d{1,3}$", str)) {
|
|
|
+ rectangle(roi, rect, new Scalar(0, 255, 0, 0), 2, LINE_AA, 0);
|
|
|
+ result = str;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ filtered.release();
|
|
|
+ gray.release();
|
|
|
+ roi.release();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String extractGameTime1(Mat 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 filtered = timeFilter(roi);
|
|
|
+ Mat gray = new Mat();
|
|
|
+ adaptiveThreshold(filtered, gray, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 15, 12);
|
|
|
+ MatVector contours = new MatVector();
|
|
|
+ findContours(gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
|
|
|
+ List<Rect> rects = new ArrayList<>();
|
|
|
+ for (int i = 0; i < contours.size(); i++) {
|
|
|
+ Mat contour = contours.get(i);
|
|
|
+ Rect rect = boundingRect(contour);
|
|
|
+ rects.add(rect);
|
|
|
+ contour.release();
|
|
|
+ }
|
|
|
+ rects.sort((o1, o2) -> o2.area() - o1.area());
|
|
|
+ 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()));
|
|
|
+ System.out.println(str);
|
|
|
+ rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
|
|
|
+ if (str != null) {
|
|
|
+ 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;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ filtered.release();
|
|
|
+ gray.release();
|
|
|
+ roi.release();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
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),
|
|
|
@@ -268,12 +348,59 @@ public class VideoProcessTool {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ imwrite("/Users/drew/Desktop/img/text0.jpg", resultGray);
|
|
|
hsvImage.release();
|
|
|
blurred.release();
|
|
|
hsvIndexer.release();
|
|
|
resultGrayIndexer.release();
|
|
|
}
|
|
|
|
|
|
+ public Mat rankFilter(Mat src) {
|
|
|
+ Mat result = new Mat(src.rows(), src.cols(), CV_8UC1, new Scalar(0));
|
|
|
+ UByteRawIndexer srcIndexer = src.createIndexer();
|
|
|
+ UByteRawIndexer resultIndexer = result.createIndexer();
|
|
|
+ for (int i = 0; i < src.rows(); i++) {
|
|
|
+ for (int j = 0; j < src.cols(); j++) {
|
|
|
+ int db = Math.abs(srcIndexer.get(i, j, 0) - 12);
|
|
|
+ int dg = Math.abs(srcIndexer.get(i, j, 1) - 243);
|
|
|
+ int dr = Math.abs(srcIndexer.get(i, j, 2) - 252);
|
|
|
+
|
|
|
+ int gray = 255 - (db + dg + dr);
|
|
|
+ if (gray < 0) gray = 0;
|
|
|
+ if (gray > 255) gray = 255;
|
|
|
+ gray *= 1.2;
|
|
|
+ if (gray > 255) gray = 255;
|
|
|
+ resultIndexer.put(i, j, gray);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ srcIndexer.release();
|
|
|
+ resultIndexer.release();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Mat timeFilter(Mat src) {
|
|
|
+ Mat result = new Mat(src.rows(), src.cols(), CV_8UC1, new Scalar(0));
|
|
|
+ UByteRawIndexer srcIndexer = src.createIndexer();
|
|
|
+ UByteRawIndexer resultIndexer = result.createIndexer();
|
|
|
+ for (int i = 0; i < src.rows(); i++) {
|
|
|
+ for (int j = 0; j < src.cols(); j++) {
|
|
|
+ int db = Math.abs(srcIndexer.get(i, j, 0) - 36);
|
|
|
+ int dg = Math.abs(srcIndexer.get(i, j, 1) - 183);
|
|
|
+ int dr = Math.abs(srcIndexer.get(i, j, 2) - 230);
|
|
|
+
|
|
|
+ int gray = 255 - (db + dg + dr);
|
|
|
+ if (gray < 0) gray = 0;
|
|
|
+ if (gray > 255) gray = 255;
|
|
|
+ gray *= 1.2;
|
|
|
+ if (gray > 255) gray = 255;
|
|
|
+ resultIndexer.put(i, j, gray);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ srcIndexer.release();
|
|
|
+ resultIndexer.release();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
private String doOCR(Mat img) {
|
|
|
imwrite("/tmp/text.jpg", img);
|
|
|
final tesseract.TessBaseAPI baseApi = new tesseract.TessBaseAPI();
|