首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >屏幕上的快速模板匹配。也需要坐标。Java

屏幕上的快速模板匹配。也需要坐标。Java
EN

Stack Overflow用户
提问于 2015-06-02 00:53:25
回答 2查看 1.9K关注 0票数 0

我需要一种在屏幕上找到图像的方法。我一直在寻找这样做的方法,但有些方法需要很长时间。我需要它是快速和有效的,不需要准确。基本上,我计划在屏幕上比较或搜索一个小的像素化图像,例如11x10像素。

我还需要一种方法来知道屏幕上小图像的x和y坐标。

虽然我已经看过很多工具,比如JavaCV和OpenCV,但我只是想看看是否有其他方法可以做到这一点。

TL;DR

我需要一种快速的方法来搜索一个小的(11x10示例)。屏幕上的图像,知道它的x,y坐标。

EN

回答 2

Stack Overflow用户

发布于 2015-06-02 13:39:51

我想你可能会发现this answer是相关的!但这是针对Windows的&在c++中。但我相信你可以很容易地将它转换成任何语言。

票数 1
EN

Stack Overflow用户

发布于 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在图像上获取模板的坐标似乎工作得很好,我能够将其与机器人一起使用,它根据模板为我单击开始菜单。

代码语言:javascript
运行
复制
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;
}

结果:

模板:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30578996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档