|
@@ -50,7 +50,7 @@ public class VideoProcessToolNew {
|
|
|
if (frameSkip > 0 && frameCount % frameSkip != 0) {
|
|
if (frameSkip > 0 && frameCount % frameSkip != 0) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
- Mat frame = converterToMat.convert(vFrame);
|
|
|
|
|
|
|
+ Mat frame = removeBlackBarAndRotate(converterToMat.convert(vFrame));
|
|
|
if (matchGameOver(svm, frame)) {
|
|
if (matchGameOver(svm, frame)) {
|
|
|
String rank = extractRank(frame);
|
|
String rank = extractRank(frame);
|
|
|
if (StringUtils.isEmpty(rank)) continue;
|
|
if (StringUtils.isEmpty(rank)) continue;
|
|
@@ -75,24 +75,14 @@ public class VideoProcessToolNew {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public boolean matchGameOver(SVM svm, Mat inputImage) {
|
|
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 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 reshaped = resized.reshape(1, 1);
|
|
|
Mat toPredict = new Mat();
|
|
Mat toPredict = new Mat();
|
|
|
reshaped.convertTo(toPredict, CV_32F);
|
|
reshaped.convertTo(toPredict, CV_32F);
|
|
|
float res = svm.predict(toPredict);
|
|
float res = svm.predict(toPredict);
|
|
|
|
|
|
|
|
- rotated.release();
|
|
|
|
|
resized.release();
|
|
resized.release();
|
|
|
- noBlackBar.release();
|
|
|
|
|
reshaped.release();
|
|
reshaped.release();
|
|
|
toPredict.release();
|
|
toPredict.release();
|
|
|
return res == 1;
|
|
return res == 1;
|
|
@@ -103,7 +93,7 @@ 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 = 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 filtered = rankFilter(roi);
|
|
|
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);
|
|
@@ -120,8 +110,9 @@ 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) {
|
|
|
- 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);
|
|
System.out.println(str);
|
|
|
rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
|
|
rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
|
|
|
if (str != null) {
|
|
if (str != null) {
|
|
@@ -141,13 +132,16 @@ public class VideoProcessToolNew {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public String extractGameTime(Mat src) {
|
|
public String extractGameTime(Mat src) {
|
|
|
|
|
+ imwrite("/tmp/time.jpg", 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 = 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);
|
|
Mat filtered = timeFilter(roi);
|
|
|
|
|
+ imwrite("/tmp/time_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("/tmp/time_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<>();
|
|
@@ -161,8 +155,9 @@ 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) {
|
|
|
- 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);
|
|
System.out.println(str);
|
|
|
rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
|
|
rectangle(roi, rect, new Scalar(0, 0, 255, 0), 2, LINE_AA, 0);
|
|
|
if (str != null) {
|
|
if (str != null) {
|
|
@@ -222,26 +217,19 @@ public class VideoProcessToolNew {
|
|
|
return recognizedText;
|
|
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();
|
|
Mat gray = new Mat();
|
|
|
cvtColor(src, gray, COLOR_BGR2GRAY);
|
|
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();
|
|
gray.release();
|
|
|
- thres.release();
|
|
|
|
|
- contours.deallocate();
|
|
|
|
|
rect.deallocate();
|
|
rect.deallocate();
|
|
|
|
|
+ return dst;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public BufferedImage createBufferedImage(Mat mat) {
|
|
public BufferedImage createBufferedImage(Mat mat) {
|