使用橡皮擦涂抹功能实现减少模板匹配特征

本篇文章非原创,而是转载:

区域特征太多不想要怎么办?模板匹配特征太多速度慢怎么办?试试橡皮擦功能!_提高halcon模板速度-CSDN博客

但是文末附上了链接,那个是本人使用的Qt开发的涂抹工具。

功能:

1、按住鼠标左键拖动鼠标进行擦除工作,松开鼠标停止擦除

2、继续按住鼠标左键重复功能1,鼠标右键退出

这里使用到的halcon是17.12版本的对应同版本的HDevelop,在API中就找到两个鼠标事件:

get_mbutton 和 get_mposition

前者等待鼠标按下,后者无需等待直接监听鼠标并且都是一次触发一次返回,这样一来实现上面的功能就要挠一挠脑壳了。

halcon实现:

read_image (Image, 'printer_chip/printer_chip_01')
*选择区域
draw_rectangle1 (200000, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
reduce_domain (Image, Rectangle, ImageReduced)
dev_clear_window ()
dev_display (ImageReduced)
**橡皮擦功能,特征屏蔽***********************************
*橡皮擦大小
EraserSize:=10
*橡皮擦形状
EraserType:='rectangle'
gen_empty_obj(region_removeds)
*橡皮擦路过的坐标集
Rows := []
Cols := []
*擦除工作
Button:=0
set_display_font (200000, 26, 'mono', 'true', 'false')
disp_message (200000, '按下鼠标进行擦除功能,松开鼠标将结束', 'window', 12, 12, 'red', 'false')
while (Button == 0)
    get_mbutton (200000, Row, Column, Button)
    while (Button == 1)
        get_mposition (200000, Row, Column, Button)
        Rows := [Rows,Row]
        Cols := [Cols,Column]
        *生成橡皮擦擦过的区域
        if(EraserType=='rectangle')
            gen_rectangle2 (Eraser,Row, Column,0, EraserSize,EraserSize)
        else
            gen_circle (Eraser, Row, Column, EraserSize)
        endif
        *橡皮擦区域合并
        union2(region_removeds,Eraser,region_removeds)
    endwhile
endwhile
*区域相减
difference (ImageReduced, region_removeds, RegionDifference)
reduce_domain (ImageReduced, RegionDifference, ImageReduced)
 
**创建模板******************************************************
create_shape_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
find_shape_model (Image, ModelID, rad(-180), rad(180), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
*获取模板轮廓
get_shape_model_contours (ModelContours, ModelID, 1)
dev_clear_window ()
dev_display (Image)
dev_set_line_width (2)
*将模板映射到目标上
vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D)

结果反馈(以图中二维码区域为例):

没有擦除过的模板特征反馈:

橡皮擦功能:

使用了橡皮擦功能的反馈:

---

推荐阅读

我的Qt作品(5)使用Qt+Halcon实现模板匹配;支持ROI框选/橡皮擦功能

我的Qt作品(5)使用Qt+Halcon实现模板匹配;支持ROI框选/橡皮擦涂抹功能_qt 可以调用halcon 轮廓擦除-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,pdf.js是一个用于在Web上展示PDF文档的JavaScript库。它提供了许多功能,包括搜索、缩放、注释和下载等。但是,pdf.js本身并没有提供橡皮擦功能,因此需要自己编写代码来实现。 下面是一个简单的实现橡皮擦功能的示例代码: ```javascript // 获取canvas元素 var canvas = document.getElementById('pdf-canvas'); // 获取渲染上下文 var context = canvas.getContext('2d'); // 设置橡皮擦大小 var eraserSize = 10; // 设置橡皮擦颜色 var eraserColor = '#ffffff'; // 设置橡皮擦模式 var eraserMode = false; // 监听鼠标按下事件 canvas.addEventListener('mousedown', function(e) { // 如果处于橡皮擦模式 if (eraserMode) { // 获取鼠标位置 var x = e.pageX - canvas.offsetLeft; var y = e.pageY - canvas.offsetTop; // 开始擦除 context.beginPath(); context.arc(x, y, eraserSize, 0, Math.PI * 2); context.fillStyle = eraserColor; context.fill(); } }); // 监听鼠标移动事件 canvas.addEventListener('mousemove', function(e) { // 如果处于橡皮擦模式 if (eraserMode) { // 获取鼠标位置 var x = e.pageX - canvas.offsetLeft; var y = e.pageY - canvas.offsetTop; // 擦除 context.beginPath(); context.arc(x, y, eraserSize, 0, Math.PI * 2); context.fillStyle = eraserColor; context.fill(); } }); // 监听鼠标松开事件 canvas.addEventListener('mouseup', function(e) { // 如果处于橡皮擦模式 if (eraserMode) { // 停止擦除 context.closePath(); } }); // 切换橡皮擦模式 function toggleEraserMode() { eraserMode = !eraserMode; } ``` 这段代码监听了canvas元素的鼠标事件,并根据鼠标位置在canvas上绘制圆形来实现橡皮擦功能。可以通过调整eraserSize和eraserColor来改变橡皮擦的大小和颜色。toggleEraserMode函数用于切换橡皮擦模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值