fix: try to fix memory leak of images
This commit is contained in:
@@ -73,16 +73,23 @@ public class ColorFinder {
|
|||||||
Scalar upperBound = new Scalar(Color.red(color) + threshold, Color.green(color) + threshold,
|
Scalar upperBound = new Scalar(Color.red(color) + threshold, Color.green(color) + threshold,
|
||||||
Color.blue(color) + threshold, 255);
|
Color.blue(color) + threshold, 255);
|
||||||
if (rect != null) {
|
if (rect != null) {
|
||||||
Core.inRange(new Mat(image.getMat(), rect), lowerBound, upperBound, bi);
|
Mat m = new Mat(image.getMat(), rect);
|
||||||
|
Core.inRange(m, lowerBound, upperBound, bi);
|
||||||
|
m.release();
|
||||||
} else {
|
} else {
|
||||||
Core.inRange(image.getMat(), lowerBound, upperBound, bi);
|
Core.inRange(image.getMat(), lowerBound, upperBound, bi);
|
||||||
}
|
}
|
||||||
Mat nonZeroPos = new Mat();
|
Mat nonZeroPos = new Mat();
|
||||||
Core.findNonZero(bi, nonZeroPos);
|
Core.findNonZero(bi, nonZeroPos);
|
||||||
|
MatOfPoint result;
|
||||||
if (nonZeroPos.rows() == 0 || nonZeroPos.cols() == 0) {
|
if (nonZeroPos.rows() == 0 || nonZeroPos.cols() == 0) {
|
||||||
return null;
|
result = null;
|
||||||
|
} else {
|
||||||
|
result = new MatOfPoint(nonZeroPos);
|
||||||
}
|
}
|
||||||
return new MatOfPoint(nonZeroPos);
|
bi.release();
|
||||||
|
nonZeroPos.release();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Point findMultiColors(ImageWrapper image, int firstColor, int threshold, Rect rect, int[] points) {
|
public Point findMultiColors(ImageWrapper image, int firstColor, int threshold, Rect rect, int[] points) {
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ public class TemplateMatching {
|
|||||||
}
|
}
|
||||||
//保存每一轮匹配到模板图片在原图片的位置
|
//保存每一轮匹配到模板图片在原图片的位置
|
||||||
Point p = null;
|
Point p = null;
|
||||||
Mat matchResult;
|
Mat matchResult = null;
|
||||||
double similarity = 0;
|
double similarity = 0;
|
||||||
boolean isFirstMatching = true;
|
boolean isFirstMatching = true;
|
||||||
for (int level = maxLevel; level >= 0; level--) {
|
for (int level = maxLevel; level >= 0; level--) {
|
||||||
@@ -65,6 +65,8 @@ public class TemplateMatching {
|
|||||||
if (!isFirstMatching && !shouldContinueMatching(level, maxLevel)) {
|
if (!isFirstMatching && !shouldContinueMatching(level, maxLevel)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (matchResult != null)
|
||||||
|
matchResult.release();
|
||||||
matchResult = matchTemplate(src, currentTemplate, matchMethod);
|
matchResult = matchTemplate(src, currentTemplate, matchMethod);
|
||||||
Pair<Point, Double> bestMatched = getBestMatched(matchResult, matchMethod, weakThreshold);
|
Pair<Point, Double> bestMatched = getBestMatched(matchResult, matchMethod, weakThreshold);
|
||||||
p = bestMatched.first;
|
p = bestMatched.first;
|
||||||
@@ -72,7 +74,11 @@ public class TemplateMatching {
|
|||||||
} else {
|
} else {
|
||||||
//根据上一轮的匹配点,计算本次匹配的区域
|
//根据上一轮的匹配点,计算本次匹配的区域
|
||||||
Rect r = getROI(p, src, currentTemplate);
|
Rect r = getROI(p, src, currentTemplate);
|
||||||
matchResult = matchTemplate(new Mat(src, r), currentTemplate, matchMethod);
|
if (matchResult != null)
|
||||||
|
matchResult.release();
|
||||||
|
Mat m = new Mat(src, r);
|
||||||
|
matchResult = matchTemplate(m, currentTemplate, matchMethod);
|
||||||
|
m.release();
|
||||||
Pair<Point, Double> bestMatched = getBestMatched(matchResult, matchMethod, weakThreshold);
|
Pair<Point, Double> bestMatched = getBestMatched(matchResult, matchMethod, weakThreshold);
|
||||||
//不满足弱阈值,返回null
|
//不满足弱阈值,返回null
|
||||||
if (bestMatched.second < weakThreshold) {
|
if (bestMatched.second < weakThreshold) {
|
||||||
@@ -84,6 +90,8 @@ public class TemplateMatching {
|
|||||||
p.x += r.x;
|
p.x += r.x;
|
||||||
p.y += r.y;
|
p.y += r.y;
|
||||||
}
|
}
|
||||||
|
src.release();
|
||||||
|
currentTemplate.release();
|
||||||
//满足强阈值,返回当前结果
|
//满足强阈值,返回当前结果
|
||||||
if (similarity >= strictThreshold) {
|
if (similarity >= strictThreshold) {
|
||||||
pyrUp(p, level);
|
pyrUp(p, level);
|
||||||
@@ -160,18 +168,6 @@ public class TemplateMatching {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static List<Mat> buildPyramid(Mat mat, int maxLevel) {
|
|
||||||
List<Mat> pyramid = new ArrayList<>();
|
|
||||||
pyramid.add(mat);
|
|
||||||
for (int i = 0; i < maxLevel; i++) {
|
|
||||||
Mat m = new Mat((mat.rows() + 1) / 2, (mat.cols() + 1) / 2, mat.type());
|
|
||||||
Imgproc.pyrDown(mat, m);
|
|
||||||
pyramid.add(m);
|
|
||||||
mat = m;
|
|
||||||
}
|
|
||||||
return pyramid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Mat matchTemplate(Mat img, Mat temp, int match_method) {
|
public static Mat matchTemplate(Mat img, Mat temp, int match_method) {
|
||||||
int result_cols = img.cols() - temp.cols() + 1;
|
int result_cols = img.cols() - temp.cols() + 1;
|
||||||
int result_rows = img.rows() - temp.rows() + 1;
|
int result_rows = img.rows() - temp.rows() + 1;
|
||||||
|
|||||||
@@ -261,13 +261,11 @@ public class Images {
|
|||||||
point.x = mScreenMetrics.scaleX((int) point.x);
|
point.x = mScreenMetrics.scaleX((int) point.x);
|
||||||
point.y = mScreenMetrics.scaleX((int) point.y);
|
point.y = mScreenMetrics.scaleX((int) point.y);
|
||||||
}
|
}
|
||||||
|
if (src != image.getMat()) {
|
||||||
|
src.release();
|
||||||
|
}
|
||||||
return point;
|
return point;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void notityImageInserted(String path) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user