[Halcon学习笔记]Halcon窗口进行等比例显示图像

news2024/11/16 9:17:06

目录

  • 需求分析
  • Halcon显示原理
  • 显示实现
  • 具体实现Halcon代码

需求分析

在使用Halcon加载图像时,点击Halcon的适应窗口,图像都会按照窗口大小对图像进行拉伸后显示,实际项目中,需要等比例显示图像,体现图像原本的尺寸细节和效果,特别是在Qt或VS中,需要方便调节,这里记录一下等比例显示图像的原理和实现方法。

Halcon显示原理

Halcon显示图像的原理就是去调节视场大小,相当于图像的尺寸大小是固定的,通过调节相机高度和视野去适配图像的大小,这样图像的实际尺寸就不会被缩放。
Halcon中一般使用dev_set_part这个算子,算子四个参数,主要对应的是Halcon视场的左上和右下对应的行列尺寸,比如说图像宽度是500,你想显示的时候左右各留100空余背景,这时列的设置就是(-100,500+100),相当于从-100开始,将图像移动到中间。

显示实现

实际显示的时候,不仅要考虑图像的纵横比,还要考虑控件窗口的纵横比,如果图像的宽高比大于窗口的宽高比,这个时候就把图像的宽度方向靠近边缘,高度方向上下预留空白。

picWHRatio := 1.0 * Width / Height
winWHRatio := 1.0 * winWidth / winHeight
    if (picWHRatio >= winWHRatio)
        * 如果图片宽高比 大于 窗口宽高比
        * 则宽度方向顶格
        dispWidth := Width
        dispHeight := Width / winWHRatio
        offset:=(dispHeight-Height)/2
        dev_set_part (-offset, 0, dispHeight-offset, dispWidth)

宽图像
如果图像的宽高比小于窗口的宽高比,这个时候就把图像的高度方向靠近边缘,宽度方向左右预留空白。

picWHRatio := 1.0 * Width / Height
winWHRatio := 1.0 * winWidth / winHeight
if (Width > winWidth or Height > winHeight)
    if (picWHRatio < winWHRatio)
        * 如果图片宽高比 小于 窗口宽高比
        * 则高度方向顶格
        dispWidth := Height * winWHRatio
        dispHeight := Height
        offset:=(dispWidth-Width)/2
        dev_set_part (0, -offset, dispHeight, dispWidth-offset)

窄图像
如果图像的尺寸均小于控件的尺寸,此时将图像的尺寸乘以控件的纵横比之后再像上边进行比较。

    * 如果图片的长和宽都小于窗口
    if(picWHRatio >= winWHRatio)
        dispWidth := Width
        dispHeight := Width / winWHRatio
        offset:=(dispHeight-Height)/2
        dev_set_part (-offset, 0, dispHeight-offset, Width)
    else
        dispWidth := Height * winWHRatio
        dispHeight := Height
        offset:=(dispWidth-Width)/2
        dev_set_part (0, -offset, dispHeight, dispWidth-offset)
    endif  

小尺寸图像

具体实现Halcon代码

dev_close_window ()
dev_open_window (0, 0, 400, 400, 'gray', WindowHandle)
dev_clear_window ()
dev_update_window ('off')

read_image (Image, 'C:/Users/Administrator/Desktop/lena小尺寸.png')
get_window_extents (WindowHandle, Row, Column, winWidth, winHeight)

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
        offset:=(dispHeight-Height)/2
        dev_set_part (-offset, 0, dispHeight-offset, dispWidth)
    else
        * 如果图片宽高比 小于 窗口宽高比
        * 则高度方向顶格
        dispWidth := Height * winWHRatio
        dispHeight := Height
        offset:=(dispWidth-Width)/2
        dev_set_part (0, -offset, dispHeight, dispWidth-offset)
    endif
else
    * 如果图片的长和宽都小于窗口
    if(picWHRatio >= winWHRatio)
        dispWidth := Width
        dispHeight := Width / winWHRatio
        offset:=(dispHeight-Height)/2
        dev_set_part (-offset, 0, dispHeight-offset, Width)
    else
        dispWidth := Height * winWHRatio
        dispHeight := Height
        offset:=(dispWidth-Width)/2
        dev_set_part (0, -offset, dispHeight, dispWidth-offset)
    endif  
endif
dev_display (Image)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1705828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java对象的揭秘

前言 作为一个 Java 程序员&#xff0c;我们在开发中最多的操作要属创建对象了。那么你了解对象多少&#xff1f;它是如何创建&#xff1f;如何存储布局以及如何使用的&#xff1f;本文将对 Java 对象进行揭秘&#xff0c;以及讲解如何使用 JOL 查看对象内存使用情况。 本文是基…

2024最新版本激活Typora,1.8.10.0版本可用

实测可用日期为&#xff1a;2024-05-28 目前最新版本 1.8.10.0 也是可以实现激活的 注&#xff1a;免修改注册表、不用修改时间&#xff0c;更不需要破解补丁 01、下载&安装 Typora 文件 从官网下载最新版本的 Typora&#xff0c;并安装 或者阿里云盘&#xff1a; htt…

博客系统多模块开发

创建工程 创建父工程 删除src目录&#xff0c;在pom.xml添加依赖&#xff1a; <!--统一版本 字符编码--><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.b…

Git 小白入门到进阶—(基本概念和常用命令)

一.了解 Git 基本概念和常用命令的作用 (理论) 基本概念 1、工作区 包含.git文件夹的目录&#xff0c;主要用存放开发的代码2、仓库 分为本地仓库和远程仓库&#xff0c;本地仓库是自己电脑上的git仓库(.git文件夹);远程仓库是在远程服务器上的git仓库git文件夹无需我们进行操…

一些硬件知识【九】

STM32CUBEMX配置教程&#xff08;六&#xff09;高级定时器单通道输出互补PWM波&#xff08;带死区和刹车&#xff09;_高级定时器死区刹车怎么与电机模块连接?-CSDN博客 MOS选型关键参数&#xff1a; 额定电压&#xff0c;额定电流&#xff0c;导通电阻&#xff0c;阀值电压…

如何通过中间人攻击嗅探SIM卡的流量通信

写在前面的话 这篇文章我将介绍如何制作中间人&#xff08;MitM&#xff09;设置来嗅探SIM卡和后端服务器之间的流量。虽然这不是一项新的研究&#xff0c;但我希望这将帮助一些没有电信基础的人学习移动数据嗅探和虚假基站的知识。但是我只会介绍使用2G和GPRS的SIM卡的方案。…

防止特权升级攻击的有效策略

防止特权升级攻击的有效策略 特权升级攻击是一种通过利用操作系统或应用程序中的编程错误、漏洞、设计缺陷、配置错误或访问控制缺陷&#xff0c;获得对原本应该被限制访问的资源进行未授权访问的行为。这种攻击方式可能导致攻击者获取敏感数据、安装恶意软件并发动其他网络攻…

揭秘网络编程:同步与异步IO模型的实战演练

摘要 ​ 在网络编程领域&#xff0c;同步(Synchronous)、异步(Asynchronous)、阻塞(Blocking)与非阻塞(Non-blocking)IO模型是核心概念。尽管这些概念在多篇文章中被广泛讨论&#xff0c;它们的抽象性使得彻底理解并非易事。本文旨在通过具体的实验案例&#xff0c;将这些抽象…

Python + adb 实现打电话功能

前言 其实很多年前写过一篇python打电话的功能&#xff0c;链接如下&#xff1a; Python twilio 实现打电话和发短信功能_自动发短信代码-CSDN博客 今天由于工作需要&#xff0c;又用python写了个关于打电话的小工具&#xff0c;主要是通过ADB方式实现的 实现过程 1.先利用…

抖店重磅新规!保证金下调,一张营业执照能开多个店铺了!

哈喽~我是月月 抖音平台为助力小商家实现开店低成本&#xff0c;轻负担&#xff0c;高收益的模式 在5月30日正式实施了两个政策&#xff1a;保证金下调&#xff0c;一证多开 政策一&#xff1a;保证金下调 这次政策&#xff0c;涉及的类目优惠包含了&#xff0c;平台近70%的…

一文详解SpringBoot的自定义starter

目录 一、SpringBoot 二、自定义starter 三、SpringBoot的自定义starter 一、SpringBoot Spring Boot是一个开源的Java框架&#xff0c;由Pivotal团队&#xff08;现为VMware的一部分&#xff09;于2013年推出&#xff0c;旨在简化Spring应用程序的创建和部署过程。它基于S…

布隆过滤器-详解及使用

一、什么是布隆过滤器 1、简介 布隆过滤器是一个很长的二进制向量和一系列随机映射函数。可以用于检索一个元素是否在一个集合中。。理解为SET集合。 布隆过滤器其内部维护了一个全为 0 的 bit 数组&#xff0c;需要说明的是&#xff0c;布隆过滤器有一个误判的概念&#xf…

【全开源】宇鹿家政系统(FastAdmin+ThinkPHP+原生微信小程序)

&#xff1a;助力家政行业数字化升级 一、引言&#xff1a;家政服务的新篇章 随着移动互联网的普及和人们生活水平的提高&#xff0c;家政服务的需求日益增长。为了满足这一市场需求&#xff0c;并推动家政行业的数字化升级&#xff0c;我们特别推出了家政小程序系统源码。这…

代码随想录算法训练营第四十二天|62.不同路径、63. 不同路径 II

62.不同路径 文档讲解&#xff1a;代码随想录 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 记录每个格子的状态 二维矩阵-->二维dp数组 dp数组 题目是要求到达最后一个格子有多少种路径 所以dp[i,j]: 到达第(i,j)个格子有多少种路径 递推公式 到达一…

vue+three.js实现3d系统的搭建

1.首先node.js是12.22版本的&#xff0c;安装three.js可以参考这篇文章 直接用Threejs入门-安装教程_安装three.js-CSDN博客 直接在终端安装three.js即可 npm install --save three 在相同目录下安装vite构建工具 npm install --save-dev vite 在项目里面看package.json中…

1688 API接口介绍:开启您的电商新篇章

什么是1688 API接口&#xff1f; API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是一组协议和工具&#xff0c;用于定义不同的软件应用程序如何彼此交互。1688 API接口则是1688平台为商家提供的一套接口规范&#xff0c;允许商家…

浏览器提示网站不安全怎么办?有什么解决办法吗?

当你在浏览器中访问一个网站时&#xff0c;如果看到提示说该网站不安全&#xff0c;这通常是由于网站没有使用SSL证书或者SSL证书存在问题。SSL证书在这里扮演着非常关键的角色&#xff0c;下面我会详细解释它的作用以及如何解决这类不安全提示。 SSL证书的作用&#xff1a; 1…

德邦快递和德邦物流运费标准哪个更划算?怎样才能便宜的寄大件快递?

在寄大件包裹快递时&#xff0c;我们一般都知道选择德邦&#xff0c;那么德邦快递和德邦物流的收费标准哪个更划算呢&#xff1f;下面&#xff0c;让我们一起来了解德邦快递和德邦物流的收费标准&#xff0c;以及如何根据实际情况做出最佳选择。 首先了解快递费用构成 快递费用…

OpenHarmony 入门——初识JS/ArkTS 侧的“JNI” NAPI(一)

引言 在Android中Java可以通过JNI 与C/C 通信&#xff0c;而在OpenHarmony 中前段语言目前是ETS&#xff0c;那么OpenHarmony中的 “JNI” 角色是什么呢&#xff1f; 一、NAPI概述 NAPI全称Native Application Programming Interface&#xff08;最新版的文档已经改为Node-A…

java医院管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的医院管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 医院管理系统的主要使用者分…