【问题标题】:Match Image on Screen with Template Pictures将屏幕上的图像与模板图片匹配
【发布时间】:2014-02-14 08:26:01
【问题描述】:

我正在寻找一个程序,一旦运行,将不断寻找模板图像(存储在程序目录中)以与屏幕实时匹配。一旦找到,它将单击图像(即最佳匹配坐标的中心)。图像将是精确的副本(大小/颜色),因此找到匹配项应该不会很困难。

然后这个过程会继续处理许多其他图像,然后重新设置以再次使用第一张图像重新开始,但是一旦我的第一部分开始工作,我就可以复制代码。

我已经下载了 OpenCV 库,因为它有图像匹配工具,但我迷路了。非常感谢您在编写一些存根代码或将我指向有用的资源方面的任何帮助。我检查了很多 OpenCV 文档,但都没有运气。

谢谢。

【问题讨论】:

    标签: c++ opencv image-processing pattern-matching


    【解决方案1】:

    如果您认为模板图像在当前帧中不会有太大差异,那么您应该使用 openCV 的matchTemplate()。它非常易于使用,会给您带来良好的效果。

    在这里查看完整的解释http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

    【讨论】:

    • 关于速度的补充:模板匹配的复杂度应该与模板的数量和大小成线性关系,所以如果他使用许多不同的大模板,可能会太慢。如果模板有一些可描述的纹理,他可以尝试特征匹配(例如 SIFT/SURF/ORB),其中图像只处理一次,每个模板与特征进行比较。
    • 是的,我看过那个页面。但是,我无法将屏幕用作源(以便模板图像可以与之匹配)。是否有一种解决方案可以每秒截取屏幕截图并使用该解决方案,还是该库已内置解决方案?
    • 我之前也有过类似的申请。您只需要在视频/网络摄像头的每一帧与模板图像之间进行模板匹配即可。
    • 在来自网络摄像头/视频的每个传入帧和模板图像之间执行模板匹配后,您将获得一个结果图像,您可以根据该图像确定模板是否存在于给定的网络摄像头/视频帧中.
    • 啊,你有什么代码可以分享给我吗?不太清楚如何监控来自屏幕的传入帧。
    【解决方案2】:
    void start()
    {
    
        VideoCapture cap(0);
        Mat image;
        namedWindow(wndname,1);
    
        for(;;)
        {
            Mat frame;          
            cap >> frame; // get a new frame from camera
    
            "Load your template image here"
            "Declare a result image here"
            "Perform the templateMatching() between template image and frame and store the results of correlation in result image declared above"
    
    
    
            char c = cvWaitKey(33);
            if( c == 27 ) break;
    
    
       }
    
    }
    

    【讨论】:

    • 感谢代码,但我希望使用屏幕(即桌面框架)而不是视频或相机。
    • 编辑:我已经设法在一个窗口中显示桌面,使用这个:privatepaste.com/fb2beac94f 但是框架和模板之间存在类型不匹配,因此 matchTemplate() 断言失败。知道如何解决这个问题吗?我从:stackoverflow.com/questions/14148758/… 获得了 hwnd2mat 函数,非常感谢!
    • 这可能是因为您没有正确声明生成图像(将存储 MatchTemplate () 结果的矩阵)的大小。看看/// Create the result matrixint result_cols = img.cols - templ.cols + 1;int result_rows = img.rows - templ.rows + 1;result.create( result_cols, result_rows, CV_32FC1 );
    • 我确实尝试过使用那个确切的声明,但没有成功。我会尝试更多地摆弄它,如果我能做到这一点,那么我很可能会完成!
    猜你喜欢
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多