当前位置: 首页 > article >正文

opencv实现边缘模板匹配

在这里插入图片描述

在OpenCV中使用C++进行模板匹配时,如果你想利用边缘特征来提高匹配的鲁棒性,可以结合边缘检测算法(如Canny)来提取图像和模板的边缘信息,然后在这些边缘图像上进行模板匹配

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // 加载图像和模板
    Mat img = imread("image.jpg", IMREAD_GRAYSCALE);
    Mat templ = imread("template.jpg", IMREAD_GRAYSCALE);

    if (img.empty() || templ.empty()) {
        cout << "Could not open or find the image or template!" << endl;
        return -1;
    }

    // 使用Canny边缘检测提取图像和模板的边缘
    Mat edges_img, edges_templ;
    Canny(img, edges_img, 50, 150);
    Canny(templ, edges_templ, 50, 150);

    // 创建结果矩阵
    Mat result;
    int result_cols = img.cols - templ.cols + 1;
    int result_rows = img.rows - templ.rows + 1;
    result.create(result_rows, result_cols, CV_32FC1);

    // 进行模板匹配
    matchTemplate(edges_img, edges_templ, result, TM_CCOEFF_NORMED);

    // 找到最佳匹配位置
    double minVal, maxVal;
    Point minLoc, maxLoc;
    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);

    // 在原始图像上绘制矩形框标记匹配区域
    Mat img_display;
    cvtColor(img, img_display, COLOR_GRAY2BGR);
    rectangle(img_display, maxLoc, Point(maxLoc.x + templ.cols, maxLoc.y + templ.rows), Scalar(0, 255, 0), 2);

    // 显示结果
    imshow("Source Image", img_display);
    imshow("Template", templ);
    imshow("Edges Image", edges_img);
    imshow("Edges Template", edges_templ);
    imshow("Result", result);

    waitKey(0);
    return 0;
}

测试效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/530867.html

相关文章:

  • 问deepseek,如何看待ai降低学习成本而导致软件开发岗位需求降低,和工资下降。 软件从业人员何去何从?
  • 线性数据结构:单向链表
  • 海外问卷调查渠道查,如何影响企业的运营
  • LeetCode:121.买卖股票的最佳时机1
  • C# 类与对象详解
  • python小知识-jupyter lab
  • 实验力学的记录
  • 蓝桥杯真题——小秘密(省模拟赛)
  • UE 不同类型蓝图类的区别(关卡蓝图 Component蓝图 Actor蓝图)
  • oracle:索引(B树索引,位图索引,分区索引,主键索引,唯一索引,联合索引/组合索引,函数索引)
  • 【Rust自学】19.5. 高级类型
  • 人工智能导论-第3章-知识点与学习笔记
  • 求职刷题力扣DAY34--贪心算法part05
  • 深入剖析 Bitmap 数据结构:原理、应用与优化策略
  • UE PlayerController、AIController
  • UE5 蓝图学习计划 - Day 9:数组与跨蓝图通信
  • 服务SDK三方新版中央仓库和私服发布详解
  • Java 网络原理 ③-NAT || DHCP
  • 在K8S中,如何把某个worker节点设置为不可调度?
  • C语言可变参数
  • leetcode解题思路分析(一百六十三)1409 - 1415 题
  • 【1】快手面试题整理
  • C基础寒假练习(2)
  • AI模型升级版0.04
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.10 ndarray内存模型:从指针到缓存优化
  • DeepSeek横空出世,AI格局或将改写?