设置首页收藏本站
开启左侧

[文档] HDevelop绘制生成仿射矩形不显示或者异常?详解图像缓存机制

  [复制链接]
绝地武士 发表于 2018-6-15 15:58:07 | 显示全部楼层 |阅读模式
1.没有加载任何图片的情况下进行绘制仿射矩形或者矩形:
  1. draw_rectangle2 (WindowHandle, Row1, Column1, Phi, Length1, Length2)
  2. gen_rectangle2 (Rectangle, Row1, Column1, Phi, Length1, Length2)
复制代码
绘制后的图像如下:

QQ截图20180615153803.png
2.右键确认以后,显示仿射矩形就不正确了:
QQ截图20180615153848.png

3.相信很多人都遇到过类似这样的问题吧?
QQ截图20180615154029.png

还有一种情况就是读取一组坐标然后生成ROI,根本生成不了,那么和这个是同理的!
主要是在VC++、C#中根据指定的数据生成ROI,比如gen_rectangle1始终生成的ROI是空的
保存好的区域再次读取出来是空的
QQ截图20180805105930.png

常规情况下解决方法大概有下列四种:
1.reset_obj_db 重置DataBase为指定缓存大小;
2.读取一张比区域还大图像;
3.设置默认缓存大小;
4.设置系统是否裁剪区域为false:
  1. set_system ('clip_region', 'false')
复制代码


下面我们来探索下为什么会出现这种情况:
5.发现我们绘制的仿射矩形的图像变量是这样的,感觉哪儿不对?哪儿不对呢???。。。。
6.对了,很像标准的齐轴矩形,很奇怪怎么会这样呢???
7.现在开始验证自己的想法,有没有可能是窗口原因呢?
8.使用代码获取下这个区域的齐轴矩形大小看看:
  1. smallest_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
  2. gen_rectangle1 (Rectangle1, Row1, Column1, Row2, Column2)
复制代码
8.显示图像如下:
QQ截图20180615154355.png
9.最后这个Rectangle1是margin显示模式。这个显示就有点意思了,感觉窗口大小就这么大了,莫非窗口有效区域就这么大?

10.获取下窗口的默认缓存区域大小看看
  1. get_system ('tsp_width', width)
  2. get_system ('tsp_height', height)
复制代码
结果不可思议,真的窗口的缓存区域就是这么大,也就是512*512是默认的缓存区域大小了。
QQ截图20180615154636.png


11.那就试试512*512大小的画仿射矩形会不会出现被截断的情况:
  1. *关闭当前图形窗口
  2. dev_close_window ( )
  3. *打开一个指定大小的窗口 512*512
  4. dev_open_window_fit_size (0, 0, 512, 512, -1, -1, WindowHandle)
  5. *获取下窗口相关的属性,确认下宽度和高度是512,这样窗口大小和缓存大小一致了
  6. get_window_extents (WindowHandle, Row, Column, Width, Height)

  7. *再次绘制检测框
  8. draw_rectangle2 (WindowHandle, Row1, Column1, Phi, Length1, Length2)
  9. gen_rectangle2 (Rectangle, Row1, Column1, Phi, Length1, Length2)
复制代码

12.奇迹出现了,真的是这样的,仿射矩形显示正常了!
QQ截图20180615155043.png

13.那如果是这样的话,默认缓存是512*512,我修改大小后可以画吗?试试看,先关掉HDevelop,重新打开恢复默认环境,输入代码:
  1. set_system ('tsp_width', 3000)
  2. set_system ('tsp_height', 3000)
复制代码
14.上面的两句代码意思是设置默认的图像缓存的宽度和高度都是3000,这样就足够大了!
  1. set_system ('tsp_width', 3000)
  2. set_system ('tsp_height', 3000)

  3. draw_rectangle2 (3600, Row, Column, Phi, Length1, Length2)
  4. gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
复制代码
15.OK!现在仿射矩形图像完全正常了!果然和我猜想的一模一样!

  1. get_system ('tsp_width', width)
  2. get_system ('tsp_height', height)

  3. read_image (Image, 'clip')

  4. get_system ('tsp_width', width)
  5. get_system ('tsp_height', height)
复制代码

这个时候你会发现原来的是默认512*512大小,读取图片以后就成了图片的宽度大小了,也就是832*822缓存宽度了!
同时这个问题在C#\C++联合开发中也是一样存在,比如在C#或者VC++里面绘制矩形是正常的,保存也是正常的(halcon读取没有问题),但是下一次打开加载读取变成空的!

最后就是要说的,通过read_image加载图片会自动增加缓存大小!

奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
沐橙味 发表于 2018-6-15 16:07:07 | 显示全部楼层
其实吧,我也尝试了一下,只要你创建有窗口,句柄有了,就不会错。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 绝地武士 发表于 2018-6-15 16:10:07 | 显示全部楼层
沐橙味 发表于 2018-6-15 16:07
其实吧,我也尝试了一下,只要你创建有窗口,句柄有了,就不会错。

我们说的不是一个意思吧?有窗口句柄不代表你可以正常初始化的时候加载区域等ROI进来的,如果比缓存大那么基本上都是空区域。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
zhuadong 发表于 2018-6-15 16:55:34 | 显示全部楼层
我是尤达;P
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 绝地武士 发表于 2018-6-15 18:11:39 | 显示全部楼层

你好 尤达大师!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
yzw 发表于 2018-6-16 17:06:26 | 显示全部楼层
看demo的时候一直不理解这句话,谢谢楼主
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
lenole320 发表于 2018-6-16 17:34:33 | 显示全部楼层
过来学习过来学习
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
cdq 发表于 2018-6-18 15:04:35 | 显示全部楼层
专注于机器视觉开发与应用技术,我们一直都在努力!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
wcl 发表于 2018-6-21 11:32:01 | 显示全部楼层
kkkkkk
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表