C#与halcon联合 缩放移动自适应图像

读取图片

//获取文件路径下的图片public HObject GetImgFromPath(string imgPath){HObject L_Img;HOperatorSet.GenEmptyObj(out L_Img);//清空图片L_Img.Dispose();//释放HOperatorSet.ReadImage(out L_Img, imgPath);//读取图片存入到l_imgreturn L_Img;}

拉伸显示

//图片拉伸显示public void  ImgIsStretchDisplay(HObject L_Img, HTuple Hwindow){HTuple hv_Width,hv_Height;HOperatorSet.ClearWindow(Hwindow);//清空画面HOperatorSet.GetImageSize(L_Img, out hv_Width, out hv_Height);//获取图片大小规格HOperatorSet.SetPart(Hwindow, 0, 0, hv_Height, hv_Width);//设置窗体的规格HOperatorSet.DispObj(L_Img, Hwindow);//显示图片}

不拉伸,原图比例显示

//图片不拉伸显示public void ImgIsNotStretchDisplay(HObject L_Img, HTuple Hwindow){HTuple hv_Width, hv_Height;HTuple win_Width, win_Height, win_Col, win_Row, cwin_Width, cwin_Height;HOperatorSet.ClearWindow(Hwindow);HOperatorSet.GetImageSize(L_Img, out hv_Width, out hv_Height);//获取图片大小规格HOperatorSet.GetWindowExtents(Hwindow, out win_Row, out win_Col, out win_Width, out win_Height);//获取窗体大小规格cwin_Height = 1.0 * win_Height / win_Width * hv_Width;//宽不变计算高          if (cwin_Height > hv_Height)//宽不变高能容纳{cwin_Height = 1.0 * (cwin_Height - hv_Height) / 2;HOperatorSet.SetPart(Hwindow, -cwin_Height, 0, cwin_Height + hv_Height, hv_Width);//设置窗体的规格}else//高不变宽能容纳{cwin_Width = 1.0 * win_Width / win_Height * hv_Height;//高不变计算宽cwin_Width = 1.0 * (cwin_Width - hv_Width) / 2;HOperatorSet.SetPart(Hwindow, 0, -cwin_Width, hv_Height, cwin_Width + hv_Width);//设置窗体的规格}HOperatorSet.DispObj(L_Img, Hwindow);//显示图片}    

图像缩放

解决缩太小崩溃问题,联合鼠标滚轮事件

//图片缩小放大,配合鼠标滚轮事件public  void ImgZoom(HObject L_Img, HTuple Hwindow, int Delta = 0){HTuple Zoom, Row, Col, L_Button;HTuple hv_Width, hv_Height;HTuple Row0, Column0, Row00, Column00, Ht, Wt;HTuple[] Now_Pos = new HTuple[4];if (Delta > 0)//鼠标滚动格值,一般120{Zoom = 1.2;//向上滚动,放大倍数}else{Zoom = 0.8;//向下滚动,缩小倍数}HOperatorSet.GetMposition(Hwindow, out Row, out Col, out L_Button);//获取当前鼠标的位置HOperatorSet.GetPart(Hwindow, out Row0, out Column0, out Row00, out Column00);//获取当前窗体的大小规格HOperatorSet.GetImageSize(L_Img, out hv_Width, out hv_Height);//获取图片大小规格Ht = Row00 - Row0;Wt = Column00 - Column0;if (Ht * Wt < 32000 * 32000 || Zoom == 1.2){Now_Pos[0] = (Row0 + ((1 - (1.0 / Zoom)) * (Row - Row0)));Now_Pos[1] = (Column0 + ((1 - (1.0 / Zoom)) * (Col - Column0)));Now_Pos[2] = Now_Pos[0] + (Ht / Zoom);Now_Pos[3] = Now_Pos[1] + (Wt / Zoom);HOperatorSet.SetPart(Hwindow, Now_Pos[0], Now_Pos[1], Now_Pos[2], Now_Pos[3]);HOperatorSet.ClearWindow(Hwindow);HOperatorSet.DispObj(L_Img, Hwindow);}else{ImgIsNotStretchDisplay(L_Img, Hwindow);//不拉伸显示}}

图像移动,实时移动

解决移动太快图像刷新闪烁问题

HTuple oldRow, oldColumn;//鼠标按下去拖着图像移动,配合鼠标坐标按下与移动事件public void MouseDownMoveImg(HObject L_Img, HTuple Hwindow){HTuple row1, col1, row2, col2, Row, Column, Button;HOperatorSet.GetMposition(Hwindow, out Row, out Column, out Button);double RowMove = Row - oldRow; double ColMove = Column - oldColumn;HOperatorSet.GetPart(Hwindow, out row1, out col1, out row2, out col2);//得到当前的窗口坐标HOperatorSet.SetPart(Hwindow, row1 - RowMove, col1 - ColMove, row2 - RowMove, col2 - ColMove);//防止刷新图片太快的时候闪烁HOperatorSet.SetSystem("flush_graphic", "false");HOperatorSet.ClearWindow(Hwindow);HOperatorSet.SetSystem("flush_graphic", "true");//HOperatorSet.DispObj(L_Img, Hwindow);}public void SaveMouseDownPosition(HTuple Hwindow){HTuple Button;HOperatorSet.GetMposition(Hwindow, out oldRow, out oldColumn, out Button);}

图像自适应

这里我们采用不拉伸显示函数

//设置自动适应private void tsMAutoFit_Click(object sender, EventArgs e){try{ImgIsNotStretchDisplay(ho_Image1, hWindowControl1.HalconWindow);}catch (Exception){MessageBox.Show("自适应失败,请插入图像!");}          }

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

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

相关文章

基于云平台的智慧养殖远程监控系统

一、项目背景 冬春季节每天的温度和昼夜温差变化很大&#xff0c;为保证养殖动物有一个温暖舒适的生存环境&#xff0c;使动物的生产性能得到较好的发挥&#xff0c;须注意做好温度、湿度、通风等方面的控制。 智慧养殖智能监控系统可以实现对如温度、湿度、气体浓度、光照度…

Spring Profile与PropertyPlaceholderConfigurer实现项目多环境配置切换

最近考虑项目在不同环境下配置的切换&#xff0c;使用profile注解搭配PropertyPlaceholderConfigurer实现对配置文件的切换&#xff0c;简单写了个demo记录下实现。 基本知识介绍 Profile Profile通过对bean进行修饰&#xff0c;来限定spring在bean管理时的初始化情况&#…

Spring源码——初识Spring容器

Spring源码之工厂&#xff08;容器&#xff09; 为什么把Spring的工厂又叫做容器呢&#xff1f; 工厂的责任是创建对象&#xff0c;但是创建完对象后还要进行存储&#xff08;针对于单例的对象来讲&#xff09;&#xff0c;以供其他地方使用&#xff0c;这就是容器。为了能存…

An unexpected error has occurred. Conda has prepared the above report

今日在服务器上创建anaconda虚拟环境的时候&#xff0c;出现了如下报错 An unexpected error has occurred. Conda has prepared the above report 直接上解决方案 在终端中输入如下指令 conda config --show-sources 如果出现以下提示&#xff0c;说明多了一个文件 输入以下…

C++学习第七天

1.string类简介 首先要使用string类&#xff0c;程序要包含头文件string&#xff1b;string类位于名称空间std中&#xff0c;所以using编译指令是必须要有的&#xff0c;或者std&#xff1a;&#xff1a;string来引用它&#xff0c;不过这比较麻烦&#xff1b; 类设计让程序能…

JavaScript 中 let 和 var 的区别

首先&#xff0c;let 和 var 都是用于声明变量的关键字&#xff0c;在老版 JavaScript 中也许你会见到 var 方式来声明变量&#xff0c;而现如今几乎都是使用 let 进行声明&#xff0c;接下来看看这两个关键字之间的区别。 1、作用域 var var 声明的变量在函数内部有效&#x…

【C++】static_cast基本用法(详细讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

面试热题(字符串相加)

给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 输入&#xff1a;num1 "11"…

2023-08-11力扣每日一题

链接&#xff1a; 1572. 矩阵对角线元素的和 题意&#xff1a; 计算主对角线和副对角线上的元素的和&#xff08;不计算重复的&#xff09; 解&#xff1a; O.o&#xff1f; 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; int diagonalSum(ve…

Debian 12.1 正式发布

导读Debian 12.1 现已发布&#xff0c;这是对稳定发行版 Debian 12&#xff08;代号 Bookworm &#xff09;的首次更新。本次发布主要增加了安全问题的修正&#xff0c;并对严重问题进行了一些调整。 一些更新内容包括&#xff1a; 妥善处理系统用户的创建&#xff1b;修复 eq…

Jmeter请求接口返回值乱码解决

乱码示例 解决步骤&#xff1a; 1.打开Jmeter安装目录下的bin目录&#xff0c;找到jmeter.properties 2.使用记事本或其他编译工具打开jmeter.properties文件&#xff0c;然后全局搜索sampleresult.default.encoding 3.在文件中添加sampleresult.default.encodingutf-8,保存…

前端技术Html,Css,JavaScript,Vue3

Html 1.基本标签 <h1>最大的标题</h1> <h2> . . . </h2> <h3> . . . </h3> <h4> . . . </h4> <h5> . . . </h5> <h6>最小的标题</h6><p>这是一个段落。</p> <br> &#xff08;换…

mac安装nvm管理工具遇到的问题和解决方法

nvm 是一款可以管理多版本node的工具&#xff0c;因为是刚买没多久的电脑之前用的都是windows&#xff0c;昨天折腾了一下午终于倒腾好了 第一步&#xff1a; 卸载电脑已有的node&#xff1b;访问nvm脚本网址&#xff0c;另存为到电脑上任何目录&#xff0c;我是放在桌面上的…

使用eXosip+ffmpeg、ffplay命令行实现sip客户端

文章目录 前言一、关键实现1、主要流程2、解决端口冲突&#xff08;1&#xff09;、出现原因&#xff08;2&#xff09;、解决方法 3、解析sdp&#xff08;1&#xff09;、定义实体&#xff08;2&#xff09;、解析视频&#xff08;3&#xff09;、解析音频 4、命令行推拉流&am…

threejs点击模型实现模型边缘高亮的选中效果--更改后提高帧率

先来个效果图 之前写的那个稍微有点问题&#xff0c;帧率只有30&#xff0c;参照官方代码修改后&#xff0c;帧率可以达到50了&#xff0c;在不全屏的状态下&#xff0c;帧率60 1.首先需要导入库 // 用于模型边缘高亮 import { EffectComposer } from "three/examples/js…

github 无语的问题,Host does not existfatal: Could not read from remote repository.

Unable to open connection: Host does not existfatal: Could not read from remote repository. image.png image.png image.png Please make sure you have the correct access rights and the repository exists. 如果github desktop和git pull 和git clone全部都出问题了&…

[保研/考研机试] KY102 计算表达式 上海交通大学复试上机题 C++实现

描述 对于一个不存在括号的表达式进行计算 输入描述&#xff1a; 存在多组数据&#xff0c;每组数据一行&#xff0c;表达式不存在空格 输出描述&#xff1a; 输出结果 示例1 输入&#xff1a; 6/233*4输出&#xff1a; 18思路&#xff1a; ①设立运算符和运算数两个…

视觉学习(七)---Flask 框架下接口调用及python requests 实现json字符串传输

在项目实施过程中需要与其他系统进行接口联调&#xff0c;将图像检测的结果传递给其他系统接口&#xff0c;进行逻辑调用。这中间的过程可以通过requests库进行实现。 1.安装requests库 pip install requests2.postman 接口测试 我们先通过postman 了解下接口调用&#xff0…

在vue3+vite项目中使用jsx语法

如果我掏出下图&#xff0c;阁下除了私信我加入学习群&#xff0c;还能如何应对&#xff1f; 正文开始 前言一、下载资源二、利用vite工具引入babel插件总结 前言 最近在为部署人员开发辅助部署的工具&#xff0c;技术栈是vue3viteelectron&#xff0c;在使用jsx语法时&#x…

08-2_Qt 5.9 C++开发指南_坐标系统和坐标变换

文章目录 1. 坐标变换函数2. 视口和窗口 1. 坐标变换函数 QPainter 在窗口上绘图的默认坐标系统如下图所示&#xff0c;这是绘图设备的物理坐标。 为了绘图的方便&#xff0c;QPainter 提供了一些坐标变换的功能&#xff0c;通过平移、旋转等坐标变换&#xff0c;得到一个逻辑…