Halcon基于dev_set_part显示图片正常长宽比的方法

本文介绍使用Halcon/C#进行图片原始长宽比显示及形状匹配定位的方法,纠正了以往对dev_set_part算子理解的误区,详细解释了如何调整相机视角而非改变图片尺寸来正确显示图片,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回顾

之前博文中,曾经提到,通过计算欲显示图片和窗口控件长、宽比例,对图像本身进行放缩,再进行显示的方法。
现在看来是因为当时对dev_set_part这个算子的理解不到位造成的。
Halcon/C#混合编程实现任意图片的原始长宽比显示+形状匹配定位

之前方法的缺点

之前的方法虽然也看似完成了目标,但是需要对图片本身进行放缩处理。这就使得在UI交互时,交互得到的位置坐标需要进行换算方可对应到图像的实际像素坐标。

正确的理解思路

想像我们有一张桌子,桌子上放了一个手机,现在我们用一个相机去给手机拍照,怎样让手机看起来占图片更大一些呢?
之前的方法相当于,我们把拍照用的相机位置固定了,然后,把真实世界的手机给放缩了。
正确的思路应该是,我们去调整相机的位置,远近,使手机在相片中的位置和大小显得变化了。事实上,真实的手机是没有办法放大和缩小的。

dev_set_part

这个算子其实就相当于是你用来拍照的相机。它一共有五个输入参数,第一个是窗口控件,后面四个是取景视野在真实世界中的左上角(列、行)和右下角坐标(列、行)。

实现

基于这个算子的功能,以下例证

dev_close_window ()
dev_open_window (0, 0, 400, 480, 'gray', WindowHandle)
set_window_param (WindowHandle, 'save_depth_buffer', 'true')
dev_clear_window ()
dev_update_window ('off')
dev_open_file_dialog ('read_image', 'default', 'default', Selection)
read_image (Image, Selection)
get_window_extents (WindowHandle, Row, Column, winWidth, winHeight)

showPicture (Image, winWidth, winHeight)

gen_rectroi (WindowHandle, winHeight, winWidth, Row3, Column3, Phi, Length1, Length2)

以下是showPicture的内容:

set_system ('int_zooming', 'false')
get_image_size (Image, Width, Height)
picWHRatio := 1.0 * Width / Height
winWHRatio := 1.0 * winWidth / winHeight
if (Width > winWidth or Height > winHeight)
    * 如果图片宽高比 大于 窗口宽高比
    * 则宽度方向顶格
    if (picWHRatio >= winWHRatio)
        dispWidth := Width
        dispHeight := Width / winWHRatio
        dev_set_part (0, 0, dispHeight, dispWidth)
        dev_display (Image)
    endif
    
    * 如果图片宽高比 小于 窗口宽高比
    * 则高度方向顶格
    
    if (picWHRatio < winWHRatio)
        dispWidth := Height * winWHRatio
        dispHeight := Height
        dev_set_part (0, 0, dispHeight, dispWidth)
        dev_display (Image)
    endif
    
else
    * 如果图片的长和宽都小于窗口,则以图片的原真实尺寸显示
    dev_set_part (0, 0, winHeight, winWidth)
    dev_display (Image)
endif
return ()

以下是gen_rectroi的内容

dev_set_colored (3)
draw_rectangle2_mod (WindowHandle, winHeight/2.0-1, winWidth/2.0-1, 0, winWidth/4.0, winHeight/4.0, Row3, Column3, Phi, Length1, Length2)
dev_set_color ('green')
gen_rectangle2_contour_xld (Rectangle, Row3, Column3, Phi, Length1, Length2)
dev_display (Rectangle)
dev_set_colored (3)

return ()

验证

采用一张264×245大小的图片,窗口的大小设置为400×480
则得到的显示为
在这里插入图片描述
作为对比,如果不调整显示区域,则默认填充整个窗口
在这里插入图片描述

C#例程代码

下载地址

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值