C# Winform+Halcon结合标准视觉工具
介绍+
winform与halcon结合标准化工具实例
软件架构
软件架构说明 基于NET6 WINFORM+HALCON
实现标准化视觉检测工具
集成相机通讯
集成PLC通讯
TCP等常见通讯
支持常见halcon算子
- 图形采集
- blob分析
- 高精度匹配
- 颜色提取
- 找几何体
- 二维码提取
- OCR识别
- 等等

。。。

安装教程
https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0
使用说明
安装 NET6 SDK,编译即可运行
对入门的同学应该有较好的学习意义
本项目涵盖了标准化视觉检测工具的大部分功能,有兴趣的小伙伴可以请我吃一顿肯德基,获取源码进行学习。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using HalconDotNet;
using MT_OCR5._0;
using PaddleOCRSharp;
namespace Vision.Winform.Algorithm
{ //识别各种二维码,一维码, 字符识别
namespace MT_code
{
public class QR
{
public ToolPar toolPar = new ToolPar();
public bool status = true;
internal HObject image = null;
//二维码识别句柄
internal HTuple modelID = null;
public string CodeType = "QR Code";
public string ParamName = "default_parameters";
public string ParamValue = "standard_recognition";
private void creathandle()
{
try
{
switch (toolPar.RunPar.QrMode)
{
case QrMode.QR:
CodeType = "QR Code";
break;
case QrMode.DM:
CodeType = "Data Matrix ECC 200";
break;
}
switch (toolPar.RunPar.QrRecognition)
{
case QRRecognition.standard_recognition:
ParamValue = "standard_recognition";
break;
case QRRecognition.enhanced_recognition:
ParamValue = "enhanced_recognition";
break;
case QRRecognition.maximum_recognition:
ParamValue = "maximum_recognition";
break;
}
if(modelID == null)
{
HOperatorSet.CreateDataCode2dModel((HTuple)CodeType, (HTuple)ParamName, (HTuple)ParamValue, out modelID);
}
}
catch (Exception)
{
status = false;
}
//return 0;
}
private void clearhandle()
{
HOperatorSet.ClearDataCode2dModel(modelID);
}
public void run()
{
creathandle();
try
{
toolPar.ResultPar.CodeResult = new List<BarcodeResult>();
if (modelID == null)
{
status = false;
return;
}
if (toolPar.InputPar.图像 != null)
{
if (toolPar.InputPar.ROI != null)
{
HOperatorSet.ReduceDomain(toolPar.InputPar.图像, toolPar.InputPar.ROI, out image);
}
else
{
image = toolPar.InputPar.图像;
}
//设置极性
string codePolarity= "dark_on_light";
switch (toolPar.RunPar.CodePolarity)
{
case CodePolarity.any: codePolarity = "any"; break;
case CodePolarity.positive: codePolarity = "dark_on_light"; break;
case CodePolarity.negative: codePolarity = "light_on_dark"; break;
}
HOperatorSet.SetDataCode2dParam(modelID, "polarity", codePolarity);
HOperatorSet.SetDataCode2dParam(modelID, "timeout", toolPar.RunPar.TimeOut);
HObject xlds;
HTuple strtmp, resultHandles;
HOperatorSet.FindDataCode2d(image,
out xlds,
modelID,
"stop_after_result_num", toolPar.RunPar.CodeNum,
out resultHandles,
out strtmp);
//把结果塞进去
for (int i = 0; i < strtmp.Length; i++)
{
BarcodeResult tmp;
HObject region;
HOperatorSet.GenRegionContourXld(xlds, out region, "filled");
tmp.region = region;
tmp.code = strtmp[i].S;
toolPar.ResultPar.CodeResult.Add(tmp);
}
toolPar.ResultPar.CodeNum = strtmp.Length;
//HOperatorSet.clear
}
else
{
status = false;
return;
}
}
catch (Exception)
{
clearhandle();
status = false;
}
clearhandle();
}
[Serializable]
public class ToolPar : ToolParBase
{
private InputPar _inputPar = new InputPar();
public InputPar InputPar
{
get { return _inputPar; }
set { _inputPar = value; }
}
private RunPar _runPar = new RunPar();
public RunPar RunPar
{
get { return _runPar; }
set { _runPar = value; }
}
private ResultPar _resultPar = new ResultPar();
public ResultPar ResultPar
{
get { return _resultPar; }
set { _resultPar = value; }
}
}
[Serializable]
public class InputPar
{
private HObject _图像;
public HObject 图像
{
get { return _图像; }
set { _图像 = value; }
}
private HObject _ROI;
public HObject ROI
{
get { return _ROI; }
set { _ROI = value; }
}
private HObject _屏蔽区域;
public HObject 屏蔽区域
{
get { return _屏蔽区域; }
set { _屏蔽区域 = value; }
}
public int FindCodeNum { set; get; } = 1;
}
[Serializable]
public class RunPar
{
public QRRecognition QrRecognition { get; set; }
public QrMode QrMode { get; set; }
public CodePolarity CodePolarity { get; set; }
public int TimeOut { get; set; }
public int CodeNum { get; set; }
}
[Serializable]
public class ResultPar
{
private List<BarcodeResult> _CodeResult;
public List<BarcodeResult> CodeResult
{
get { return _CodeResult; }
set { _CodeResult = value; }
}
private int _CodeNum;
public int CodeNum
{
get { return _CodeNum; }
set { _CodeNum = value; }
}
}
}
public class One_dimension
{
public ToolPar toolPar = new ToolPar();
public bool status = true;
internal HObject image = null;
//条形码识别句柄
internal HTuple modelID = null;
internal HTuple codetype = "auto";
private void creathandle()
{
try
{
HOperatorSet.CreateBarCodeModel(new HTuple(), new HTuple(), out modelID);
}
catch (Exception)
{
status = false;
}
//return 0;
}
private void clearhandle()
{
HOperatorSet.ClearBarCodeModel(modelID);
}
public void run()
{
creathandle();
toolPar.ResultPar.CodeResult = new List<BarcodeResult>();
try
{
if (modelID == null)
{
status = false;
return;
}
if (toolPar.InputPar.图像 != null)
{
if (toolPar.InputPar.ROI != null)
{
HOperatorSet.ReduceDomain(toolPar.InputPar.图像, toolPar.InputPar.ROI, out image);
}
else
{
image = toolPar.InputPar.图像;
}
HObject region;
HTuple strtmp;
HOperatorSet.SetBarCodeParam(modelID, "timeout", toolPar.RunPar.TimeOut);
HOperatorSet.SetBarCodeParam(modelID, "stop_after_result_num", toolPar.RunPar.CodeNum);
设置极性
//string codePolarity = "dark_on_light";
//switch (toolPar.RunPar.CodePolarity)
//{
// case CodePolarity.any: codePolarity = "any"; break;
// case CodePolarity.positive: codePolarity = "dark_on_light"; break;
// case CodePolarity.negative: codePolarity = "light_on_dark"; break;
//}
//HOperatorSet.SetBarCodeParam(modelID, "polarity", codePolarity);
HOperatorSet.FindBarCode(image, out region, modelID, codetype, out strtmp);
//把结果塞进去
for (int i = 0; i < strtmp.Length; i++)
{
BarcodeResult tmp;
tmp.region = region;
tmp.code = strtmp[i].S;
toolPar.ResultPar.CodeResult.Add(tmp);
}
toolPar.ResultPar.CodeNum = strtmp.Length;
//HOperatorSet.clear
}
else
{
status = false;
return;
}
}
catch (Exception)
{
clearhandle();
status = false;
}
clearhandle();
}
[Serializable]
public class ToolPar : ToolParBase
{
private InputPar _inputPar = new InputPar();
public InputPar InputPar
{
get { return _inputPar; }
set { _inputPar = value; }
}
private RunPar _runPar = new RunPar();
public RunPar RunPar
{
get { return _runPar; }
set { _runPar = value; }
}
private ResultPar _resultPar = new ResultPar();
public ResultPar ResultPar
{
get { return _resultPar; }
set { _resultPar = value; }
}
}
[Serializable]
public class InputPar
{
private HObject _图像;
public HObject 图像
{
get { return _图像; }
set { _图像 = value; }
}
private HObject _ROI;
public HObject ROI
{
get { return _ROI; }
set { _ROI = value; }
}
private HObject _屏蔽区域;
public HObject 屏蔽区域
{
get { return _屏蔽区域; }
set { _屏蔽区域 = value; }
}
}
[Serializable]
public class RunPar
{
//public BarRecognition BarRecognition { get; set; }
public BarMode BarMode { get; set; }
public CodePolarity CodePolarity { get; set; }
public int TimeOut { get; set; }
public int CodeNum { get; set; }
}
[Serializable]
public class ResultPar
{
private List<BarcodeResult> _CodeResult;
public List<BarcodeResult> CodeResult
{
get { return _CodeResult; }
set { _CodeResult = value; }
}
private int _CodeNum;
public int CodeNum
{
get { return _CodeNum; }
set { _CodeNum = value; }
}
}
}
public class OCR
{
public ToolPar toolPar = new ToolPar();
public bool status = true;
internal HObject image = null;
RunPar runPar=new RunPar ();
public void run()
{
try
{
if (toolPar.InputPar.图像 != null)
{
if (toolPar.InputPar.ROI != null && toolPar.InputPar.屏蔽区域 != null)
{
HObject reduce_region = new HObject();
reduce_region.Dispose();
HOperatorSet.Difference(toolPar.InputPar.ROI, toolPar.InputPar.屏蔽区域, out reduce_region);
//image.Dispose();
HOperatorSet.ReduceDomain(toolPar.InputPar.图像, reduce_region, out image);
HOperatorSet.CropDomain(image, out image);
reduce_region.Dispose();
}
else if (toolPar.InputPar.ROI != null && toolPar.InputPar.屏蔽区域 == null)
{
HOperatorSet.GenEmptyObj(out image);
HOperatorSet.ReduceDomain(toolPar.InputPar.图像, toolPar.InputPar.ROI, out image);
HOperatorSet.CropDomain(image, out image);
}
else if (toolPar.InputPar.ROI == null && toolPar.InputPar.屏蔽区域 != null)
{
HObject reduce_region = new HObject();
reduce_region.Dispose();
HOperatorSet.Difference(toolPar.InputPar.图像, toolPar.InputPar.屏蔽区域, out reduce_region);
//image.Dispose();
HOperatorSet.ReduceDomain(toolPar.InputPar.图像, reduce_region, out image);
HOperatorSet.CropDomain(image, out image);
reduce_region.Dispose();
}
else
{
if (image != null)
image.Dispose();
image = toolPar.InputPar.图像;
}
}
else
{
status = false;
return;
}
//初始化
//ocr_engine.OCR_INIT();
//HObject img;
//HOperatorSet.GenEmptyObj(out img);
//img = image;
检测
//string ocr_result = ocr_engine.OCR_Dect(img);
//ocr_engine.engine.Dispose();
//toolPar.ResultPar.OCRResult = ocr_result;
//ocr_result = String.Empty;
HOperatorSet.CountChannels(image, out var channels);
Bitmap img;
HObject multiChannelImage;
HOperatorSet.GenEmptyObj(out multiChannelImage);
if (channels == 3)
{
img=runPar.Honject2Bitmap24(image);
}
else
{
HOperatorSet.Compose3(image, image, image, out multiChannelImage);
img = runPar.Honject2Bitmap24(multiChannelImage);
}
runPar.ocrResult= runPar.engine.DetectText(img);
toolPar.ResultPar.OCRResult = runPar.ocrResult.Text;
}
catch (Exception)
{
status = false;
}
}
[Serializable]
public class ToolPar : ToolParBase
{
private InputPar _inputPar = new InputPar();
public InputPar InputPar
{
get { return _inputPar; }
set { _inputPar = value; }
}
private RunPar _runPar = new RunPar();
public RunPar RunPar
{
get { return _runPar; }
set { _runPar = value; }
}
private ResultPar _resultPar = new ResultPar();
public ResultPar ResultPar
{
get { return _resultPar; }
set { _resultPar = value; }
}
}
[Serializable]
public class InputPar
{
private HObject _图像;
public HObject 图像
{
get { return _图像; }
set { _图像 = value; }
}
private HObject _ROI;
public HObject ROI
{
get { return _ROI; }
set { _ROI = value; }
}
private HObject _屏蔽区域;
public HObject 屏蔽区域
{
get { return _屏蔽区域; }
set { _屏蔽区域 = value; }
}
}
[Serializable]
public class RunPar
{
public OCRModelConfig config = null;
public OCRParameter oCRParameter = new OCRParameter();
public OCRResult ocrResult = new OCRResult();
public PaddleOCREngine engine;
public RunPar()
{
engine = new PaddleOCREngine(config, oCRParameter);
}
[DllImport("kernel32.dll")]
public static extern void CopyMemory(int Destination, int add, int Length);
public Bitmap Honject2Bitmap24(HObject hObject)
{
HTuple width = new HTuple();
HTuple height = new HTuple();
HTuple pointer = new HTuple();
HTuple type = new HTuple();
HTuple width2 = new HTuple();
HTuple height2 = new HTuple();
HObject interleavedImage = new HObject();
HOperatorSet.GetImageSize(hObject, out width, out height);
HOperatorSet.InterleaveChannels(hObject, out interleavedImage, "rgb", 4 * width, 0);
HOperatorSet.GetImagePointer1(interleavedImage, out pointer, out type, out width2, out height2);
IntPtr scan = pointer;
return new Bitmap(width2 / 4, height2, width2, PixelFormat.Format24bppRgb, scan);
}
public void HObject2Bitmap8(HObject image, out Bitmap res)
{
HOperatorSet.GetImagePointer1(image, out var pointer, out var _, out var width, out var height);
res = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
ColorPalette palette = res.Palette;
for (int i = 0; i <= 255; i++)
{
palette.Entries[i] = Color.FromArgb(255, i, i, i);
}
res.Palette = palette;
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, width, height);
BitmapData bitmapData = res.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
int num = Image.GetPixelFormatSize(bitmapData.PixelFormat) / 8;
IntPtr scan = bitmapData.Scan0;
IntPtr source = pointer;
int num2 = width * height;
byte[] array = new byte[num2];
Marshal.Copy(source, array, 0, num2);
Marshal.Copy(array, 0, scan, num2);
res.UnlockBits(bitmapData);
}
}
[Serializable]
public class ResultPar
{
private string _OCRResult { get; set; }
public string OCRResult { get { return _OCRResult; } set { _OCRResult = value; } }
}
}
}
}
相关文章:
C# Winform+Halcon结合标准视觉工具
介绍 winform与halcon结合标准化工具实例 软件架构 软件架构说明 基于NET6 WINFORMHALCON 实现标准化视觉检测工具 集成相机通讯 集成PLC通讯 TCP等常见通讯 支持常见halcon算子 图形采集blob分析高精度匹配颜色提取找几何体二维码提取OCR识别等等 。。。 安装教程 …...
英语单词量测试
网址:https://preply.com/en/learn/english/test-your-vocab 测试结果: 细节:英语母语者有20000-35000个单词的词汇量,8岁孩子的词汇量在8000个左右。而不是我们教育系统里说的,6000个单词足够用了。足够用࿰…...
三、安装node_exporter
目录 一、简介 二、下载安装 一、简介 Exporter是Prometheus的指标数据收集组件。它负责从目标Jobs收集数据,并把收集到的数据转换为Prometheus支持的时序数据格式。 和传统的指标数据收集组件不同的是,他只负责收集,并不向Server端发送数据…...
kafka基础知识
kafka架构 producer -> kafka cluster(broker>topic>partition) -> consumer -> zookeeper kafka压测 kafka-producer-perf-test.sh kafka-consumer-perf-test.sh kafka日志保存位置及消息保存时间 /tpdata/client/Kafka/kafka/config/server.properties log.…...
华为昇腾310B1平台视频解码失败[ERROR] Send frame to vdec failed, errorno:507018
目录 1 [ERROR] Send frame to vdec failed, errorno:507018 2 bug解决尝试1 3 bug解决尝试2 4 最终解决方法 参考文献: 1 [ERROR] Send frame to vdec failed, errorno:507018 某项目中的代码运行报错 [ERROR] Send frame to vdec failed, errorno:507018 Ac…...
Flutter 中的 SwitchListTile 小部件:全面指南
Flutter 中的 SwitchListTile 小部件:全面指南 在Flutter的Material组件库中,SwitchListTile是一个包含开关(Switch)的列表项,非常适合用来创建带有标题、副标题以及开关的列表项,常用于设置界面ÿ…...
详细分析Vue3中的defineExpose(附Demo)
目录 前言1. 基本知识2. Demo3. 实战 前言 其基本知识可参考官网:Vue3中的defineExpose 1. 基本知识 defineExpose 是 Vue 3 的 Composition API 中一个新的实用函数,用于在 <script setup> 语法下显式暴露组件的公共属性和方法 这在处理子组件…...
合合信息:TextIn文档解析技术与高精度文本向量化模型再加速
文章目录 前言现有大模型文档解析问题表格无法解析无法按照阅读顺序解析文档编码错误 诉求文档解析技术技术难点技术架构关键技术回根溯源 文本向量化模型结语 前言 随着人工智能技术的持续演进,大语言模型在我们日常生活中正逐渐占据举足轻重的地位。大模型语言通…...
Git与Gitlab
第1章Git概述 Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。 代码托管中心,记录每个版本的代码,从项目创建到现在使用的代码,中间所有的修改都有记录。 1. 何为版本控制 版本控制是…...
MySQL数据库从入门到精通(下)
对表做了修改之后,记得点击对应图标按钮重新执行一下。 1.创建角色表 数据库一开始就要设计好,轻易不要改动。一个账号下可能有多个角色,所以我们单独再创建另一个表role用来存储所有的角色信息。其中idrole表示角色id,name表示名…...
从融媒到智媒,小程序框架可助力传媒企业在AI实践下的服务变现
过去5年,媒体行业一直都在进行着信息化建设向融媒体平台建设的转变。一些融媒体的建设演变总结如下: 新闻终端的端侧内容矩阵建设,如App新闻端,社交平台上的官方媒体等 新闻本地生活双旗舰客户端,兼顾主流媒体核心宣传…...
MES系统在电线电缆行业生产上的应用
MES系统在线缆行业的应用可以带来多重价值,包括提高生产效率、降低生产成本、提高产品质量、优化库存管理、改善生产环境和提高企业竞争力等方面。因此,在电线电缆行业中广泛应用MES系统可以提高企业的经济效益和社会效益,推动企业发展和行业…...
怎么把图片上的字去掉
将图片上的字去掉通常需要使用图像编辑软件或在线工具。以下是一些常用的方法和步骤: 使用Adobe Photoshop: 打开Photoshop,导入需要编辑的图片。 选择“橡皮擦工具”或“克隆图章工具”。 如果使用“橡皮擦工具”,调整橡皮擦的…...
BFS和DFS优先搜索算法
1. BFS与DFS 1.1 BFS DFS即Depth First Search,深度优先搜索。它是一种图遍历算法,它从一个起始点开始,逐层扩展搜索范围,直到找到目标节点为止。 这种算法通常用于解决“最短路径”问题,比如在迷宫中找到从起点到终…...
python将两张图片对齐
目录 需要对齐的照片如下: 源码: 结果: 需要对齐的照片如下: 源码: import cv2 import numpy as np from matplotlib import pyplot as plt# 读取两张图片 imgA cv2.imread(./out/out/3.png) imgB cv2.imread(./…...
Linux修炼之路之初识操作系统+基础指令(1)
目录 引言 一:对操作系统(OS)的简单了解 1.操作系统(OS) 是什么 2.操作系统好坏的衡量标准 3.操作系统存在的重要性 4.理解所有在计算机上的操作 二:Linux与windows操作的特点区别 三:基础指令 1.ls 指令 1.使用 2.常用选项 2.…...
Flink中基于Chandy-Lamport算法的分布式快照实现详解
Apache Flink利用了一种基于Chandy-Lamport分布式快照算法的变体——异步屏障快照(Asynchronous Barrier Snapshotting, ABS)来实现其强大的容错机制。Chandy-Lamport算法最初由K.M. Chandy和Leslie Lamport于1985年提出,是一种用于分布式系统…...
软件3班20240513
java.util.PropertyResourceBundle4554617c package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) throws SQLException { // 获取属性配置文件ResourceBundle bundle Res…...
【小程序】怎么优化小程序的性能
优化小程序的性能是提高用户体验和确保应用顺畅运行的关键。以下是一些优化小程序性能的方法: 1. 代码优化2. 图片优化3. 网络请求优化4. 页面渲染优化5. 分包加载6. 使用性能分析工具7. 后端优化8. 用户体验优化 1. 代码优化 精简代码:删除不必要的代码…...
告别信用卡绑定烦恼:探索这个全功能的Azure语音替代品,包含AI视频制作!(微软Azure语音替代方案)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 语音合成的替代方案📝 功能特色📝 使用步骤示例⚓️ 相关链接 ⚓️📖 介绍 📖 虽然微软Azure语音服务为个人用户提供了充足的免费语音合成额度,但其注册过程中的信用卡绑定要求、繁琐的API配置步骤却…...
Pixel Epic应用场景:律所尽调报告辅助生成+法律条文精准引用案例
Pixel Epic应用场景:律所尽调报告辅助生成法律条文精准引用案例 1. 法律行业的数字化挑战 法律尽职调查是并购交易、股权投资等商业活动中的关键环节。传统模式下,律师团队需要: 人工查阅数百页企业资料逐条核对法律法规手工编写数十页的尽…...
FlowState Lab 日志分析与性能调优实战
FlowState Lab 日志分析与性能调优实战 1. 为什么需要关注模型服务性能 当你把FlowState Lab模型部署上线后,可能会遇到这样的情况:请求量一大,响应就开始变慢,甚至出现超时。这时候就需要关注服务的性能表现。性能调优不是玄学…...
千问3.5-2B参数详解教程:max_new_tokens=192与temperature=0.7如何影响图文理解质量
千问3.5-2B参数详解教程:max_new_tokens192与temperature0.7如何影响图文理解质量 1. 认识千问3.5-2B视觉语言模型 千问3.5-2B是Qwen系列中的小型视觉语言模型,它能够同时理解图片内容和生成文本回答。这个模型特别适合需要结合视觉和语言理解的任务场…...
千问3.5-9B模型切换指南:OpenClaw多模型动态调用
千问3.5-9B模型切换指南:OpenClaw多模型动态调用 1. 为什么需要多模型动态调用 上周我尝试用OpenClaw自动整理电脑里积压的300多份PDF文档时,遇到了一个有趣的现象:处理简单文件重命名任务时,轻量级模型响应飞快;但遇…...
Tencent Hunyuan3D-1.0模型蒸馏实践:从std版本压缩出移动端可用的轻量模型
Tencent Hunyuan3D-1.0模型蒸馏实践:从std版本压缩出移动端可用的轻量模型 【免费下载链接】Hunyuan3D-1 腾讯开源的Hunyuan3D-1项目,创新提出两阶段3D生成方法,实现快速、高质量的文本到3D和图像到3D转换,融合Hunyuan-DiT模型&am…...
PyTorch 2.8镜像实操手册:Git+vim+htop+screen开发运维一体化工作流
PyTorch 2.8镜像实操手册:Gitvimhtopscreen开发运维一体化工作流 1. 镜像概述与环境准备 PyTorch 2.8深度学习镜像是一个为专业开发者打造的全功能工作环境,基于RTX 4090D 24GB显卡和CUDA 12.4进行了深度优化。这个镜像不仅预装了最新版的PyTorch框架&…...
OpenClaw多语言支持:Qwen2.5-VL-7B跨语种图文处理技巧
OpenClaw多语言支持:Qwen2.5-VL-7B跨语种图文处理技巧 1. 为什么需要多语言图文处理 上周我收到一份混合了英文技术文档和中文注释的项目资料,需要整理成统一格式的双语对照版本。手动复制粘贴到翻译工具再调整排版,花了我整整三个小时。这…...
2026年4月怎么搭建OpenClaw?腾讯云小白1分钟部署及百炼APIKey配置步骤
2026年4月怎么搭建OpenClaw?腾讯云小白1分钟部署及百炼APIKey配置步骤。OpenClaw(原Clawdbot)作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现724小时稳定运行,并快速接入钉钉,让AI在企业群聊…...
Windows 11下Keil5 MDK与C51共存安装全攻略(附ST-Link驱动避坑指南)
Windows 11下Keil5 MDK与C51共存安装全攻略(附ST-Link驱动避坑指南) 在嵌入式开发领域,Keil作为经典开发工具链,其MDK(Microcontroller Development Kit)和C51版本分别服务于ARM架构和8051架构单片机开发。…...
Kandinsky-5.0-I2V-Lite-5s代码实例:Python调用API与前端交互实操解析
Kandinsky-5.0-I2V-Lite-5s代码实例:Python调用API与前端交互实操解析 1. 模型简介与核心能力 Kandinsky-5.0-I2V-Lite-5s是一款轻量级图生视频模型,它能够将静态图片转化为动态视频内容。只需提供一张首帧图片和简单的运动描述,模型就能生…...
