OpenCV CUDA模块图像处理------创建一个模板匹配(Template Matching)对象函数createTemplateMatching()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

创建一个用于在 GPU 上执行模板匹配的 TemplateMatching 对象。

该函数返回一个指向 TemplateMatching 的智能指针(Ptr),可以使用它调用 .match() 方法对图像和模板进行匹配。

函数原型

cpp 复制代码
Ptr<TemplateMatching> cv::cuda::createTemplateMatching
(
 	int  	srcType,
	int  	method,
	Size  	user_block_size = Size() 
) 		

参数

  • srcType 输入图像的数据类型。目前支持 CV_32F 和 CV_8U 深度的图像(通道数为 1 到 4)。
  • method 指定将模板与图像进行比较的方式(即匹配方法)。
  • user_block_size 你可以通过 user_block_size 字段来设置特定的块大小。如果你使用默认值 Size(0, 0),则会自动估算块大小(该方式以速度优化为目标)。通过调整 user_block_size,你可以在牺牲速度的前提下减少内存占用。

当前对 CV_8U 深度图像支持的匹配方法包括:

  • CV_TM_SQDIFF
  • CV_TM_SQDIFF_NORMED
  • CV_TM_CCORR
  • CV_TM_CCORR_NORMED
  • CV_TM_CCOEFF
  • CV_TM_CCOEFF_NORMED

当前对 CV_32F 深度图像支持的匹配方法包括:

  • CV_TM_SQDIFF
  • CV_TM_CCORR

代码示例

cpp 复制代码
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/opencv.hpp>

int main()
{
    // Step 1: 读取图像和模板
    cv::Mat h_src      = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/stich1.png", cv::IMREAD_GRAYSCALE );
    cv::Mat h_template = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/template.jpg", cv::IMREAD_GRAYSCALE );

    if ( h_src.empty() || h_template.empty() )
    {
        std::cerr << "Failed to load image or template!" << std::endl;
        return -1;
    }

    // Step 2: 图像上传到 GPU
    cv::cuda::GpuMat d_src, d_template, d_result;

    d_src.upload( h_src );
    d_template.upload( h_template );

    // Step 3: 创建模板匹配器
    int srcType = h_src.type();          // CV_8UC1
    int method  = cv::TM_CCOEFF_NORMED;  // 匹配方法
    cv::Size block_size;                 // 使用默认 block size

    cv::Ptr< cv::cuda::TemplateMatching > matcher = cv::cuda::createTemplateMatching( srcType, method, block_size );

    // Step 4: 执行模板匹配
    matcher->match( d_src, d_template, d_result );

    // Step 5: 下载结果并显示
    cv::Mat h_result;
    d_result.download( h_result );

    cv::imshow( "Source Image", h_src );
    cv::imshow( "Template", h_template );
    cv::imshow( "Match Result", h_result );
    cv::waitKey( 0 );

    return 0;
}

运行结果

正确运行后,h_result 是一个灰度图像,其中:

  • 每个像素值表示模板与该位置的匹配程度;
  • 越亮的区域(接近 255 或 1.0)表示匹配越好;
  • 越暗的区域(接近 0)表示匹配较差;
相关推荐
zzzzzz3101 分钟前
当老板说「数据库里加个字段就行了」时,我在想什么——一个后端开发的奇葩需求大赏
数据库·人工智能·产品经理
Figo_Cheung4 分钟前
以“道”为鉴:当代人如何践行健康的“养”与“拼”之辨——以道德经智慧解构现代人精神疲惫症候群
人工智能
kkai人工智能1 小时前
聚合90家免费API、独创Token压缩、免20美元月费:免费Claude Code
人工智能
fanstuck6 小时前
1M 上下文能怎么用?我用 Seed Evolving 做了一个招标文件版本差异审查器
服务器·人工智能·数据分析·开源·aigc
墨舟的AI笔记8 小时前
React 组件库的 Tree Shaking:按需加载与副作用的工程化治理
人工智能
WoooChi9 小时前
DailyTech-20260724
人工智能·科技·业界资讯
zh路西法9 小时前
【CAM Grad-CAM Grad-CAM++】深度学习模型可解释性:从原理到YOLOv8部署实战
人工智能·深度学习·yolo·yolov8·grad-cam·cam
雨辰AI9 小时前
全集实战:企业级大模型服务化部署全栈指南|FastAPI 封装 + Nginx 负载均衡 + 高可用架构 从单机到生产一步到位
人工智能·ai·负载均衡·fastapi·ai编程
触底反弹9 小时前
Vibe Coding 不写 Git,等于悬崖边飙车
人工智能·git·面试
咖啡屋和酒吧10 小时前
健康管理:现代生活的科学守护
人工智能·生活·精选