news 2026/4/16 4:07:11

跨平台自研基于形状的模板匹配:从OpenCV到Halcon的探索

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跨平台自研基于形状的模板匹配:从OpenCV到Halcon的探索

自研模板匹配,Windows,Linux,ARM都可用,C++,跨平台,基于形状的模板匹配,openCV实现,halcon替代

在计算机视觉领域,模板匹配是一项基础且重要的技术。今天咱们聊聊如何实现一款能在Windows、Linux以及ARM平台都能使用的基于形状的模板匹配,并且用C++结合OpenCV来完成,同时探讨下Halcon替代方案。

跨平台的重要性

随着不同硬件平台和操作系统的广泛应用,开发跨平台的应用变得越来越必要。无论是在Windows的桌面端,还是Linux的服务器环境,亦或是ARM架构的嵌入式设备,我们都希望算法能够无缝运行。C++作为一门强大的编程语言,具备良好的跨平台特性,这为我们实现跨平台的模板匹配奠定了基础。

OpenCV实现基于形状的模板匹配

OpenCV是计算机视觉领域非常流行的库,提供了丰富的功能来处理图像。以下是一个简单的基于形状的模板匹配代码示例(以C++为例):

#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { // 读取模板图像和目标图像 Mat templateImage = imread("template.jpg", IMREAD_GRAYSCALE); Mat targetImage = imread("target.jpg", IMREAD_GRAYSCALE); if (templateImage.empty() || targetImage.empty()) { cout << "Could not open or find the images" << endl; return -1; } Mat result; int matchMethod = TM_CCOEFF_NORMED; // 进行模板匹配 matchTemplate(targetImage, templateImage, result, matchMethod); normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat()); double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc; minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat()); // 根据匹配方法选择最佳匹配位置 if (matchMethod == TM_SQDIFF || matchMethod == TM_SQDIFF_NORMED) { matchLoc = minLoc; } else { matchLoc = maxLoc; } // 在目标图像上绘制矩形标记匹配位置 rectangle(targetImage, matchLoc, Point(matchLoc.x + templateImage.cols, matchLoc.y + templateImage.rows), Scalar::all(0), 2, 8, 0); imshow("Match Result", targetImage); waitKey(0); return 0; }

代码分析:

  1. 首先,我们通过imread函数读取模板图像和目标图像,并转换为灰度图,因为模板匹配在灰度图上通常效果更好,且计算量相对较小。
  2. 接着,选择一种匹配方法,这里使用TMCCOEFFNORMED,它是归一化的相关性匹配方法,取值范围在0到1之间,1表示完全匹配。
  3. 调用matchTemplate函数进行模板匹配,结果存储在result矩阵中。
  4. 对匹配结果进行归一化处理,以便更好地观察和分析。
  5. 使用minMaxLoc函数找到匹配结果中的最小值、最大值以及它们的位置。
  6. 根据所选的匹配方法,确定最佳匹配位置,并在目标图像上绘制矩形标记出来。

Halcon替代方案

虽然OpenCV功能强大,但Halcon在工业视觉领域有着独特的优势。Halcon提供了更高级、更鲁棒的模板匹配算法。以下是一个简单的Halcon基于形状的模板匹配示例代码(Halcon使用自己的编程语言HDevelop,这里给出大概思路):

* 读取模板图像和目标图像 read_image(TemplateImage, 'template.jpg') read_image(TargetImage, 'target.jpg') * 转换为灰度图 rgb1_to_gray(TemplateImage, GrayTemplate) rgb1_to_gray(TargetImage, GrayTarget) * 创建形状模型 create_shape_model(GrayTemplate, 1, 0, 6.28318, 'auto', 'none', 'use_polarity', 'auto', 'auto', ModelID) * 在目标图像中查找形状模型 find_shape_model(GrayTarget, ModelID, 0, 6.28318, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score) * 可视化结果 dev_display(TargetImage) dev_set_color('red') dev_display_shape_matching_results(ModelID, Score, Row, Column, Angle)

Halcon代码分析:

  1. 同样先读取图像,并转换为灰度图。
  2. 使用createshapemodel函数创建形状模型,该函数可以设置多种参数来优化模型,比如角度范围、模型类型等。
  3. 通过findshapemodel函数在目标图像中查找之前创建的形状模型,返回匹配的位置、角度和得分等信息。
  4. 最后使用Halcon的可视化函数将匹配结果展示出来,用红色标记出匹配的位置。

Halcon相比OpenCV,在工业场景下对复杂形状的匹配可能更加准确和鲁棒,不过Halcon是商业软件,使用需要购买许可证,而OpenCV是开源的,更适合一些预算有限或者对成本敏感的项目。

自研模板匹配,Windows,Linux,ARM都可用,C++,跨平台,基于形状的模板匹配,openCV实现,halcon替代

通过以上的介绍,希望能帮助大家在跨平台的基于形状的模板匹配开发中有更多的思路和选择,无论是使用OpenCV还是考虑Halcon替代方案,都能根据实际需求打造出优秀的计算机视觉应用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 16:29:57

Linux文件目录权限

一 权限基本表示1. 权限位结构-rwxrwxrwx ↑ ↑↑↑ ↑↑↑ ↑↑↑ │ │││ │││ │││ │ │││ │││ │└─ 其他用户(others)执行权限 │ │││ │││ └── 其他用户写权限 │ │││ ││└─── 其他用户读权限 │ │││ ││ │ │││ │└── 所属组(gr…

作者头像 李华
网站建设 2026/4/16 11:08:27

CSDN大模型学习指南:小白程序员必备的8大原则,助你轻松掌握AI产品开发精髓!(收藏版)

本文介绍了AI产品经理的八大核心原则&#xff0c;涵盖STP市场细分、目标市场定位、精益产品开发、任务导向指标、构建持续上下文壁垒、量化评测体系、AI错误处理机制以及Token成本控制等关键要素。旨在帮助小白和程序员快速了解AI产品开发流程&#xff0c;掌握AI产品市场匹配、…

作者头像 李华
网站建设 2026/4/16 11:06:01

多号发圈终于不用来回切换了,3步搞定!

手里管着3个、5个甚至十几个微信号&#xff0c;每天要同步发产品资讯、活动预告、客户案例&#xff0c;光是来回切换账号、重复复制粘贴内容&#xff0c;就要花掉1-2个小时&#xff1b;节假日赶流量高峰&#xff0c;提前编辑好几十条文案&#xff0c;熬夜守到零点手动发送&…

作者头像 李华
网站建设 2026/4/16 11:09:35

[无线通信基础-36]:通信系统中的噪声种类与表达方式,通俗易懂

下面用通俗易懂、生活化的方式&#xff0c;带你了解通信系统中的噪声种类和它们的表达方式&#xff0c;即使没有专业背景也能轻松理解&#xff01;&#x1f31f; 一句话开场&#xff1a;噪声 通信中的“杂音”或“干扰”&#xff0c;就像你打电话时听到的“沙沙声”&#xff0…

作者头像 李华