关于模板缓存的一些试验

OPENGL的许多测试处处彰显着“伟大”的可操作性,最常见的ALPHA测试,裁剪测试,深度测试。。但是他们都各有用途,有一个模板测试,参数比较“复杂”。看了红皮书,也不得其解,红皮书搞那个例子真的不敢多说什么,确实很不具有代表性。网上google了一把,全是不透彻的理解(尤其是那些直接复制别人代码的朋友,我对其坚持误解的毅力表示由衷的赞赏~~)。毕竟这玩意儿是美国的SGI首发,还是老美的资料比较切实、能够深入本质。最后在OGL的官网(http://www.opengl.org/code)上找到了一些比较有用的资料。网址如下:

 

http://psysal.livejournal.com/67933.html

http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html

http://www.opengl.org/sdk/docs/man/xhtml/glStencilFunc.xml

 

有兴趣的朋友自己去看吧,一定让你恍然大悟(如果你也对STENCIL有些模糊的话~)。

 

下面是我的测试总结:

 

首先,说说怎么使用(首先你的硬件(显卡)要支持STENCIL缓存)

1. WIN32像素格式,设置模板位/GLUT初始化显示模式或上GLUT_STENCIL

2. 设置刷新默认值:glClearStencil(0); // 我设为0,这个可以自己根据需要修改

3. 逐帧刷新:glClear或上GL_STENCIL

4. 在适当的地方启用模板缓存测试:glEnable(GL_STENCIL_TEST);

5. 根据需要设置模板值及模板测试结果操作: glStencilFun(func,val,mask); glStencilOp(failed,zfailed,zpass);

 

好了,要做的就这些,但是有些技巧需要了解:

首先,说说模板缓存的意义。为什么要有它,以及它产生的作用。我们知道裁剪测试用来划定显示范围,ALPHA测试通过颜色依赖进行显示过滤(结合混合可以实现更多效果),深度测试则是为了让3D物体根据Z值相互遮掩(故又称“Z-BUFFER”)。那么,当我要指定一个图元或图元集合作为我的过滤器(MASK)时,又该如何实现呢?前面的种种测试显然无法满足需求。于是,STENCIL就产生了。它和深度缓存比较像(可以理解为“某区域的深度缓存”,个人意见,呵呵~~)。OK,一切都明白了。(至于函数的使用及参数意义,可以参考上面的网址链接或红宝书)

其次,有时我们是不需要显示这个MASK的。使用过ADOBE产品的朋友应该对此比较了解(PS及AE里都有类似概念)。所以我们可以使用glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE)完全关闭向颜色缓冲区的写入操作(就是不显示任何颜色信息)。当你把模板MASK画好之后一定要记得还原过来,否则你的场景就全“黑”了。还有一个就是配合glDepthMask来控制对深度缓存的写入操作,来实现更多的效果。

 

开始试验:

 

当你明白了如何使用模板缓存,一切就可以随自己的喜欢去做。这里,我首先把背景模板值全刷为1,再将地面强行写入0,然后让茶壶大于1时通过测试。(当然,其他地方模板缓存是关闭的。并且我先绘制地面,然后绘制茶壶。)。效果如下:

 

 

 

很好,就这么简单~ 一切顺利,进入下一步,适当关闭地面的颜色写入(第一次留下红色分量,第二次全部关闭。)。效果如下:

 

 

 

 

嗯,就是这样。一切都和预期很一致。OK,现在我要把深度缓存的写入也关掉,以至于可以让地面下向上看时也能看到茶壶。这是不是很COOL~就像一道双面的魔法门。OK,效果如下:

 

 

 

 

 

呵呵,虽然达到了预期效果(实现了双面透视)。可这茶壶显得很奇怪,(呵呵,是啊,貌似没有深度检测似地)。那是因为我把深度写入关掉了,所以茶壶自身的深度也显得不正常了。OK,既然找到了问题。FIX IT!在glutSolidTeapot之前打开,之后再关掉。

然后,下面是效果图:(嗯,是这样~一切正常了)

 

 

 

 

OK,试验到此结束。呵呵,这个只是试验,很”朴素“呵。当然你可以用它制作出各种奇形怪状或出乎意料的组合,来实现各种镂空等等特效。~

<think>嗯,用户想用Halcon写一个高级模板匹配,我得先理清楚步骤。首先,Halcon的模板匹配主要有基于形状、基于组件、基于描述符和基于相关性几种方法,用户可能指的是基于形状的,这个比较常用。 我应该先解释模板匹配的基本概念,然后分步骤说明如何创建模板、进行匹配,还有优化技巧。注意用户需要的是“高级”模板匹配,所以得提到参数调整、金字塔层级、亚像素精度这些内容。 用户可能不太清楚不同匹配方法的区别,需要简要比较一下。然后,示例代码部分要具体,但也要提醒他们根据实际图像调整参数。另外,性能优化和鲁棒性处理是关键点,得详细说明,比如如何减少搜索区域,处理遮挡和噪声。 还要考虑用户的实际应用场景,比如工业检测,可能需要处理光照变化或部分遮挡,所以得提到预处理和匹配后的结果处理,比如筛选最佳匹配或计算变换矩阵。 最后,确保回答结构清晰,分步骤讲解,代码部分用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。同时用中文,保持自然,不用Markdown,符合用户的要求。</think>好的,我将为您分步讲解如何使用Halcon实现高级模板匹配。以下是详细的操作流程和技术要点: 1. **模板创建阶段** √ 图像预处理: ```halcon read_image(Image, '模板图像路径') * 转换为灰度(若为彩色) rgb1_to_gray(Image, GrayImage) * 增强对比度 emphasize(GrayImage, ImageEmphasize, 10, 10, 1.5) * 提取ROI区域(手动绘制或自动检测) draw_region(RoiRegion, WindowHandle) reduce_domain(ImageEmphasize, RoiRegion, TemplateImage) ``` √ 创建形状模型(关键参数): ```halcon create_shape_model( TemplateImage, // 输入图像 4, // 金字塔层级(越高速度越快) 0, // 起始角度(rad) rad(360), // 角度范围 'auto', // 角度步长自动 'auto', // 缩放步长自动 'use_polarity', // 对比度极性 'auto', // 对比度自动 'auto', // 最小对比度 ModelID // 输出模型ID ) ``` 2. **匹配优化技巧** √ 设置搜索参数: ```halcon set_shape_model_param(ModelID, 'num_matches', 10) // 最多匹配数 set_shape_model_param(ModelID, 'min_score', 0.7) // 最小匹配分数 set_shape_model_param(ModelID, 'greediness', 0.8) // 搜索贪婪度(0保守/1快速) ``` √ 几何约束设置(可选): ```halcon set_shape_model_param(ModelID, 'angle_extent', rad(30)) // 限制角度范围 set_shape_model_param(ModelID, 'scale_min', 0.9) // 最小缩放因子 set_shape_model_param(ModelID, 'scale_max', 1.1) // 最大缩放因子 ``` 3. **执行匹配** ```halcon find_shape_model( SearchImage, // 待搜索图像 ModelID, // 模型ID 0, // 起始角度 rad(360), // 角度范围 0.7, // 最小匹配分数 10, // 最大匹配数 0.5, // 最大重叠率 'least_squares', // 优化方法 4, // 金字塔层级 0.8, // 贪婪度 Row, Column, // 匹配中心坐标 Angle, // 旋转角度 Score // 匹配得分 ) ``` 4. **高级处理技巧** √ 亚像素精度提升: ```halcon refine_model( SearchImage, ModelID, Row, Column, Angle, 'least_squares_high', 0, 0.5, SubpixRow, SubpixCol, SubpixAngle ) ``` √ 仿射变换处理: ```halcon vector_angle_to_rigid( ModelRow, ModelCol, 0, SubpixRow, SubpixCol, SubpixAngle, HomMat2D ) affine_trans_contour_xld(ModelContours, TransContours, HomMat2D) ``` 5. **性能优化策略** √ 搜索空间缩减: ```halcon gen_rectangle1(SearchROI, 100, 100, 500, 600) reduce_domain(SearchImage, SearchROI, ImageReduced) ``` √ 多线程加速: ```halcon set_system('parallelize_operators', 'true') set_system('tspawn_threshold', 4096) ``` 6. **结果验证与筛选** √ 多条件筛选: ```halcon * 筛选分数>0.8且面积匹配的实例 select_match(Score, AreaRatios, ValidIndices) := (Score[ValidIndices] > 0.8) and (AreaRatios[ValidIndices] between [0.95, 1.05]) ``` √ 可视化增强: ```halcon dev_set_color('green') dev_set_line_width(2) disp_cross(WindowHandle, SubpixRow, SubpixCol, 20, 0) disp_rectangle2(WindowHandle, SubpixRow, SubpixCol, SubpixAngle, 50, 30) ``` **注意事项**: 1. 建议使用$$金字塔层级=4 \sim 6$$平衡速度精度 2. 当处理$$旋转对称物体$$时,需设置`set_system('border_shape_models','true')` 3. 对于$$低对比度物体$$,推荐预处理组合: $$g_{enhanced} = \frac{1}{1 + e^{-k(g - \theta)}}$$ 其中k为对比度增强因子,θ为阈值 **完整示例流程**: ```halcon dev_update_off() read_image(Image, 'part_01.png') get_image_size(Image, Width, Height) dev_open_window(0, 0, Width, Height, 'black', WindowHandle) * 创建模板 draw_rectangle1(WindowHandle, Row1, Column1, Row2, Column2) gen_rectangle1(ROI, Row1, Column1, Row2, Column2) reduce_domain(Image, ROI, TemplateImage) create_shape_model(TemplateImage, 5, 0, rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) * 保存模板(供后续使用) write_shape_model(ModelID, 'my_model.shm') * 实时匹配 while (true) grab_image(ImageAcq) find_shape_model(ImageAcq, ModelID, 0, rad(360), 0.7, 3, 0.5, 'least_squares', 4, 0.7, Row, Column, Angle, Score) if (|Score| > 0) refine_model(ImageAcq, ModelID, Row, Column, Angle, 'least_squares_high', 0, 0.5, SubRow, SubCol, SubAngle) get_shape_model_contours(ModelContours, ModelID, 1) vector_angle_to_rigid(0, 0, 0, SubRow, SubCol, SubAngle, HomMat2D) affine_trans_contour_xld(ModelContours, TransContours, HomMat2D) dev_display(TransContours) endif endwhile ``` **常见问题处理**: 1. **匹配失败**检查清单: - 验证模板图像对比度:$$ \Delta Contrast = max(g) - min(g) > 20 $$ - 确认金字塔层级设置是否合理 - 检查搜索参数是否过于严格(贪婪度建议0.7~0.9) 2. **速度优化**方案: - 采用$$多分辨率搜索$$:先在低金字塔层级粗定位,再局部精搜 - 使用$$ROI层级缓存$$:`set_system('cache_region_data','true')` 3. **特殊场景**处理: - 遮挡物体:设置`set_shape_model_param(ModelID, 'occlusion_handling', 'true')` - 光照变化:启用`'ignore_local_polarity'`模式 建议通过`inspect_shape_model`可视化模板特征分布,验证模型质量。实际应用中需根据具体场景调整参数,建议通过正交试验法优化参数组合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值