Halcon案例(二):C#联合Halcon回形针以及方向
- 本案例分3部分
- 识别效果,分别显示识别前后识别后;
- 代码展示,分别是Halcon源码和Halcon转为C#的代码
- 代码解释(解释在源码中);
- 原图如下
识别后图像:
其中计算回形针与X轴之间的夹角
Halcon代码:
* clip.hdev: Orientation of clips
*识别图像中的回形针,并且计算回形针与X轴之间的夹角
*
*打开一张图像
read_image (Clip, 'clip')*获取图像大小
get_image_size (Clip, Width, Height)*关闭已经打开的窗口
dev_close_window ()*打开新窗口
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowID)*在新窗口里显示图像
dev_display (Clip)*设置窗口字体显示,字体大小,字体样式,粗体,斜体
set_display_font (WindowID, 14, 'mono', 'true', 'false')*在窗口右下方显示"Press Run (F5) to continue"字样
*disp_continue_message (WindowID, 'black', 'true')*停止程序的执行
*stop ()*二值化操作
binary_threshold (Clip, Dark, 'max_separability', 'dark', UsedThreshold)*将区域进行连通处理
connection (Dark, Single)*过滤出面积大小在【5000, 10000】范围里的区域
select_shape (Single, Selected, 'area', 'and', 5000, 10000)*设置区域的填充方式
dev_set_draw ('fill')*设置输出显示对象的颜色数目
dev_set_colored (12)*在窗口右下方显示"Press Run (F5) to continue"字样
*disp_continue_message (WindowID, 'black', 'true')*停止程序的执行
*stop ()*显示图像
dev_display (Clip)*设置输出对象的颜色为绿色
dev_set_color ('yellow')*显示过滤后的区域
dev_display (Selected)*获取过滤后区域的方向
orientation_region (Selected, Phi)*获取过滤后区域的面积,中心的行坐标,列坐标
area_center (Selected, Area, Row, Column)*设置输出对象的线宽为3
dev_set_line_width (3)*设置区域的填充方式
dev_set_draw ('margin')
Length := 80*设置输出对象的颜色为蓝色
dev_set_color ('orange red')*在窗口上显示十字
disp_arrow (WindowID, Row, Column, Row - Length * sin(Phi), Column + Length * cos(Phi), 4)*在窗口上显示回形针的角度 将弧度转为角度deg(Phi)
disp_message (WindowID, deg(Phi)$'3.1f' + ' deg', 'image', Row, Column - 100, 'black', 'false')
C#代码:
#region 识别回形针方向
/// <summary>
/// 识别图像中的回形针,并且计算回形针与X轴之间的夹角
/// </summary>
public void RecognizeClipDirection(HTuple winId, string imagePath)
{HObject ho_Clip, ho_Dark, ho_Single, ho_Selected;// Local control variables HTuple hv_Width = new HTuple(), hv_Height = new HTuple();HTuple hv_UsedThreshold = new HTuple();HTuple hv_Phi = new HTuple(), hv_Area = new HTuple(), hv_Row = new HTuple();HTuple hv_Column = new HTuple(), hv_Length = new HTuple();// Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Clip);HOperatorSet.GenEmptyObj(out ho_Dark);HOperatorSet.GenEmptyObj(out ho_Single);HOperatorSet.GenEmptyObj(out ho_Selected);try{//clip.hdev: Orientation of clips//打开一张图像ho_Clip.Dispose();HOperatorSet.ReadImage(out ho_Clip, imagePath);//获取图像大小//hv_Width.Dispose();//hv_Height.Dispose();//HOperatorSet.GetImageSize(ho_Clip, out hv_Width, out hv_Height);//打开新窗口//HOperatorSet.SetWindowAttr("background_color", "black");//HOperatorSet.OpenWindow(0, 0, hv_Width / 2, hv_Height / 2, 0, "visible", "", out winId);//HDevWindowStack.Push(winId);//在新窗口里显示图像HOperatorSet.DispObj(ho_Clip, winId);//设置窗口字体显示,字体大小,字体样式,粗体,斜体Set_display_font(winId, 14, "mono", "true", "false");//二值化操作ho_Dark.Dispose();hv_UsedThreshold.Dispose();HOperatorSet.BinaryThreshold(ho_Clip, out ho_Dark, "max_separability", "dark", out hv_UsedThreshold);//将区域进行连通处理ho_Single.Dispose();HOperatorSet.Connection(ho_Dark, out ho_Single);//过滤出面积大小在【5000, 10000】范围里的区域ho_Selected.Dispose();HOperatorSet.SelectShape(ho_Single, out ho_Selected, "area", "and", 5000, 10000);//设置区域的填充方式HOperatorSet.SetDraw(winId, "fill");//设置输出显示对象的颜色数目HOperatorSet.SetColored(winId, 12);//显示图像HOperatorSet.DispObj(ho_Clip, winId);//设置输出对象的颜色为绿色HOperatorSet.SetColor(winId, "yellow");//显示过滤后的区域HOperatorSet.DispObj(ho_Selected, winId);//获取过滤后区域的方向hv_Phi.Dispose();HOperatorSet.OrientationRegion(ho_Selected, out hv_Phi);//获取过滤后区域的面积,中心的行坐标,列坐标hv_Area.Dispose();hv_Row.Dispose();hv_Column.Dispose();HOperatorSet.AreaCenter(ho_Selected, out hv_Area, out hv_Row, out hv_Column);//设置输出对象的线宽为3HOperatorSet.SetLineWidth(winId, 3);//设置区域的填充方式HOperatorSet.SetDraw(winId, "margin");hv_Length.Dispose();hv_Length = 80;//设置输出对象的颜色为蓝色HOperatorSet.SetColor(winId, "orange red");//在窗口上显示十字using (HDevDisposeHelper dh = new HDevDisposeHelper()){HOperatorSet.DispArrow(winId, hv_Row, hv_Column, hv_Row - (hv_Length * hv_Phi.TupleSin()), hv_Column + (hv_Length * (hv_Phi.TupleCos())), 4);}//在窗口上显示回形针的角度 将弧度转为角度deg(Phi)using (HDevDisposeHelper dh = new HDevDisposeHelper()){Disp_message(winId, (((hv_Phi.TupleDeg())).TupleString("3.1f")) + " deg","image", hv_Row, hv_Column - 100, "black", "false");}}catch (HalconException HDevExpDefaultException){//ho_Clip.Dispose();//ho_Dark.Dispose();//ho_Single.Dispose();//ho_Selected.Dispose();//hv_Width.Dispose();//hv_Height.Dispose();//hv_UsedThreshold.Dispose();//hv_Phi.Dispose();//hv_Area.Dispose();//hv_Row.Dispose();//hv_Column.Dispose();//hv_Length.Dispose();throw HDevExpDefaultException;}finally{ho_Clip.Dispose();ho_Dark.Dispose();ho_Single.Dispose();ho_Selected.Dispose();hv_Width.Dispose();hv_Height.Dispose();hv_UsedThreshold.Dispose();hv_Phi.Dispose();hv_Area.Dispose();hv_Row.Dispose();hv_Column.Dispose();hv_Length.Dispose();}
}// Procedures
// External procedures
// Chapter: Graphics / Text
// Short Description: Write one or multiple text messages.
public void Disp_message(HTuple hv_WindowHandle, HTuple hv_String, HTuple hv_CoordSystem,HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box)
{// Local control variables HTuple hv_GenParamName = new HTuple(), hv_GenParamValue = new HTuple();HTuple hv_Color_COPY_INP_TMP = new HTuple(hv_Color);HTuple hv_Column_COPY_INP_TMP = new HTuple(hv_Column);HTuple hv_CoordSystem_COPY_INP_TMP = new HTuple(hv_CoordSystem);HTuple hv_Row_COPY_INP_TMP = new HTuple(hv_Row);// Initialize local and output iconic variables try{#region specification//This procedure displays text in a graphics window.////Input parameters://WindowHandle: The WindowHandle of the graphics window, where// the message should be displayed.//String: A tuple of strings containing the text messages to be displayed.//CoordSystem: If set to 'window', the text position is given// with respect to the window coordinate system.// If set to 'image', image coordinates are used.// (This may be useful in zoomed images.)//Row: The row coordinate of the desired text position.// You can pass a single value or a tuple of values.// See the explanation below.// Default: 12.//Column: The column coordinate of the desired text position.// You can pass a single value or a tuple of values.// See the explanation below.// Default: 12.//Color: defines the color of the text as string.// If set to [] or '' the currently set color is used.// If a tuple of strings is passed, the colors are used cyclically// for every text position defined by Row and Column,// or every new text line in case of |Row| == |Column| == 1.//Box: A tuple controlling a possible box surrounding the text.// Its entries:// - Box[0]: Controls the box and its color. Possible values:// -- 'true' (Default): An orange box is displayed.// -- 'false': No box is displayed.// -- color string: A box is displayed in the given color, e.g., 'white', '#FF00CC'.// - Box[1] (Optional): Controls the shadow of the box. Possible values:// -- 'true' (Default): A shadow is displayed in// darker orange if Box[0] is not a color and in 'white' otherwise.// -- 'false': No shadow is displayed.// -- color string: A shadow is displayed in the given color, e.g., 'white', '#FF00CC'.////It is possible to display multiple text strings in a single call.//In this case, some restrictions apply on the//parameters String, Row, and Column://They can only have either 1 entry or n entries.//Behavior in the different cases:// - Multiple text positions are specified, i.e.,// - |Row| == n, |Column| == n// - |Row| == n, |Column| == 1// - |Row| == 1, |Column| == n// In this case we distinguish:// - |String| == n: Each element of String is displayed// at the corresponding position.// - |String| == 1: String is displayed n times// at the corresponding positions.// - Exactly one text position is specified,// i.e., |Row| == |Column| == 1:// Each element of String is display in a new textline.//////Convert the parameters for disp_text. #endregionif ((int)((new HTuple(hv_Row_COPY_INP_TMP.TupleEqual(new HTuple()))).TupleOr(new HTuple(hv_Column_COPY_INP_TMP.TupleEqual(new HTuple())))) != 0){hv_Color_COPY_INP_TMP.Dispose();hv_Column_COPY_INP_TMP.Dispose();hv_CoordSystem_COPY_INP_TMP.Dispose();hv_Row_COPY_INP_TMP.Dispose();hv_GenParamName.Dispose();hv_GenParamValue.Dispose();return;}if ((int)(new HTuple(hv_Row_COPY_INP_TMP.TupleEqual(-1))) != 0){hv_Row_COPY_INP_TMP.Dispose();hv_Row_COPY_INP_TMP = 12;}if ((int)(new HTuple(hv_Column_COPY_INP_TMP.TupleEqual(-1))) != 0){hv_Column_COPY_INP_TMP.Dispose();hv_Column_COPY_INP_TMP = 12;}////Convert the parameter Box to generic parameters.hv_GenParamName.Dispose();hv_GenParamName = new HTuple();hv_GenParamValue.Dispose();hv_GenParamValue = new HTuple();if ((int)(new HTuple((new HTuple(hv_Box.TupleLength())).TupleGreater(0))) != 0){if ((int)(new HTuple(((hv_Box.TupleSelect(0))).TupleEqual("false"))) != 0){//Display no boxusing (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_GenParamName = hv_GenParamName.TupleConcat("box");hv_GenParamName.Dispose();hv_GenParamName = ExpTmpLocalVar_GenParamName;}}using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_GenParamValue = hv_GenParamValue.TupleConcat("false");hv_GenParamValue.Dispose();hv_GenParamValue = ExpTmpLocalVar_GenParamValue;}}}else if ((int)(new HTuple(((hv_Box.TupleSelect(0))).TupleNotEqual("true"))) != 0){//Set a color other than the default.using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_GenParamName = hv_GenParamName.TupleConcat("box_color");hv_GenParamName.Dispose();hv_GenParamName = ExpTmpLocalVar_GenParamName;}}using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_GenParamValue = hv_GenParamValue.TupleConcat(hv_Box.TupleSelect(0));hv_GenParamValue.Dispose();hv_GenParamValue = ExpTmpLocalVar_GenParamValue;}}}}if ((int)(new HTuple((new HTuple(hv_Box.TupleLength())).TupleGreater(1))) != 0){if ((int)(new HTuple(((hv_Box.TupleSelect(1))).TupleEqual("false"))) != 0){//Display no shadow.using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_GenParamName = hv_GenParamName.TupleConcat("shadow");hv_GenParamName.Dispose();hv_GenParamName = ExpTmpLocalVar_GenParamName;}}using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_GenParamValue = hv_GenParamValue.TupleConcat("false");hv_GenParamValue.Dispose();hv_GenParamValue = ExpTmpLocalVar_GenParamValue;}}}else if ((int)(new HTuple(((hv_Box.TupleSelect(1))).TupleNotEqual("true"))) != 0){//Set a shadow color other than the default.using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_GenParamName = hv_GenParamName.TupleConcat("shadow_color");hv_GenParamName.Dispose();hv_GenParamName = ExpTmpLocalVar_GenParamName;}}using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_GenParamValue = hv_GenParamValue.TupleConcat(hv_Box.TupleSelect(1));hv_GenParamValue.Dispose();hv_GenParamValue = ExpTmpLocalVar_GenParamValue;}}}}//Restore default CoordSystem behavior.if ((int)(new HTuple(hv_CoordSystem_COPY_INP_TMP.TupleNotEqual("window"))) != 0){hv_CoordSystem_COPY_INP_TMP.Dispose();hv_CoordSystem_COPY_INP_TMP = "image";}//if ((int)(new HTuple(hv_Color_COPY_INP_TMP.TupleEqual(""))) != 0){//disp_text does not accept an empty string for Color.hv_Color_COPY_INP_TMP.Dispose();hv_Color_COPY_INP_TMP = new HTuple();}//HOperatorSet.DispText(hv_WindowHandle, hv_String, hv_CoordSystem_COPY_INP_TMP,hv_Row_COPY_INP_TMP, hv_Column_COPY_INP_TMP, hv_Color_COPY_INP_TMP, hv_GenParamName,hv_GenParamValue);hv_Color_COPY_INP_TMP.Dispose();hv_Column_COPY_INP_TMP.Dispose();hv_CoordSystem_COPY_INP_TMP.Dispose();hv_Row_COPY_INP_TMP.Dispose();hv_GenParamName.Dispose();hv_GenParamValue.Dispose();return;}catch (HalconException HDevExpDefaultException){hv_Color_COPY_INP_TMP.Dispose();hv_Column_COPY_INP_TMP.Dispose();hv_CoordSystem_COPY_INP_TMP.Dispose();hv_Row_COPY_INP_TMP.Dispose();hv_GenParamName.Dispose();hv_GenParamValue.Dispose();throw HDevExpDefaultException;}
}// Chapter: Graphics / Text
// Short Description: Set font independent of OS
public void Set_display_font(HTuple hv_WindowHandle, HTuple hv_Size, HTuple hv_Font,HTuple hv_Bold, HTuple hv_Slant)
{// Local control variables HTuple hv_OS = new HTuple(), hv_Fonts = new HTuple();HTuple hv_Style = new HTuple(), hv_Exception = new HTuple();HTuple hv_AvailableFonts = new HTuple(), hv_Fdx = new HTuple();HTuple hv_Indices = new HTuple();HTuple hv_Font_COPY_INP_TMP = new HTuple(hv_Font);HTuple hv_Size_COPY_INP_TMP = new HTuple(hv_Size);// Initialize local and output iconic variables try{//This procedure sets the text font of the current window with//the specified attributes.////Input parameters://WindowHandle: The graphics window for which the font will be set//Size: The font size. If Size=-1, the default of 16 is used.//Bold: If set to 'true', a bold font is used//Slant: If set to 'true', a slanted font is used//hv_OS.Dispose();HOperatorSet.GetSystem("operating_system", out hv_OS);if ((int)((new HTuple(hv_Size_COPY_INP_TMP.TupleEqual(new HTuple()))).TupleOr(new HTuple(hv_Size_COPY_INP_TMP.TupleEqual(-1)))) != 0){hv_Size_COPY_INP_TMP.Dispose();hv_Size_COPY_INP_TMP = 16;}if ((int)(new HTuple(((hv_OS.TupleSubstr(0, 2))).TupleEqual("Win"))) != 0){//Restore previous behaviorusing (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_Size = ((1.13677 * hv_Size_COPY_INP_TMP)).TupleInt();hv_Size_COPY_INP_TMP.Dispose();hv_Size_COPY_INP_TMP = ExpTmpLocalVar_Size;}}}else{using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_Size = hv_Size_COPY_INP_TMP.TupleInt();hv_Size_COPY_INP_TMP.Dispose();hv_Size_COPY_INP_TMP = ExpTmpLocalVar_Size;}}}if ((int)(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("Courier"))) != 0){hv_Fonts.Dispose();hv_Fonts = new HTuple();hv_Fonts[0] = "Courier";hv_Fonts[1] = "Courier 10 Pitch";hv_Fonts[2] = "Courier New";hv_Fonts[3] = "CourierNew";hv_Fonts[4] = "Liberation Mono";}else if ((int)(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("mono"))) != 0){hv_Fonts.Dispose();hv_Fonts = new HTuple();hv_Fonts[0] = "Consolas";hv_Fonts[1] = "Menlo";hv_Fonts[2] = "Courier";hv_Fonts[3] = "Courier 10 Pitch";hv_Fonts[4] = "FreeMono";hv_Fonts[5] = "Liberation Mono";}else if ((int)(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("sans"))) != 0){hv_Fonts.Dispose();hv_Fonts = new HTuple();hv_Fonts[0] = "Luxi Sans";hv_Fonts[1] = "DejaVu Sans";hv_Fonts[2] = "FreeSans";hv_Fonts[3] = "Arial";hv_Fonts[4] = "Liberation Sans";}else if ((int)(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual("serif"))) != 0){hv_Fonts.Dispose();hv_Fonts = new HTuple();hv_Fonts[0] = "Times New Roman";hv_Fonts[1] = "Luxi Serif";hv_Fonts[2] = "DejaVu Serif";hv_Fonts[3] = "FreeSerif";hv_Fonts[4] = "Utopia";hv_Fonts[5] = "Liberation Serif";}else{hv_Fonts.Dispose();hv_Fonts = new HTuple(hv_Font_COPY_INP_TMP);}hv_Style.Dispose();hv_Style = "";if ((int)(new HTuple(hv_Bold.TupleEqual("true"))) != 0){using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_Style = hv_Style + "Bold";hv_Style.Dispose();hv_Style = ExpTmpLocalVar_Style;}}}else if ((int)(new HTuple(hv_Bold.TupleNotEqual("false"))) != 0){hv_Exception.Dispose();hv_Exception = "Wrong value of control parameter Bold";throw new HalconException(hv_Exception);}if ((int)(new HTuple(hv_Slant.TupleEqual("true"))) != 0){using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_Style = hv_Style + "Italic";hv_Style.Dispose();hv_Style = ExpTmpLocalVar_Style;}}}else if ((int)(new HTuple(hv_Slant.TupleNotEqual("false"))) != 0){hv_Exception.Dispose();hv_Exception = "Wrong value of control parameter Slant";throw new HalconException(hv_Exception);}if ((int)(new HTuple(hv_Style.TupleEqual(""))) != 0){hv_Style.Dispose();hv_Style = "Normal";}hv_AvailableFonts.Dispose();HOperatorSet.QueryFont(hv_WindowHandle, out hv_AvailableFonts);hv_Font_COPY_INP_TMP.Dispose();hv_Font_COPY_INP_TMP = "";for (hv_Fdx = 0; (int)hv_Fdx <= (int)((new HTuple(hv_Fonts.TupleLength())) - 1); hv_Fdx = (int)hv_Fdx + 1){hv_Indices.Dispose();using (HDevDisposeHelper dh = new HDevDisposeHelper()){hv_Indices = hv_AvailableFonts.TupleFind(hv_Fonts.TupleSelect(hv_Fdx));}if ((int)(new HTuple((new HTuple(hv_Indices.TupleLength())).TupleGreater(0))) != 0){if ((int)(new HTuple(((hv_Indices.TupleSelect(0))).TupleGreaterEqual(0))) != 0){hv_Font_COPY_INP_TMP.Dispose();using (HDevDisposeHelper dh = new HDevDisposeHelper()){hv_Font_COPY_INP_TMP = hv_Fonts.TupleSelect(hv_Fdx);}break;}}}if ((int)(new HTuple(hv_Font_COPY_INP_TMP.TupleEqual(""))) != 0){throw new HalconException("Wrong value of control parameter Font");}using (HDevDisposeHelper dh = new HDevDisposeHelper()){{HTupleExpTmpLocalVar_Font = (((hv_Font_COPY_INP_TMP + "-") + hv_Style) + "-") + hv_Size_COPY_INP_TMP;hv_Font_COPY_INP_TMP.Dispose();hv_Font_COPY_INP_TMP = ExpTmpLocalVar_Font;}}HOperatorSet.SetFont(hv_WindowHandle, hv_Font_COPY_INP_TMP);hv_Font_COPY_INP_TMP.Dispose();hv_Size_COPY_INP_TMP.Dispose();hv_OS.Dispose();hv_Fonts.Dispose();hv_Style.Dispose();hv_Exception.Dispose();hv_AvailableFonts.Dispose();hv_Fdx.Dispose();hv_Indices.Dispose();return;}catch (HalconException HDevExpDefaultException){hv_Font_COPY_INP_TMP.Dispose();hv_Size_COPY_INP_TMP.Dispose();hv_OS.Dispose();hv_Fonts.Dispose();hv_Style.Dispose();hv_Exception.Dispose();hv_AvailableFonts.Dispose();hv_Fdx.Dispose();hv_Indices.Dispose();throw HDevExpDefaultException;}
}
#endregion
相关文章:
Halcon案例(二):C#联合Halcon回形针以及方向
本案例分3部分 识别效果,分别显示识别前后识别后;代码展示,分别是Halcon源码和Halcon转为C#的代码代码解释(解释在源码中); 原图如下 识别后图像: 其中计算回形针与X轴之间的夹角 Halcon代码: * clip.hdev: Orientation of clips *识别图像中的回形针,并且计算回形针与X轴之间…...
Spyglass:跨时钟域同步(同步单元)
相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 简介 同步单元方案可以用于控制/数据信号跨时钟域同步,该方案使用约束或参数将目标时钟域中单元指定为同步单元,如图1所示。 图1 同步单元方案…...
JAVA异常体系
在 Java 里,异常体系是其错误处理机制的核心内容,它能够帮助开发者有效应对程序运行时出现的各种意外状况。 异常体系的基本架构 它主要包含两个重要分支: Error(错误):这类异常是程序自身无法处理的严重…...
Milvus 视角看主流嵌入式模型(Embeddings)
嵌入是一种机器学习概念,用于将数据映射到高维空间,其中语义相似的数据被紧密排列在一起。嵌入模型通常是 BERT 或其他 Transformer 系列的深度神经网络,它能够有效地用一系列数字(称为向量)来表示文本、图像和其他数据…...
全面解析 Server-Sent Events(SSE)协议:从大模型流式输出到实时通信场景
全面解析 Server-Sent Events(SSE)协议:从大模型流式输出到实时通信场景 一、SSE 协议概述 Server-Sent Events(SSE) 是 HTML5 标准中定义的一种基于 HTTP 的服务器向客户端单向推送实时数据的协议。其核心特性包括&a…...
数据库系统概论|第七章:数据库设计—课程笔记
前言 本章讨论数据库设计的技术和方法,主要讨论基于关系数据库管理系统的关系数据库设计问题,而关于数据库的设计过程中,关于数据模型、关系模型等基本概念在前文中已经有详尽介绍,此处便不再赘述,本文主要围绕概念结…...
Java项目拷打(外卖+点评)
一、点评星球(黑马点评) 1、项目概述 1.1、项目简介 本项目是基于Spring Boot与Redis深度整合的前后端分离的点评平台。系统以Redis为核心技术支撑,重点解决高并发场景下的缓存穿透、击穿、雪崩等问题,涵盖商户展示、优惠券秒杀…...
MCP:开启AI的“万物互联”时代
MCP:开启AI的“万物互联”时代 ——从协议标准到生态革命的技术跃迁 引言:AI的“最后一公里”困境 在2025年的AI技术浪潮中,大模型已从参数竞赛转向应用落地之争。尽管模型能生成流畅的对话、创作诗歌甚至编写代码,但用户逐渐发现…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-D. 扩展插件列表(PostGIS/PostgREST等)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 附录D. PostgreSQL扩展插件速查表一、插件分类速查表二、核心插件详解三、安装与配置指南四、应用场景模板五、版本兼容性说明六、维护与优化建议七、官方资源与工具八、附录…...
Spring Boot拦截器详解:原理、实现与应用场景
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、拦截器概述 拦截器(Interceptor)是Spring MVC框架中用于对请求进行预处理和后处理的组件,主要作用于Controller层。相…...
万字解析:Java字符串
目录 一、 String类 1. String类的初始化 1.1 常用的三种构造String类的方式 1.2 String类如何存储字符串? 2. String类的常用功能方法 2.0 字符串长度的获取 2.1 String对象的比较 2.2 字符/字符串的查找 2.3 字符串的转化 2.4 字符 / 字符串的替换 2.5…...
0514得物、0509滴滴面试总结复盘
目前最欠缺的还是,编码不是很熟,很多都遇到过但是就是写不出来,或者靠背先写一点,然后去加,加的过程没考虑逻辑是不是对的,用滴滴面试官的一句话,就是多刷多练多编码! 第二块就是项目…...
记录算法笔记(20025.5.14)对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 提示: 树中节点数目…...
AI大模型从0到1记录学习 linux day23
第 1 章 MySQL概述 1.1 基本概念 1.1.1 数据库是什么? 数据库(DB:Database):存储数据的地方。 1.1.2 为什么要用数据库? 应用程序产生的数据是在内存中的,如果程序退出或者是断电了,…...
用git下载vcpkg时出现Connection was reset时的处理
用git安装vcpkg时出现Connect was rest(如上图)。多谢这位网友的博文解决了问题: 通过:http.sslVerify false全局来设置,执行以下命令: git config --global http.sslVerify "false" 原文链接:…...
【数据库复习】SQL语言
一、SQL通用语法与分类 (一)SQL通用语法 SQL语句的格式通常较为规范,以关键字开头,如CREATE、SELECT、INSERT等,后跟具体的表名、字段名和条件等。在MySQL中,还可以使用help命令获取帮助信息,…...
二叉树——层序遍历
目录 实现层序遍历 判断是否为完全二叉树 实现层序遍历 除了先序遍历,中序遍历,后序遍历外,还可以对二叉树进行层序遍历。设二叉树的结点所在层数为1,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点…...
Seata源码—2.seata-samples项目介绍
大纲 1.seata-samples的配置文件和启动类 2.seata-samples业务服务启动时的核心工作 3.seata-samples库存服务的连接池配置 4.Seata对数据库连接池代理配置的分析 5.Dubbo RPC通信过程中传递全局事务XID 6.Seata跟Dubbo整合的Filter(基于SPI机制) 7.seata-samples的AT事…...
企业数字化转型背景下的企业知识管理挑战与经验杂谈
一、引言 在数字化转型的浪潮下,企业知识管理正面临前所未有的挑战。随着数据量的急剧增长,企业内部积累的信息呈现出碎片化、分散化的趋势,传统的知识管理体系已难以有效应对这一变革。首先,信息碎片化问题日益严重,…...
第二章:磁盘管理与文件管理
一、磁盘管理 1.windows和Linux磁盘管理的区别 windows资源管理方式 系统一般安装在C盘 C盘下的"Windows"目录是操作系统的核心 C盘下的"Program Files"目录下安装软件 C盘下的"用户"目录是所有的用户,包括超级管理员也在其中 …...
Java版OA管理系统源码 手机版OA系统源码
Java版OA管理系统源码 手机版OA系统源码 一:OA系统的主要优势 1. 提升效率 减少纸质流程和重复性工作,自动化处理常规事务,缩短响应时间。 2. 降低成本 节省纸张、打印、通讯及人力成本,优化资源分配。 3. 规范管理 固化企…...
springboot踩坑记录
之前运行好端端的项目,今天下午打开只是添加了一个文件之后 再运行都报Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver class Action: Conside…...
SpringAI
机器学习: 定义:人工智能的子领域,通过数据驱动的方法让计算机学习规律,进行预测或决策。 核心方法: 监督学习(如线性回归、SVM)。 无监督学习(如聚类、降维)。 强化学…...
acwing 1488. 最短距离 超级源点 最短路 堆优化Dijkstra
经验总结 邻接表 节点1连接到节点2,权重为3。 节点1连接到节点3,权重为5。 节点2连接到节点4,权重为2。 g[1] {{2, 3}, {3, 5}} g[2] {{1, 3}, {4, 2}} g[3] {{1, 5}} g[4] {{2, 2}} vector<vector<PII>> g;题目背景 有 N…...
2002-2024年地级市新质生产力词频统计数据(46个关键词词频)
2002-2024年地级市新质生产力词频统计数据(46个关键词词频) 1、时间:2002-2024年 2、来源:ZF工作报告 3、指标:行政区划代码、年份、地区、所属省份、文本总长度、仅中英文-文本总长度、文本总词频-全模式、文本总词…...
院校机试刷题第二天:1479 01字符串、1701非素数个数
一、1479 01字符串 1.题目描述 2.解题思路 方法一:暴力法 模拟过程,列出几个数据来a[1]1, a[2]2, a[3]3, a[4]5以此类推,这就是斐波那契数列,每一项都等于前两项之和,确定好a[1], a[2]即可。 方法二:动…...
2011-2019年各省总抚养比数据
2011-2019年各省总抚养比数据 1、时间:2011-2019年 2、来源:国家统计局 3、指标:行政区划代码、地区、年份、总抚养比(人口抽样调查)(%) 4、范围:31省 5、指标解释:总抚养比也称总负担系数。指人口总体中非劳动年…...
3337|3335. 字符串转换后的长度 I(||)
1.字符串转换后的长度 I 1.1题目 3335. 字符串转换后的长度 I - 力扣(LeetCode) 1.2解析 递推法解析 思路框架 我们可以通过定义状态变量来追踪每次转换后各字符的数量变化。具体地,定义状态函数 f(i,c) 表示经过 i 次转换后࿰…...
【电路笔记 通信】8B/10B编码 高速数据传输的串行数据编码技术 论文第三部分 The 8B/10B coding map
0810逻辑总览 The 8B/10B coding map 图 1 展示了一个通信适配器接口,它由八条数据线 A、B、C、D、E、F、G、H(注意:使用大写字母表示)、一条控制线 K,以及一条以字节速率运行的时钟线 BYTECLK 组成。控制线 K 用于指…...
智能化双语LaTeX系统,分阶段系统性开发技术实现路径:目标是实现语义级编译和认知增强写作,推动跨文明知识表达
智能化双语LaTeX系统,分阶段系统性开发技术实现路径(D认为W可辅助各环节开发): 第一阶段:双语LaTeX引擎升级 1. 核心架构设计 Unicode深度支持 开发新一代XeLaTeX/LuaLaTeX内核 原生支持UTF-8编码(如汉…...
【RabbitMQ】路由模式和通配符模式的具体实现
文章目录 路由模式创建队列和交换机生产者代码创建交换机声明队列绑定交换机和队列发送消息完整代码 消费者代码运行程序启动生产者启动消费者 通配符模式创建队列和交换机生产者代码创建交换机声明队列绑定交换机和队列发送消息完整代码 消费者代码运行程序启动生产者启动消费…...
【测试开发知识储备】之Jacoco(Java Code Coverage)
文章目录 Jacoco是什么Jacoco的主要功能(一)多样化覆盖率指标分析(二) 丰富的报告生成(三)实时数据收集 Jacoco的工作原理(一)字节码增强(二)测试执行与数据收…...
大二java第一面小厂(挂)
第一场: mybatis怎么防止数据转义。 Hutool用的那些你常用的方法。 springboot的常用注解。 redis的多级缓存。 websocket怎么实现的多人协作编辑功能。 怎么实现的分库分表。 mysql里面的各种操作,比如说分表怎么分,分页查询怎么用。 mybat…...
Postman接口测试
现在企业级测试分为三层测试 UI层:即与用户交互的层面 Service层:比如前后端分离的系统,测试数据的传输 Unit层:单元测试 接口 接口的概念很抽象,比如我们经常使用的USB接口,Lighting接口等传输电量数据…...
试除法判断素数优化【C语言】
代码引用 int is_prime(int num) {if (num < 1) return 0;if (num 2 || num 3) return 1;if (num % 2 0 || num % 3 0) return 0;for (int i 5; i * i < num; i 6) {if (num % i 0 || num % (i 2) 0) return 0;}return 1; } 一、数学原理 所有大于3的素数都可…...
全新开发-iVX图形化编程VS完整IDE
本文针对传统软件开发的效率与可控性矛盾,系统阐释 iVX"图形化编程 全栈 IDE" 的复合架构如何突破行业瓶颈。通过 "可视化建模 - 标准代码生成 - 独立运行" 的技术闭环,iVX 实现开发效率提升 60% 与源码完全可控的双重目标。研究揭…...
前端表格滑动滚动条太费事,做个浮动滑动插件
比如下面的表格,因为滚动条样式设计得很窄,所以用鼠标滑动起来很费劲 <template><el-table:data"tableData"style"width: 600px"height"250"><el-table-columnfixedprop"date"label"日期&…...
基于自校准分数的扩散模型在并行磁共振成像中联合进行线圈灵敏度校正和运动校正|文献速递-深度学习医疗AI最新文献
Title 题目 Joint coil sensitivity and motion correction in parallel MRI with aself-calibrating score-based diffusion model 基于自校准分数的扩散模型在并行磁共振成像中联合进行线圈灵敏度校正和运动校正 01 文献速递介绍 磁共振成像(MRI)…...
【CUDA】Sgemm单精度矩阵乘法(上)
目录 前言1. 简述2. 框架搭建和CPU串行实现3. baseline算法:global memory4. 优化技巧1:shared memory5. 优化技巧2:shared memory sliding window6. 优化技巧3:增加每个线程的工作量7. 优化技巧4:使用float4提高读取…...
Linux proc文件系统 内存影射
文章目录 常见的内存分配函数/proc/pid/ 目录解析 用户进程的内存空间分配算法mmap 分配大内存可能不在堆中换为 malloc 现象相同 常见的内存分配函数 malloc / calloc / realloc(来自 C 标准库) void *malloc(size_t size):分配 size 字节…...
服务器时间发生跳变导致hghac中对应主机状态频繁切换为crash或stop
文章目录 环境症状问题原因解决方案相关文档报错编码 环境 系统平台:N/A 版本:N/A 症状 集群状态: [rootbthbj-hgywsjkjq-ip28-cen76 ~]# hghactl list Cluster: highgo-ee-cluster —---------------------—---------- | Member | Ho…...
“智”造升级:金众诚如何赋能重型机械企业高效项目管理?
据悉,由中国重型机械工业协会主办的2025中国(郑州)重型机械装备展览会(以下简称:重型机械装备展),将于2025年10月15-17日在河南省郑州市中原国际会展中心隆重举办。 作为中国重型机械行业唯一的…...
反向操作:如何用AI检测工具优化自己的论文“人味”?
大家好,这里是论文写手的一线自救指南😤 在AIGC横行的今天,谁还没偷偷用过AI写几段论文内容?但问题来了:学校越来越会“识AI”了! 有的学校甚至不看重复率,只盯AIGC率报告,一句“AI…...
前端面试宝典---js垃圾回收机制
什么是垃圾回收 垃圾回收是指一种自动内存管理机制,当声明一个变量时,会在内存中开辟一块内存空间用于存放这个变量。当这个变量被使用过后,可能再也不需要它了,此时垃圾回收器会自动检测并回收这些不再使用的内存空间。垃圾回收…...
【docker】--容器管理
文章目录 容器重启--restart 参数选项及作用**对比 always 和 unless-stopped****如何查看容器的重启策略?** 容器重启 –restart 参数选项及作用 重启策略 no:不重启(默认)。on-failure:失败时重启(可限…...
如何下载和安装 Ghost Spectre Windows 11 24H2 PRO
如何下载和安装 Ghost Spectre Windows 11 24H2 PRO 我们都希望拥有一台运行速度飞快的电脑系统,但对于那些使用普通硬件的用户来说,这并不总是可能的。所以,如果你觉得你的 Windows 11 电脑运行缓慢,你并不孤单。许多用户,包括 Reddit 和 YouTube 上的技术爱好者,都在放…...
软考软件设计师中级——软件工程笔记
1.软件过程 1.1能力成熟度模型(CMM) 软件能力成熟度模型(CMM)将软件过程改进分为以下五个成熟度级别,每个级别都定义了特定的过程特征和目标: 初始级 (Initial): 软件开发过程杂乱无章…...
有关多线程
一、多线程到底是什么?简单说一说 你可以把程序想象成一台工厂。单线程就是工厂里只有一个员工,他做事情、搬产品、打包都靠一个人,他忙起来速度会慢一些。而多线程就像有多个员工同时工作,他们各自干自己的事情,整体…...
静电的起因与静电效应:技术分析与应用
杭州干扰净电子科技有限公司出品: 静电(Electrostatics)是由于电荷积累或转移引起的现象,广泛存在于日常生活和工业环境中。静电的起因主要包括接触起电、摩擦起电和感应起电,而其效应可能引发静电放电(ES…...
Python知识框架
一、Python基础语法 变量与数据类型 变量命名规则 基本类型:int, float, str, bool, None 复合类型:list, tuple, dict, set 类型转换与检查(type(), isinstance()) 运算符 算术运算符:, -, *, /, //, %, ** 比较…...