C# + halcon 联合编程示例

news2024/9/28 17:34:23

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- 终点XY
            var 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,last
            HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, "all", "measure_select",
                "all");

            //设置最小分数0.7
            HOperatorSet.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.coloradmin.cn/o/1914058.html

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

相关文章

大模型“聚会”:国内卷价格,国外卷能力

[ GPT-4o和谷歌Gemini不断宣传现阶段AI能力大幅度提高&#xff0c;那么这两家&#xff0c;谁的大模型能力更强呢&#xff1f;这篇文章里&#xff0c;作者就展开了多维度的测试和体验&#xff0c;想了解的同学&#xff0c;可以来看一下。 在中美AI大模型的竞争上&#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…

[C++]——同步异步日志系统(3)

同步异步日志系统 一、日志系统框架设计1.1模块划分1.1.1 日志等级模块1.1.2 日志消息模块1.1.3 日志消息格式化模块1.1.4 日志落地模块&#xff08;日志落地的方向是工厂模式&#xff09;1.1.5 日志器模块&#xff08;日志器的生成是建造者模式&#xff09;1.1.6 异步线程模块…

Coze API接口实战应用

Coze API介绍 概述 Coze API作为Coze平台对外的桥梁&#xff0c;让开发者能够灵活地利用Coze的功能和服务&#xff0c;促进业务流程自动化和系统集成。它覆盖了从数据获取到智能交互的全方位功能&#xff0c;旨在提升工作效率和创造更多可能。 Coze API申请接入流程 1. 发现…

python--实验8 函数(2)

知识点 变量的作用域 定义&#xff1a;解释了局部变量和全局变量的概念。局部变量&#xff1a; 局部变量是在函数内部定义的变量。它们只在该函数内部可见&#xff0c;一旦函数执行完毕&#xff0c;这些变量就会被销毁。例子&#xff1a;在函数内部通过赋值创建的变量。全局…

【卡尔曼滤波】高斯白噪声

生成高斯白噪声并将其应用于信号处理 生成高斯白噪声并将其应用于信号处理 #以下是一个生成高斯白噪声并将其应用于信号处理的示例代码:import numpy as np import matplotlib.pyplot as plt import matplotlib.font_manager ## not work#notice matplotlibrc is a file, not…

hf-mirror (huggingface 的国内镜像)

官网&#xff1a; https://hf-mirror.com/ 网站域名 hf-mirror.com&#xff0c;用于镜像 huggingface.co 域名。作为一个公益项目&#xff0c;致力于帮助国内AI开发者快速、稳定的下载模型、数据集。 如何使用HF-Mirror 方法一&#xff1a;网页下载 在https://hf-mirror.com/…

ubuntu笔记本X86安装nomachine客户端

资源下载: 链接: link 一、首先下载文件 nomachine_8.2.3_4_x86_64.tar.gz到桌面。 二、打开终端,依次输入 进入root模式,需要输入密码,密码不可见。 sudu su复制nomachine_8.2.3_4_x86_64.tar.gz粘贴到/usr目录: cp -r nomachine_8.2.3_4_x86_64.tar.gz /usr进入

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-敌机配置(五)

文章目录 开发思路敌人节点场景绿色敌人制作 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击&#xff08;一&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件&#xff08;二&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-飞船…

强化学习总结(有具体代码实现)

文章目录 第一部分 强化学习基础第1章 强化学习概述1.1 强化学习概念1.2 强化学习的环境1.3 强化学习的目标1.4 强化学习的数据 第2章 多臂老虎机问题&#xff08;MAB问题&#xff09;2.1 问题描述2.1.1 问题定义2.1.2 形式化描述2.1.3 累积懊悔2.1.4 估计期望奖励 2.2 解决方法…

(自用)gtest单元测试

gtest是Google的一套用于编写C测试的框架&#xff0c;可以运行在很多平台上&#xff08;包括Linux、Mac OS X、Windows、Cygwin等等&#xff09;。基于xUnit架构。支持很多好用的特性&#xff0c;包括自动识别测试、丰富的断言、断言自定义、死亡测试、非终止的失败、生成XML报…

跑GCN收敛实验时遇到的Python环境问题

错误1&#xff1a; 报错提示&#xff1a;No module named sklearn.utils.linear_assignment_ 原因&#xff1a;linear_assignment 函数从0.21开始被弃用了&#xff0c;并且将在0.23版本中移除。 解决方法&#xff1a;降低scikit-learn版本&#xff08;本人通过该方法解决&#…

从零开始开发视频美颜SDK:实现直播美颜效果

因此&#xff0c;开发一款从零开始的视频美颜SDK&#xff0c;不仅可以节省成本&#xff0c;还能根据具体需求进行个性化调整。本文将介绍从零开始开发视频美颜SDK的关键步骤和实现思路。 一、需求分析与技术选型 在开发一款视频美颜SDK之前&#xff0c;首先需要进行详细的需求…

自定义指令实现Element Plus分页组件内容样式修改

改之前是这样的 改之后是这样的 因为之前我也有写过文章讲解Vue2-ElementUI分页组件的样式修改。 ElementUI 分页组件内容样式修改https://blog.csdn.net/qq_54548545/article/details/139728064且通常情况下&#xff0c;一个项目若是大量使用到分页组件&#xff0c;咱们也不可…

MySQL语法笔记(补充版)

补充上一篇博客没涉及到的实用语法 MySQL语法笔记&#xff08;温习版&#xff09; 查看正在使用的数据库 SELECT DATABASE()查看时区 show VARIABLES like time_zone修改时区 timestamp类型存储的时间与MySQL数据库系统安装时所选的时区有关&#xff0c;在不同时区下查看的同…

【SVN的使用- SVN的基本命令-SVN命令简写-注意事项-解决冲突 Objective-C语言】

一、SVN的更新命令:update 1.服务器如果新建了一个文件夹,yuanxing,版本变成6了, 我现在本地还只有三个文件夹,版本5, 终端里边,我们敲一个svn update, 我这儿就多了一个yuanxing文件夹, 这个就是更新,就是把服务器最新的代码下载下来, 假设服务器上大家提交了这…

[CTF]-PWN:House of Cat堆题型综合解析

原理&#xff1a; 调用顺序&#xff1a; exit->_IO_wfile_jumps->_IO_wfile_seekoff->_IO_switch_to_wget_mode _IO_wfile_seekoff源码&#xff1a; off64_t _IO_wfile_seekoff (FILE *fp, off64_t offset, int dir, int mode) {off64_t result;off64_t delta, new…

基于ARM Cortex-M3单片机研发的国产指纹芯片 - P1032BF1

智能指纹锁的核心部件&#xff1a;主板、离合器、指纹采集器、密码技术、微处理器&#xff08;CPU&#xff09;、智能应急钥匙。作为指纹锁来说&#xff0c;重要的应该是指纹芯片。指纹锁是通过电子部件及机械部件的精密组合而生产出的安全产品。指纹锁的本质无非是安全、便捷、…

man手册的安装和使用

man手册 - HQ 文章目录 man手册 - HQ[toc]man手册的使用Linux man中文手册安装man中文手册通过安装包安装通过apt安装 配置man中文手册README使用说明配置步骤 man手册的使用 首先man分为八个目录&#xff0c;每个目录用一个数字表示 1.可执行程序2.系统调用3.库函数4.特殊文…

7.深度学习概述

深度学习概述 1. 线性回归1.1 线性回归一般表达式1.2 线性回归内积表达方式&#xff1a;1.3 多个样本时&#xff0c;线性回归的进一步表达&#xff1a;1.4 线性回归方程的解析1.5 线性回归就是求loss函数的最小值 2. 如何求函数最小值2.1 一个例子2.2 求导法——求最小值2.3 求…