图像识别基础之模板匹配

这篇具有很好参考价值的文章主要介绍了图像识别基础之模板匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

principle

图像匹配

本质:图像的相似度很高(矩阵的相似度很高)

code

/*
 \brief 我的图像匹配函数,获取差方和均值最小的矩阵作为结果
 \param srcPicFile:用以匹配的图像文件
 \param templatePicFile:模板图像文件
 \param destPicFile:输出的检测结果文件
*/
void MyPictureMatch(const char* srcPicFile, const char* templatePicFile, const char* destPicFile)
{
    if ((!srcPicFile) || (!templatePicFile) || (!destPicFile))
    {
        return;
    }

    cv::Mat srcMat;
    cv::Mat templateMat;
    cv::Mat srcGrayMat;
    cv::Mat templateGrayMat;
    uint32_t templateMatSize = 0;
    cv::Rect mask;
    cv::Mat subSrcGrayMat;
    cv::Mat caculationMat;
    struct recorde {
        int x;
        int y;
        double caculation;
    };
    recorde recorder;
    std::vector<recorde> recordes;

    srcMat = cv::imread(srcPicFile);
    templateMat = cv::imread(templatePicFile);

    if (srcMat.size < templateMat.size) {
        fprintf(stdout, "srcMat.size < templateMat.size\n");
        return;
    }

    templateMatSize = templateMat.cols * templateMat.rows;

    cv::cvtColor(srcMat, srcGrayMat, 
                cv::ColorConversionCodes::COLOR_RGB2GRAY);

    cv::cvtColor(templateMat, templateGrayMat, 
                cv::ColorConversionCodes::COLOR_RGB2GRAY);

    mask.width = templateGrayMat.cols;
    mask.height = templateGrayMat.rows;

    caculationMat.create(cv::Size(templateGrayMat.cols, templateGrayMat.rows), templateGrayMat.type());

    for (int i = 0; (i + mask.height) < srcGrayMat.rows; ++i)
    {
        for (int j = 0; (j + mask.width) < srcGrayMat.cols; ++j)
        {
            mask.x = j;
            mask.y = i;
            recorder.x = mask.x;
            recorder.y = mask.y;
            srcGrayMat(mask).copyTo(subSrcGrayMat);
            cv::subtract(subSrcGrayMat, templateGrayMat, caculationMat);
            cv::multiply(caculationMat, caculationMat, caculationMat);
            cv::Scalar sum = cv::sum(caculationMat);
            recorder.caculation = sum(0);
            recorder.caculation = recorder.caculation / templateMatSize;
            recordes.push_back(recorder);
            // fprintf(stderr, "recorder.caculation:%lf\n", recorder.caculation);
        }
    }

    auto cmp = [](const recorde& p1, const recorde& p2)->bool {
        if (p1.caculation < p2.caculation)
        {
            return true;
        }
        return false;
    };

    std::sort(recordes.begin(), recordes.end(), cmp);

    fprintf(stdout, "recordes[0]:%d,%d,%lf\n", recordes[0].x, recordes[0].y, recordes[0].caculation);

    mask.x = recordes[0].x;
    mask.y = recordes[0].y;

    cv::rectangle(srcMat, mask, cv::Scalar(0, 255, 0));
    
    // imshow需要显示驱动
#if 0
    cv::imshow(destPicFile, srcMat);
    cv::waitKey();
#else
    cv::imwrite(destPicFile, srcMat);
#endif
}

performance

图像识别基础之模板匹配,图像处理,opencv,计算机视觉,c++文章来源地址https://www.toymoban.com/news/detail-830100.html

到了这里,关于图像识别基础之模板匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图像处理】模板匹配的学习笔记

    cv.TM_CCOEFF cv.TM_CCOEFF_NORMED cv.TM_CCORR cv.TM_CCORR_NORMED cv.TM_SQDIFF cv.TM_SQDIFF_NORMED Note: cv2.TM_CCOEFF_NORMED :相较于其它方法,通常被认为具有较好的鲁棒性

    2024年02月10日
    浏览(33)
  • 图像处理 边缘检测 绘制金字塔 模板匹配

    Canny边缘检测器是一种多步算法,用于检测任何输入图像的边缘。 边缘检测步骤: 1.应用 高斯滤波器 ,以平滑图像,滤除噪声( 降噪 ) 2.计算图像中每个像素点的梯度大小(边缘两侧和卷积之间的像素差值和方向(x和y方向)(梯度Scole算子检测边缘) 3.使用非极大值抑制,

    2024年02月06日
    浏览(53)
  • OpenCV(图像处理)-基于Python-特征检测-特征点匹配

    图像特征就是指有意义的图像区域,具有独特性,易于识别性,比如角点、斑点以及高密度区。而为什么角点具有重要的特征呢? 看下图: 观察ABD三张图片,我们不容易得知图像的位置,而CEF三张图我们特别容易找到它们在原图中对应的位置,这是因为ABD比较平滑,我们不

    2024年02月03日
    浏览(55)
  • 图像识别基础之模板匹配

    图像匹配 本质:图像的相似度很高(矩阵的相似度很高)

    2024年02月20日
    浏览(35)
  • python数字图像处理基础(九)——特征匹配

    蛮力匹配(ORB匹配) Brute-Force匹配非常简单,首先在第一幅图像中选取一个关键点然后依次与第二幅图像的每个关键点进行(描述符)距离测试,最后返回距离最近的关键点. 对于BF匹配器,首先我们必须使用**cv2.BFMatcher()**创建 BFMatcher 对象。它需要两个可选的参数: normTyp

    2024年01月19日
    浏览(54)
  • OpenCV图像处理——停车场车位识别

    图像处理总目录←点击这里 唐宇迪老师的——OPENCV项目实战 学习 本项目的目的是设计一个停车场车位识别的系统,能够判断出当前停车场中哪些车位是空的。 任务共包含部分: 对图像预处理 从停车场的监控视频中提取图片 对图片进行一系列的预处理,去噪、识别图像中的

    2024年02月13日
    浏览(47)
  • EmguCV-C#版本Opencv图像识别和处理

    目录 0、简介 1、图像处理 (1)颜色处理 (2)图像差 (3)图像拼接 (4)直方图 (5)颜色空间/通道提取 2、预处理 (1)均衡化 (2)阈值处理 (3)滤波 (4)形态学运算 (5)ROI 3、检测 (1)角点检测 (2)边缘检测 (3)霍夫变换 (4)轮廓 (5)特征点匹配 (6)Blob特

    2024年02月09日
    浏览(47)
  • Python使用Opencv图像处理方法完成手势识别(一)

    由于是使用Opencv完成手势识别,所以首先利用颜色特征是对手的颜色进行提取,获得HSV的最小值与最大值。 HSV颜色空间阈值主要是靠 Trackbar 调节阈值和 cv2.inRange 来生成掩膜来提取。 这是我写的HSV阈值获取的代码: 使用方法: 运行代码之后,从第一个依次调节滑块,使画面中

    2024年02月05日
    浏览(77)
  • OpenCV4.x图像处理实例-搭建身份识别系统

    在本文中,将介绍如何使用 OpenCV 搭建一个人脸检测与身份识别系统。 为了构建我们的人脸识别系统,我们将首先执行人脸检测,使用深度学习从每张人脸中提取人脸特征数据,在提取特征数据上训练人脸识别模型,最后使用 OpenCV 识别图像和视频流中的人脸,并识别身份。

    2024年02月03日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包