OpenCV CUDA模块图像处理------创建一个模板匹配(Template Matching)对象函数createTemplateMatching()
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
创建一个用于在 GPU 上执行模板匹配的 TemplateMatching 对象。
该函数返回一个指向 TemplateMatching 的智能指针(Ptr),可以使用它调用 .match() 方法对图像和模板进行匹配。
函数原型
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
代码示例
#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: 图像上传到 GPUcv::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_8UC1int method = cv::TM_CCOEFF_NORMED; // 匹配方法cv::Size block_size; // 使用默认 block sizecv::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)表示匹配较差;