我需要一种在屏幕上找到图像的方法。我一直在寻找这样做的方法,但有些方法需要很长时间。我需要它是快速和有效的,不需要准确。基本上,我计划在屏幕上比较或搜索一个小的像素化图像,例如11x10像素。
我还需要一种方法来知道屏幕上小图像的x和y坐标。
虽然我已经看过很多工具,比如JavaCV和OpenCV,但我只是想看看是否有其他方法可以做到这一点。
TL;DR
我需要一种快速的方法来搜索一个小的(11x10示例)。屏幕上的图像,知道它的x,y坐标。
发布于 2015-06-02 13:39:51
我想你可能会发现this answer是相关的!但这是针对Windows的&在c++中。但我相信你可以很容易地将它转换成任何语言。
发布于 2017-01-07 01:44:32
这个问题很老了,但我想在这里回答完全相同的问题。我发现将这些答案组合在一起会起到作用:
Convert BufferedImage TYPE_INT_RGB to OpenCV Mat Object
OpenCV Template Matching example in Android
你需要进行转换的原因是因为当你用awt.Robot抓取屏幕截图时,它的类是INT_RGB格式的。匹配模板示例需要字节,您不能直接从这种类型的图像中获取字节数据。
这是我对这两个答案的实现,但它是不完整的。输出都搞砸了,我认为这可能与IntBuffer/ByteBuffer有关。
-编辑-
我添加了一个将INT_RGB转换为BYTE_BGR的新帮助器方法。我现在可以使用matchLoc.This在图像上获取模板的坐标似乎工作得很好,我能够将其与机器人一起使用,它根据模板为我单击开始菜单。
private BufferedImage FindTemplate() {
System.out.println("\nRunning Template Matching");
int match_method = Imgproc.TM_SQDIFF;
BufferedImage screenShot = null;
try {
Robot rob = new Robot();
screenShot = rob.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
} catch (AWTException ex) {
Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
}
if(screenShot == null) return;
Mat img = BufferedImageToMat(convertIntRGBTo3ByteBGR(screenShot));
String templateFile = "C:\\Temp\\template1.JPG";
Mat templ = Highgui.imread(templateFile);
// / Create the result matrix
int result_cols = img.cols() - templ.cols() + 1;
int result_rows = img.rows() - templ.rows() + 1;
Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
// / Do the Matching and Normalize
Imgproc.matchTemplate(img, templ, result, match_method);
Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());
Highgui.imwrite("out2.png", result);
// / Localizing the best match with minMaxLoc
MinMaxLocResult mmr = Core.minMaxLoc(result);
Point matchLoc;
if (match_method == Imgproc.TM_SQDIFF
|| match_method == Imgproc.TM_SQDIFF_NORMED) {
matchLoc = mmr.minLoc;
} else {
matchLoc = mmr.maxLoc;
}
Graphics2D graphics = screenShot.createGraphics();
graphics.setColor(Color.red);
graphics.setStroke(new BasicStroke(3));
graphics.drawRect(matchLoc.x, matchLoc.y, templ.width(), templ.height());
graphics.dispose();
return screenShot;
}
private Mat BufferedImageToMat(BufferedImage img){
int[] data = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 4);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
intBuffer.put(data);
Mat mat = new Mat(img.getHeight(), img.getWidth(), CvType.CV_8UC3);
mat.put(0, 0, byteBuffer.array());
return mat;
}`
private BufferedImage convertIntRGBTo3ByteBGR(BufferedImage img){
BufferedImage convertedImage = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
Graphics2D graphics = convertedImage.createGraphics();
graphics.drawImage(img, 0, 0, null);
graphics.dispose();
return convertedImage;
}
结果:
模板:
https://stackoverflow.com/questions/30578996
复制相似问题