C# + halcon 联合编程示例

C# + halcon 联合编程示例

实现功能

        1.加载图像

        2.画直线,画圆,画矩形, 画椭圆 ROI,可以调整大小和位置

        3.实现找边,找圆功能

效果

开发环境

        Visual Studio 2022

        .NET Framework 4.8

        halcondotnet.dll

查看帮助文档

项目结构

DLL引用

        要注意是 HALCON-17.12\dotnet35\halcondotnet.dll

界面控件

        用System.Windows.Forms.Panel 控件来显示 图片

        其他主要是按钮

代码

using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;namespace CJH.Halcon.WinForms.App
{public partial class Form1 : Form{private HSmartWindowControl hwControl;private HWindow hw;private HImage ho_Image;private List<HDrawingObjectEx> drawObjs = new List<HDrawingObjectEx>();public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){//创建Halcon控件对象,并添加到指定的容器中hwControl = new HSmartWindowControl();//var hwControlWpf = new HSmartWindowControlWPF();hwControl.MouseWheel += HwControl_MouseWheel;//通过Halcon控件获取对应Halcon窗口对象hw = hwControl.HalconWindow;//设置控件的填充方式hwControl.Dock = DockStyle.Fill;//把控件添加到显示区hw_container.Controls.Add(hwControl);}/// <summary>/// 鼠标滚轮移动时发生事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void HwControl_MouseWheel(object sender, MouseEventArgs e){hwControl.HSmartWindowControl_MouseWheel(sender, e);}/// <summary>/// 加载图像/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnLoadImage_Click(object sender, EventArgs e){var fileDialog = new OpenFileDialog();fileDialog.Title = "打开图像资源";fileDialog.Filter = "图像资源|*.png;*.jpg;*.bmp";if (fileDialog.ShowDialog() == DialogResult.OK){var filePath = fileDialog.FileName;//创建halcon 图像对象ho_Image = new HImage(filePath);//把图像对象显示到Halcon窗口中hw.DispObj(ho_Image);//设置打开图像自动适应窗口的大小hwControl.SetFullImagePart();}}/// <summary>/// 画直线/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnLine_Click(object sender, EventArgs e){//drawObjs.Clear();//定义绘制线的开始和结束坐标   起点XY- 终点XYvar lineTuple = new HTuple[] { 100, 300, 100, 100 };//创建线的对象var lineObj = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.LINE, lineTuple);//注册线拖拽事件lineObj.OnDrag(LineOnDragAction);lineObj.OnResize(LineonResizeAction);//保存线对象drawObjs.Add(new HDrawingObjectEx(){HObj = lineObj,HTuples = lineTuple});//把画出线放到Halcon窗口上面hw.AttachDrawingObjectToWindow(lineObj);}/// <summary>/// 拖拽(移动)/// </summary>/// <param name="drawid"></param>/// <param name="window"></param>/// <param name="type"></param>private void LineOnDragAction(HDrawingObject drawid, HWindow window, string type){UpdateDrawingObjectData(drawid);}/// <summary>/// 改变大小,长度/// </summary>/// <param name="drawid"></param>/// <param name="window"></param>/// <param name="type"></param>private void LineonResizeAction(HDrawingObject drawid, HWindow window, string type){UpdateDrawingObjectData(drawid);}/// <summary>/// 更新线拖拽或改变大小的方法/// </summary>/// <param name="drawid"></param>/// <exception cref="NotImplementedException"></exception>private void UpdateDrawingObjectData(HDrawingObject drawid){//创建需要对象的属性元组var attrTuple = new HTuple("row1", "column1", "row2", "column2");//根据提供元组获取对应的属性值组元组var valueTuple = drawid.GetDrawingObjectParams(attrTuple);Debug.WriteLine($"row1:{valueTuple[0].D},column1:{valueTuple[1].D},row2:{valueTuple[2].D},column2:{valueTuple[3].D}");//构建一个数组值组成的元组数组var attrValues = new HTuple[] { valueTuple[0], valueTuple[1], valueTuple[2], valueTuple[3] };//更新当前拖拽对像的属性数据drawObjs[0].HTuples = attrValues;}/// <summary>/// 直线抓边/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnLineBound_Click(object sender, EventArgs e){//获取刚刚绘制直线对象的数据var lineTuple = drawObjs[0].HTuples;var hv_LineParam = new HTuple(lineTuple);//清理绘制的直线对象clearObject();//创建计算测量句柄HOperatorSet.CreateMetrologyModel(out HTuple hv_MetrologyHandle);//句柄关联测试的图坐标位置//设置测量对象图像的大小//参数://    MeasureHandle:输入测量模型的句柄;//    Width:输出图像宽;//    Height:输出图像高;//HOperatorSet.SetMetrologyModelImageSize(hv_MetrologyHandle, hv_Width, hv_Height);//添加测量模型对象(此处是线)//将测量对象添加到测量模型中//算子参数://    MeasureHandle:输入测量模型的句柄;//    Shape:输入要测量对象的类型;默认值:‘circle’,参考值:‘circle’圆,‘ellipse’椭圆,‘line’线,‘rectangle2’矩形,长方形;//    ShapeParam:要添加的测量对象的参数。//    MeasureLength1:输入垂直于边界的测量区域的一半长度(卡尺长度);默认值:20,参考值:10,20,30;最小增量:1.0;建议增量:10.0//    MeasureLength2:输入与边界相切的测量区域的一半长度(卡尺宽度);默认值:5,参考值:3,5,10;最小增量:1.0;建议增量:10.0//    MeasureSigma:输入用于平滑的高斯函数的sigma;默认值:1,参考值:0.4,0.6,0.8,1.0,1.5,2.0,3.0,4.0,5.0,7.0,10.0;最小增量:0.01;建议增量:0.1;限制:(0.4 <= MeasureSigma)&&(MeasureSigma <= 100)//    MeasureThreshold:输入测量阈值/最小边缘幅度;默认值:30,参考值:5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 90.0, 110.0;最小增量:0.5;建议增量:2;//    GenParamName:输入参数名称;参考: ‘distance_threshold’, ‘end_phi’, ‘instances_outside_measure_regions’, ‘max_num_iterations’, ‘measure_distance’, ‘measure_interpolation’, ‘measure_select’, ‘measure_transition’, ‘min_score’, ‘num_instances’, ‘num_measures’, ‘point_order’, ‘rand_seed’, ‘start_phi’;//    GenParamValue:输入参数值;参考:1, 2, 3, 4, 5, 10, 20, ‘all’, ‘true’, ‘false’, ‘first’, ‘last’, ‘positive’, ‘negative’, ‘uniform’, ‘nearest_neighbor’, ‘bilinear’, ‘bicubic’;//    Index:输出创建测量对象的索引值;HOperatorSet.AddMetrologyObjectGeneric(hv_MetrologyHandle, "line", hv_LineParam,50, 5, 1, 30, new HTuple(), new HTuple(), out HTuple hv_Index);//为测量模型的测量对象设置参数 set_metrology_object_param//根据需求设置测量的参数//设置找线的方式(positive,negative,all)从黑到白,从白到黑//算子参数://    MeasureHandle:输入测量模型的句柄;//    Index:指定测量对象,为all时所有计量对象的参数都被设置(‘all’);//    GenParamName:输入参数名称;默认:‘num_instances’,参考://           'measure_length1':区域,垂直于边界的测量区域的一半长度//           'measure_length2':区域,相切于边界的测量区域的一半长度//           'measure_distance':区域,两个测量区域中心之间的距离//           'num_measures':区域,测量区域数//           'measure_sigma':测量,用于平滑的高斯函数的 Sigma//           'measure_threshold':测量,最小边缘幅度阈值//           'measure_select':测量,边缘端点的选择('last'、'first')//           'measure_transition':测量,方向('all'、'negative'、 'positive')//           'measure_interpolation':测量,插值类型//           'min_score':拟合,最小分数//           'num_instances':拟合,成功拟合实例的最大数量//           'distance_threshold':拟合,距离阈值HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_transition","all");//预期测量的区域个数HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "num_instances",12);//拟合数HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "num_instances",6);//高斯平滑系数,值越大,唯一的边缘越清晰HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_sigma",5);//区域,垂直与边界的测量区域的一半长度HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_length1",80);//区域,相切于边缘的测量区域的一半长度HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_length2",10);//最小边缘幅度越大,要求找到的边缘越锐利(灰度变换明显),反而不容易找到边缘HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_threshold",20);//测量双立方插入值,区别与bilinear双线性HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_interpolation","bicubic");//取值 all,first,best,lastHOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_select","all");//设置最小分数0.7HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "min_score",0.7);//开始找边缘HOperatorSet.ApplyMetrologyModel(ho_Image, hv_MetrologyHandle);//获取测量区域找到的边缘坐标集合HOperatorSet.GetMetrologyObjectMeasures(out HObject ho_Contours, hv_MetrologyHandle,"all", "all", out HTuple hv_Row, out HTuple hv_Column);//设置卡尺颜色HOperatorSet.SetColor(hw, "cyan");//显示卡尺HOperatorSet.DispObj(ho_Contours, hw);//把找到的点通过十字叉来显示//HOperatorSet.GenCrossContourXld(out HObject ho_Cross, hv_Row, hv_Column, 6, 0.785398);//HOperatorSet.DispObj(ho_Cross, hw);//得到线的起点坐标并显示出来HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, 0, "all", "result_type","all_param", out HTuple hv_Parameter);//获取计量模型的计量结果轮廓HOperatorSet.GetMetrologyObjectResultContour(out HObject ho_Contour, hv_MetrologyHandle,0, "all", 1.5);//设置轮廓颜色HOperatorSet.SetColor(hw, "green");HOperatorSet.SetLineWidth(hw, 3);//显示轮廓HOperatorSet.DispObj(ho_Contour, hw);//清除句柄HOperatorSet.ClearMetrologyModel(hv_MetrologyHandle);}/// <summary>/// 清理绘制的直线对象/// </summary>private void clearObject(){foreach (var item in drawObjs){var hDrawingObject = item.HObj;//把这个对象从Halcon窗口中移除hw.DetachDrawingObjectFromWindow(hDrawingObject);hDrawingObject.Dispose();}drawObjs.Clear();}/// <summary>/// 找  圆/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnFindCircle_Click(object sender, EventArgs e){//获取圆形对象的位置与半径var circle = drawObjs[0].HTuples;//创建测量模型HOperatorSet.CreateMetrologyModel(out HTuple hv_MetrologyHandle);//添加找圆工具,给定参数,显示过程卡尺//50 卡尺长度//5 卡尺宽度HOperatorSet.AddMetrologyObjectCircleMeasure(hv_MetrologyHandle, circle[0].D, circle[1].D,circle[2].D, 50, 5, 1, 30, new HTuple(), new HTuple(), out HTuple hv_Index);HOperatorSet.GetMetrologyObjectModelContour(out HObject ho_Contour, hv_MetrologyHandle,0, 1.5);HOperatorSet.GetMetrologyObjectMeasures(out HObject ho_Contours, hv_MetrologyHandle,"all", "all", out HTuple hv_Row1, out HTuple hv_Column1);HOperatorSet.SetColor(hw, "cyan");HOperatorSet.DispObj(ho_Contour, hw);HOperatorSet.DispObj(ho_Contours, hw);//执行找圆并显示结果HOperatorSet.ApplyMetrologyModel(ho_Image, hv_MetrologyHandle);HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, 0, "all", "result_type","all_param", out HTuple hv_Parameter);HOperatorSet.GetMetrologyObjectResultContour(out HObject ho_Contour1, hv_MetrologyHandle,0, "all", 1.5);HOperatorSet.SetLineWidth(hw, 2);HOperatorSet.SetColor(hw, "green");HOperatorSet.DispObj(ho_Contour1, hw);HOperatorSet.ClearMetrologyModel(hv_MetrologyHandle);}/// <summary>/// 拖拽(移动)/// </summary>/// <param name="drawid"></param>/// <param name="window"></param>/// <param name="type"></param>private void circOnDragAction(HDrawingObject drawid, HWindow window, string type){UpdateDrawingObjectDataCirc(drawid);}/// <summary>/// 改变大小,长度/// </summary>/// <param name="drawid"></param>/// <param name="window"></param>/// <param name="type"></param>private void circResizeAction(HDrawingObject drawid, HWindow window, string type){UpdateDrawingObjectDataCirc(drawid);}/// <summary>/// (圆)更新线拖拽或改变大小的方法/// </summary>/// <param name="drawid"></param>/// <exception cref="NotImplementedException"></exception>private void UpdateDrawingObjectDataCirc(HDrawingObject drawid){//创建需要对象的属性元组var attrTuple = new HTuple("row", "column", "radius");//根据提供元组获取对应的属性值组元组var valueTuple = drawid.GetDrawingObjectParams(attrTuple);Debug.WriteLine($"row:{valueTuple[0].D},column:{valueTuple[1].D},radius:{valueTuple[2].D}");//构建一个数组值组成的元组数组var attrValues = new HTuple[] { valueTuple[0], valueTuple[1], valueTuple[2] };//更新当前拖拽对像的属性数据drawObjs[0].HTuples = attrValues;}/// <summary>/// 画圆/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnCircle_Click(object sender, EventArgs e){var circleHtuple = new HTuple[] { 100, 100, 100 };var circleObj = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE, circleHtuple);//注册线拖拽事件circleObj.OnDrag(circOnDragAction);circleObj.OnResize(circResizeAction);//保存线对象drawObjs.Add(new HDrawingObjectEx(){HObj = circleObj,HTuples = circleHtuple});//把画出圆放到Halcon窗口上面hw.AttachDrawingObjectToWindow(circleObj);}/// <summary>/// 画矩形/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnRectangle1_Click(object sender, EventArgs e){var rectangle1Htuple = new HTuple[] { 100, 100, 200, 200 };//矩形var rectangle1Obj = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, rectangle1Htuple);//注册线拖拽事件rectangle1Obj.OnDrag(rectangle1OnDragAction);rectangle1Obj.OnResize(rectangle1ResizeAction);//保存线对象drawObjs.Add(new HDrawingObjectEx(){HObj = rectangle1Obj,HTuples = rectangle1Htuple});//把画出圆放到Halcon窗口上面hw.AttachDrawingObjectToWindow(rectangle1Obj);}/// <summary>/// (矩形)拖拽(移动)/// </summary>/// <param name="drawid"></param>/// <param name="window"></param>/// <param name="type"></param>private void rectangle1OnDragAction(HDrawingObject drawid, HWindow window, string type){UpdateDrawingObjectDataRectangle1(drawid);}/// <summary>/// (矩形)改变大小,长度/// </summary>/// <param name="drawid"></param>/// <param name="window"></param>/// <param name="type"></param>private void rectangle1ResizeAction(HDrawingObject drawid, HWindow window, string type){UpdateDrawingObjectDataRectangle1(drawid);}/// <summary>/// (矩形)更新线拖拽或改变大小的方法/// </summary>/// <param name="drawid"></param>/// <exception cref="NotImplementedException"></exception>private void UpdateDrawingObjectDataRectangle1(HDrawingObject drawid){//创建需要对象的属性元组var attrTuple = new HTuple("row1", "column1", "row2", "column2");//根据提供元组获取对应的属性值组元组var valueTuple = drawid.GetDrawingObjectParams(attrTuple);Debug.WriteLine($"row1:{valueTuple[0].D},column1:{valueTuple[1].D},row2:{valueTuple[2].D},column2:{valueTuple[3].D}");//构建一个数组值组成的元组数组var attrValues = new HTuple[] { valueTuple[0], valueTuple[1], valueTuple[2], valueTuple[3] };//更新当前拖拽对像的属性数据drawObjs[0].HTuples = attrValues;}/// <summary>/// 画椭圆/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnEllipse_Click(object sender, EventArgs e){var ellipseHtuple = new HTuple[] { 100, 100, 50, 50, 50 };//椭圆var ellipseObj = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.ELLIPSE, ellipseHtuple);//注册线拖拽事件ellipseObj.OnDrag(ellipseOnDragAction);ellipseObj.OnResize(ellipseResizeAction);//保存线对象drawObjs.Add(new HDrawingObjectEx(){HObj = ellipseObj,HTuples = ellipseHtuple});//把画出圆放到Halcon窗口上面hw.AttachDrawingObjectToWindow(ellipseObj);}/// <summary>/// (椭圆)拖拽(移动)/// </summary>/// <param name="drawid"></param>/// <param name="window"></param>/// <param name="type"></param>private void ellipseOnDragAction(HDrawingObject drawid, HWindow window, string type){UpdateDrawingObjectDataEllipse(drawid);}/// <summary>/// (椭圆)改变大小,长度/// </summary>/// <param name="drawid"></param>/// <param name="window"></param>/// <param name="type"></param>private void ellipseResizeAction(HDrawingObject drawid, HWindow window, string type){UpdateDrawingObjectDataEllipse(drawid);}/// <summary>/// (椭圆)更新线拖拽或改变大小的方法/// </summary>/// <param name="drawid"></param>/// <exception cref="NotImplementedException"></exception>private void UpdateDrawingObjectDataEllipse(HDrawingObject drawid){//创建需要对象的属性元组//phi 以弧度表示的前半轴的方向//radius1 前半轴//radius2 后半轴var attrTuple = new HTuple("row", "column", "phi", "radius1", "radius2");//根据提供元组获取对应的属性值组元组var valueTuple = drawid.GetDrawingObjectParams(attrTuple);Debug.WriteLine($"row:{valueTuple[0].D},column:{valueTuple[1].D},phi:{valueTuple[2].D},radius1:{valueTuple[3].D},radius2:{valueTuple[4].D}");//构建一个数组值组成的元组数组var attrValues = new HTuple[] { valueTuple[0], valueTuple[1], valueTuple[2], valueTuple[3], valueTuple[4] };//更新当前拖拽对像的属性数据drawObjs[0].HTuples = attrValues;}}/// <summary>/// HDrawingObject 扩展类 ,主要包含拖拽对象和对象属性数据/// </summary>public class HDrawingObjectEx{public HDrawingObject HObj { get; set; }public HTuple[] HTuples { get; set; }}
}

项目源码下载地址

https://download.csdn.net/download/cjh16606260986/89497706

END

        

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

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

相关文章

探索东芝 TCD1304DG 线性图像传感器的功能

主要特性 高灵敏度和低暗电流 TCD1304DG 具有高灵敏度和低暗电流&#xff0c;非常适合需要精确和可靠图像捕捉的应用。传感器包含 3648 个光敏元件&#xff0c;每个元件尺寸为 8 m x 200 m&#xff0c;确保了出色的光灵敏度和分辨率。 电子快门功能 内置的电子快门功能是 T…

力扣爆刷第162天之TOP100五连刷76-80(最小路径和、最长公共前缀、最长连续序列)

力扣爆刷第162天之TOP100五连刷76-80&#xff08;最小路径和、最长公共前缀、最长连续序列&#xff09; 文章目录 力扣爆刷第162天之TOP100五连刷76-80&#xff08;最小路径和、最长公共前缀、最长连续序列&#xff09;一、64. 最小路径和二、221. 最大正方形三、162. 寻找峰值…

mysql判断时间段是否重合

mysql判断时间段是否重合 SELECT CASE WHEN t1.start_time < t2.end_time AND t1.end_time > t2.start_time THEN ‘重合’ ELSE ‘不重合’ END AS result FROM table_name t1, table_name t2 WHERE t1.id <> t2.id;

14-26 剑和侠客 – 预训练模型三部曲3 – 机器人时代来临

概述 在第 1 部分和第 2 部分中&#xff0c;我们讨论了适用于文本和图像任务的预训练模型&#xff0c;并探索了当今常用的模型。我们分析了这些模型的架构以及如何将它们用于特定任务。实现 AGI 所需的两个主要支柱是语言理解和机器的视觉能力。有许多任务与这两种能力有关。 …

中职网络安全B模块渗透测试system0016

访问http://靶机IP/web1/,获取flag值&#xff0c;Flag格式为flag{xxx}&#xff1b; 可能会跳转8000端口删除进入80端口 进入后点击侦查一下&#xff0c;这里乱码了&#xff0c;我们点击查看是一个柯南&#xff0c;web但这是一个web题目肯定不是隐写术&#xff0c;所以说题目的…

CDF累积分布函数和PPF百分点位分布函数

目录 cdf累积分布函数 (CDF) ppf百分位点函数 (PPF) 区别与联系示例关系和区别 cdf 累积分布函数 (CDF) 定义&#xff1a; 累积分布函数 F ( x ) F(x) F(x) 给出随机变量 X X X 小于或等于某个值 x x x 的概率。数学定义&#xff1a; F ( x ) P ( X ≤ x ) F(x) P(X \l…

163邮件通知提醒功能怎么开?有哪些优势?

163邮件通知提醒如何定制&#xff1f;设置邮件通知提醒的步骤&#xff1f; 163邮箱作为一款常用的电子邮件服务工具&#xff0c;其邮件通知提醒功能能有效帮助用户及时处理重要邮件&#xff0c;提高工作效率。AokSend将详细介绍如何在163邮箱中开启邮件通知提醒功能&#xff0…

科普文:从Redis1.0到Redis7.0的发展历程来理解为什么Redis钟爱单线程

概叙 Redis 作为一款流行的开源数据库&#xff0c;每个版本都在不断的迭代和升级&#xff0c;新增了丰富的特性和功能&#xff0c;解决了更多实际应用场景中的问题&#xff0c;提高了 Redis 的性能和可靠性。 总体来说&#xff0c;Redis 的演化之路可以分为以下几个阶段&#x…

人形机器人头部结构设计

我又回来啦&#xff01;电机部分的教程会继续更新咯~ 前几天做了成图增材赛道&#xff0c;也算4个月以来本人做过最复杂的结构项目。 不知结果会怎么样&#xff0c;但我也尽全力啦&#xff01; 把说明书发在这里&#xff0c;STL已发GitHub&#xff0c;链接&#xff1a; zysampo…

如何视频提取字幕?推荐5款视频字幕提取软件

#7月份我的同事一个个消失了#&#xff0c;这不仅是一个话题标签&#xff0c;更是许多公司面临的现实写照。 在人手紧缺的夏日&#xff0c;如何提高工作效率成为当务之急。特别是对于需要处理视频内容的团队&#xff0c;一款能够快速提取字幕的软件显得尤为重要。 下面&#x…

揭秘小红书矩阵系统:源码助力一键自动发布,多平台管理,效率飙升!

在数字化时代&#xff0c;社交媒体已成为品牌和个人展示自我、推广产品的重要舞台。小红书&#xff0c;作为备受年轻人喜爱的社交平台&#xff0c;其影响力不容小觑。然而&#xff0c;面对日益激烈的竞争&#xff0c;如何高效地在小红书上发布内容、管理多平台账号&#xff0c;…

纯技术分享:淘宝商品详情原数据接口参数解析

item_get_app-获得淘宝app商品详情原数据 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_s…

【JavaEE】Spring AOP详解

一.AOP的定义. Aspect Oriented Programming&#xff08;面向切面编程&#xff09;概括的来说AOP是一种思想, 是对某一类事情的集中处理 什么是面向切面编程呢? 切面就是指某一类特定问题, 所以AOP也可以理解为面向特定方法编程.什么是面向特定方法编程呢? 比如上个博客文章…

百度搜索框制作HTML+CSS

样品图 自制效果图&#xff08;附注释&#xff09; <!DOCTYPE html> <html lang"en"><head><!-- 定义文档的字符编码为UTF-8&#xff0c;以支持中文等多语言字符 --><meta charset"UTF-8" /><!-- 设置页面在不同设备上的…

不容错过!手把手教你开启微信通话自动录音功能!(含手机端和电脑端)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 微信自动录音 📒📝 方法一📝 方法二📝 电脑端自动录音📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 在商务沟通或重要对话中,通话录音功能可以帮助我们记录关键信息,避免遗漏,同时也是证据保存的一种手段。虽然微…

IPXProxy海外代理IP在MultiLogin指纹浏览器中的配置教程

Multilogin指纹浏览器是一款付费浏览器&#xff0c;它为用户提供了拥有多个虚拟浏览器配置文件的机会。作为最好的指纹浏览器之一&#xff0c;它常常被用来创建或管理多个账户&#xff0c;当然在这个过程&#xff0c;代理IP是不可或缺的一部分。下面给大家代理在MultiLogin指纹…

WPF界面设计-更改按钮样式 自定义字体图标

一、下载图标文件 iconfont-阿里巴巴矢量图标库 二、xaml界面代码编辑 文件结构 &#xe653; 对应的图标代码 Fonts/#iconfont 对应文件位置 <Window.Resources><ControlTemplate TargetType"Button" x:Key"CloseButtonTemplate"…

将Hyper-V虚拟机与主机共享网络

Hyper-V 网络设置 目标 将Hyper-V虚拟机网络配置为与主机使用同一网络&#xff0c;并确保主机网络连接不受影响。 前提条件 主机上已安装Hyper-V已创建Hyper-V虚拟机 步骤 1. 配置主机网络共享 打开 控制面板 -> 网络和 Internet -> 网络连接。右键点击 WIAN,选择…

IMX6ULL linux4.x RS485配置

文章目录 IMX6ULL linux4.x RS485配置使用IMX6ULL硬件流控设备树 使用普通IO口做软件流控串口驱动补丁设备树 rs485测试程序使用效果 IMX6ULL linux4.x RS485配置 使用IMX6ULL硬件流控 设备树 pinctrl_485r1: 485r1grp {fsl,pins <MX6UL_PAD_UART2_TX_DATA__UART2_DCE_T…

【鸿蒙学习笔记】UIAbility组件概述

官方文档&#xff1a;UIAbility组件 目录标题 UIAbility组件概述 [Q&A] 什么是UIAbility&#xff1f;声明周期UIAbility组件-启动模式UIAbility组件-与UI的数据同步 UIAbility组件概述 [Q&A] 什么是UIAbility&#xff1f; UIAbility组件是一种包含UI界面的应用组件&a…