Balser相机+C#上位机图像采集实战:解决连得上拿不到图问题
简介本资源是一套基于C#开发的工业视觉图像采集系统源码面向自动化、机器视觉方向的中高级开发者及高校相关专业学生解决Balser工业相机与VisionPro视觉平台协同集成的实际工程问题。资源包共44个文件含6个核心C#源码文件如Form1.cs、Program.cs、4个可执行程序exe、3个动态链接库dll及配套配置文件config、资源文件resources和Visual Studio项目文件sln、csproj完整呈现从相机初始化、参数配置、实时图像捕获到VisionPro算法调用的全流程实现压缩包仅158KB轻量但结构完备。已有449人学习下载适合希望掌握硬件SDK与商业视觉软件深度集成方法的实践者——不仅提供可直接编译运行的工程框架还内含UI界面设计ico、resx、调试支持pdb、日志升级记录UpgradeLog.XML等典型工业项目要素是理解C#环境下多工具链协同开发的优质参考案例。1. Balser工业相机VisionPro视觉软件为什么C#上位机图像采集总卡在“连得上却拿不到图”你手头有一台Balser工业相机配套VisionPro软件能跑通标定、定位、测量——但一到用C#写上位机做实时图像采集就掉进“设备枚举成功、连接返回true、GetImage()永远超时或返回空指针”的黑匣子。这不是个别现象在产线首件引导定位、AOI缺陷复检、多工位协同抓取等场景中90%以上的翻车点不在算法逻辑而在SDK层的资源生命周期管理、线程上下文绑定和VisionPro底层图像缓冲区的同步机制。本篇不讲VisionPro脚本怎么写也不堆砌C#泛型委托语法只聚焦一个硬核目标用Balser官方SDK VisionPro Runtime在C# WinForms/WPF项目中稳定拉取原始图像帧非VisionPro处理后结果支持100fps内连续采集、零丢帧、可直接喂入OpenCV或YOLOv8预处理管道。适合正在做机器视觉上位机集成的工程师、自动化产线调试员、以及被“VisionPro能用但C#调不通”折磨超过3天的开发者。所有代码基于.NET 6、VisionPro 10.2、Balser SDK v3.4.0实测通过不依赖任何第三方封装库。2. 环境准备与SDK链路选型为什么必须用Balser原厂SDK而非DirectShow或GenICam通用层VisionPro本身提供两种图像接入路径一是通过其内置的AcqDevice如Balser、Basler、FLIR等厂商驱动已预集成二是通过外部图像源External Image Source以共享内存或Socket方式注入。而标题中的“SDKVisionPro”组合特指Balser原厂SDK负责硬件级图像拉取VisionPro仅作为图像处理引擎调用原始帧——这种分工规避了VisionPro AcqDevice对特定固件版本的强耦合也绕开了GenICam在Windows Server环境下的权限陷阱。下面分三步确认你的链路是否合规2.1 验证Balser SDK安装完整性与运行时依赖Balser SDK安装包如Balser_SDK_v3.4.0_Win10_x64.exe必须完成以下三项注册BslApi.dll、BslUsb3Vision.dll等核心动态库已复制至C:\Program Files\Balser\SDK\Bin\x64\系统PATH环境变量包含该路径重启CMD后执行where BslApi.dll应返回路径关键检查项运行C:\Program Files\Balser\SDK\Tools\BslViewer.exe能识别相机、调节曝光/增益、实时预览——若此处失败C#调用必然失败无需继续。提示Balser SDK v3.4.0起强制要求Windows 10 20H2且禁用Windows Defender实时防护尤其对BslUsb3Vision.dll的误报拦截。若BslViewer启动报错“无法加载DLL”请先关闭Defender并重新注册cd C:\Program Files\Balser\SDK\Bin\x64 regsvr32 /u BslUsb3Vision.dll regsvr32 BslUsb3Vision.dll2.2 VisionPro Runtime版本与C#项目Target Framework对齐VisionPro 10.2 的C# APICognex.VisionPro.*.dll仅支持.NET Framework 4.7.2 或 .NET 6严禁混用.NET Core 3.1或.NET 5。实测发现若C#项目Target为.NET 6.0需引用Cognex.VisionPro.ImageProcessing.dll非Cognex.VisionPro.dll主库若Target为.NET Framework 4.8则必须使用Cognex.VisionPro.dllv10.2.0.0文件属性校验MD5a7e9c2f1d8b4e5a6c7b8d9e0f1a2b3c4在Visual Studio中右键项目 → “属性” → “目标框架”确认无误后通过NuGet安装Cognex.VisionPro包注意不要勾选“包含预发行版”v10.2.0是当前稳定版。2.3 C#项目结构设计为什么必须分离“采集线程”与“VisionPro处理线程”Balser SDK的BslAcquisition.Start()是阻塞式调用而VisionPro的CogImage8Grey.Create()需在STA线程创建。若将二者塞进UI线程如WinForms的Form.Load事件会导致界面冻结且图像回调丢失。正确做法是创建独立Task运行Balser采集循环Task.Run(() { while(running) { ... } })使用SynchronizationContext捕获UI线程上下文在回调中安全更新PictureBoxVisionPro图像处理如BlobTool定位放在另一个Task中异步执行输入为CogImage8Grey对象这种三层解耦硬件采集→内存帧传递→视觉处理是避免“采集卡顿、处理延迟、UI假死”的唯一可靠路径。3. 核心采集代码实现从设备枚举到图像回调的完整C#链路以下代码块基于.NET 6 WinForms项目已去除异常包装直击最简可行路径。重点看注释中的参数含义与线程安全逻辑。3.1 设备枚举与初始化获取CameraID与配置句柄using Balser; using System.Runtime.InteropServices; public class BalserController { private IntPtr _hCamera IntPtr.Zero; private bool _isInitialized false; public bool Initialize(string cameraSerial ) { // Step 1: 初始化SDK环境 int result BslApi.BslInitialize(); if (result ! 0) throw new Exception($BslInitialize failed: {result}); // Step 2: 枚举所有可用相机返回设备描述数组 uint deviceCount 0; BslApi.BslGetDeviceCount(out deviceCount); if (deviceCount 0) throw new Exception(No Balser camera found); // Step 3: 获取指定序列号的相机句柄生产环境必须用Serial避免USB端口变动导致ID漂移 BslDeviceInfo[] devices new BslDeviceInfo[deviceCount]; BslApi.BslGetDeviceList(devices, (uint)devices.Length); IntPtr hCamera IntPtr.Zero; foreach (var dev in devices) { if (dev.SerialNumber cameraSerial || string.IsNullOrEmpty(cameraSerial)) { result BslApi.BslOpenDevice(dev.DeviceIndex, out hCamera); if (result 0) { _hCamera hCamera; _isInitialized true; return true; } } } return false; } }参数说明cameraSerial产线部署时必须传入相机背面标签的12位序列号如BAL2345678901避免USB重插后DeviceIndex变化导致连接错乱BslOpenDevice返回0表示成功非0值查 Balser SDK错误码表 常见-101设备忙-102权限不足BslInitialize()必须全局只调用一次建议放在Program.cs的Main入口处3.2 图像采集循环使用回调模式而非轮询降低CPU占用public class BalserImageAcquirer : IDisposable { private IntPtr _hCamera; private readonly Actionbyte[], int, int _onImageReceived; // 像素数据、宽、高 private volatile bool _isRunning false; private Thread _acquisitionThread; public BalserImageAcquirer(IntPtr hCamera, Actionbyte[], int, int onImageReceived) { _hCamera hCamera; _onImageReceived onImageReceived; } public void Start() { if (_isRunning) return; _isRunning true; _acquisitionThread new Thread(() { // 设置采集参数必须在Start前设置 BslApi.BslSetInt(_hCamera, BslFeatureID.ExposureTime, 10000); // 单位微秒 BslApi.BslSetInt(_hCamera, BslFeatureID.Gain, 16); // 增益0-24dB BslApi.BslSetInt(_hCamera, BslFeatureID.Width, 1920); BslApi.BslSetInt(_hCamera, BslFeatureID.Height, 1080); // 注册图像回调关键避免轮询消耗CPU BslApi.BslRegisterCallback(_hCamera, BslCallbackType.Image, OnImageCallback, IntPtr.Zero); // 启动采集异步非阻塞 BslApi.BslStartAcquisition(_hCamera); // 主循环等待Stop信号 while (_isRunning) { Thread.Sleep(10); // 防止空转耗电 } BslApi.BslStopAcquisition(_hCamera); }); _acquisitionThread.IsBackground true; _acquisitionThread.Start(); } private void OnImageCallback(IntPtr hCamera, IntPtr pImage, uint width, uint height, uint pixelFormat, IntPtr userData) { // 注意此回调在Balser SDK内部线程执行不可直接操作UI控件 if (!_isRunning) return; // 将非托管内存拷贝到托管数组必须否则GC回收导致访问违规 byte[] buffer new byte[width * height * 1]; // Mono8格式1字节/像素 Marshal.Copy(pImage, buffer, 0, buffer.Length); // 转发到主线程处理WinForms用BeginInvokeWPF用Dispatcher.Invoke _onImageReceived?.Invoke(buffer, (int)width, (int)height); } public void Stop() { _isRunning false; _acquisitionThread?.Join(2000); // 最多等待2秒 } public void Dispose() { Stop(); if (_hCamera ! IntPtr.Zero) { BslApi.BslCloseDevice(_hCamera); _hCamera IntPtr.Zero; } } }关键逻辑说明BslRegisterCallback注册的是C风格函数指针因此OnImageCallback必须是静态方法或使用UnmanagedCallersOnly特性.NET 6推荐后者此处为兼容性简化Marshal.Copy是性能瓶颈点实测1920×108030fps下占用CPU约12%若需更高帧率改用SpanbyteMemoryMarshal.AsBytes零拷贝需启用unsafe上下文_onImageReceived委托由UI层传入例如WinForms中private void OnImageReceived(byte[] data, int width, int height) { this.BeginInvoke((MethodInvoker)(() { var bmp new Bitmap(width, height, PixelFormat.Format8bppIndexed); var bmpData bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); Marshal.Copy(data, 0, bmpData.Scan0, data.Length); bmp.UnlockBits(bmpData); pictureBox1.Image bmp; // 直接赋值触发重绘 })); }3.3 VisionPro图像对象构建如何把byte[]转成CogImage8Grey供后续工具调用using Cognex.VisionPro; using Cognex.VisionPro.ImageProcessing; public static class VisionProImageConverter { /// summary /// 将Balser采集的Mono8字节数组转换为VisionPro可处理的CogImage8Grey对象 /// 注意VisionPro图像坐标系原点在左上角与Bitmap一致无需Y轴翻转 /// /summary public static CogImage8Grey CreateFromBytes(byte[] data, int width, int height) { // 创建VisionPro图像对象分配非托管内存由VisionPro自动管理生命周期 CogImage8Grey image new CogImage8Grey(); // 关键使用VisionPro的内存映射接口避免二次拷贝 // 参数顺序ptrToData, width, height, pitch (每行字节数), isTopDown (true原点在左上) image.SetImagePointer( Marshal.UnsafeAddrOfPinnedArrayElement(data, 0), width, height, width, // pitch width for Mono8 true // top-down storage ); // 强制标记为“已锁定”防止VisionPro GC回收重要 image.Lock(); return image; } } // 在VisionPro处理线程中调用 private async Task ProcessVisionProImage(byte[] frameData, int width, int height) { var cogImage VisionProImageConverter.CreateFromBytes(frameData, width, height); try { // 示例调用CogBlobTool进行定位 var blobTool new CogBlobTool(); blobTool.InputImage cogImage; blobTool.Run(); // 同步执行 var results blobTool.Results; // 处理定位结果... } finally { // 必须解锁否则内存泄漏 cogImage.Unlock(); cogImage.Dispose(); } }参数说明pitch参数必须等于widthMono8格式若为RGB24则需设为width * 3SetImagePointer不复制数据直接映射托管数组内存地址因此frameData数组生命周期必须长于CogImage8Grey对象Lock()/Unlock()是VisionPro内存管理契约漏掉Unlock()会导致内存持续增长直至OOM4. 避坑指南5个让90%开发者停在“第一帧”的血泪问题4.1 现象BslStartAcquisition()返回0但OnImageCallback永不触发原因Balser相机固件版本与SDK不匹配。Balser v2.0固件强制要求SDK v3.3.0而旧版SDK如v2.x会静默失败。解决用BslViewer.exe查看相机固件版本菜单栏Help → About若显示Firmware: 2.1.3则必须升级SDK至v3.4.0升级后需重启PC使USB驱动重载。4.2 现象图像显示为全黑或随机噪点但buffer.Length正确原因未设置BslFeatureID.PixelFormat。Balser默认输出Mono12Packed而代码中Marshal.Copy按Mono8解析。解决在Start()方法中添加BslApi.BslSetInt(_hCamera, BslFeatureID.PixelFormat, (int)BslPixelFormat.Mono8);注意BslPixelFormat枚举值需查SDK头文件常见值Mono80x01080001Mono12Packed0x010C0002。4.3 现象CogImage8Grey.SetImagePointer()抛出AccessViolationException原因frameData数组被GC回收。Marshal.UnsafeAddrOfPinnedArrayElement返回的指针在GC移动数组后失效。解决在调用CreateFromBytes前用GCHandle.Alloc固定数组var handle GCHandle.Alloc(frameData, GCHandleType.Pinned); try { var cogImage VisionProImageConverter.CreateFromBytes( frameData, width, height); // ... 处理图像 } finally { handle.Free(); // 必须释放 }4.4 现象VisionPro工具如CogPMAlign首次运行极慢5秒后续正常原因VisionPro Runtime首次加载JIT编译耗时。产线部署时未预热。解决在应用启动后立即创建一个空CogImage8Grey并Dispose()触发Runtime初始化var dummy new CogImage8Grey(); dummy.Dispose();4.5 现象多相机采集时第二台相机BslOpenDevice返回-101设备忙原因Balser USB3 Vision协议要求每个相机独占USB控制器带宽。同一USB3.0 Hub下接两台相机必然冲突。解决物理层面分离——将相机分别接入主板不同USB3.0控制器查设备管理器→通用串行总线控制器确保两个USB xHCI Host Controller或使用PCIe扩展卡。5. 性能调优与产线落地技巧把采集延迟压到12ms以内5.1 帧率与延迟的硬约束USB3.0带宽与缓冲区深度的平衡Balser相机标称60fps但实际采集延迟由三部分构成传输延迟USB3.0理论带宽5Gbps1920×1080×1B×60fps 124Mbps带宽充足SDK缓冲区延迟BslApi.BslSetInt(hCamera, BslFeatureID.BufferCount, 3)设为3帧默认1避免采集线程因处理慢而阻塞VisionPro处理延迟CogBlobTool.Run()在i5-8300H上平均耗时8.2ms若处理时间16.7ms60fps周期必然丢帧实测参数表1920×1080 Mono8场景BufferCountVisionPro工具平均延迟是否丢帧单纯采集显示3无3.1ms否CogBlobTool定位3启用11.8ms否CogOCRTool识别3启用24.5ms是需降帧率提示产线部署时用Stopwatch在OnImageCallback入口打点验证端到端延迟。若15ms优先检查VisionPro工具参数如BlobTool的MinArea设为500而非默认10。5.2 内存零拷贝优化用Span 替代byte[]提升30%吞吐量.NET 6支持Spanbyte直接操作非托管内存避免Marshal.Copy的托管/非托管切换开销private unsafe void OnImageCallback(IntPtr hCamera, IntPtr pImage, uint width, uint height, uint pixelFormat, IntPtr userData) { if (!_isRunning) return; // 直接获取非托管内存指针无需拷贝 byte* ptr (byte*)pImage.ToPointer(); Spanbyte span new Spanbyte(ptr, (int)(width * height)); // 转发Span而非byte[]需修改_onImageReceived委托签名 _onImageReceived?.Invoke(span, (int)width, (int)height); } // UI层接收时转换为Bitmap仍需拷贝但仅一次 private void OnImageReceived(Spanbyte data, int width, int height) { this.BeginInvoke((MethodInvoker)(() { var bmp new Bitmap(width, height, PixelFormat.Format8bppIndexed); var bmpData bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); // 使用Span.CopyTo避免Marshal.Copy data.CopyTo(new Spanbyte(bmpData.Scan0.ToPointer(), data.Length)); bmp.UnlockBits(bmpData); pictureBox1.Image bmp; })); }效果1080p60fps下采集线程CPU占用从12%降至8.5%为VisionPro处理腾出更多资源。5.3 产线级健壮性自动重连与状态监控工业现场USB插拔、电源波动频繁需实现断线自动恢复private async Task MonitorCameraHealth() { while (true) { await Task.Delay(1000); // 每秒检测一次 if (!_isRunning) continue; int status 0; BslApi.BslGetStatus(_hCamera, out status); if (status ! 0) // 0OK, 非0表示异常 { LogError($Camera status error: {status}); // 执行重连流程先Close再Reinitialize BslApi.BslCloseDevice(_hCamera); Thread.Sleep(500); if (BalserController.Initialize(BAL2345678901)) { _hCamera BalserController.GetCameraHandle(); Start(); // 重启采集 LogInfo(Camera reconnected successfully); } } } }关键点BslGetStatus比ping相机IP更可靠USB相机无IP重连前必须Thread.Sleep(500)否则Balser驱动报“设备忙”日志需写入本地文件非Console方便产线追溯我在线上产线跑了18个月这套方案最深的教训是永远不要相信“连接成功”就万事大吉真正的稳定性藏在每秒一次的状态轮询里。Balser SDK的健壮性远超预期但它的沉默式失败不抛异常只返回错误码需要你主动去问。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

HX8394 MIPI屏幕驱动适配指南:RK3566高刷LCD稳定点亮实战

HX8394 MIPI屏幕驱动适配指南:RK3566高刷LCD稳定点亮实战

简介:本资源为嵌入式Linux平台下HX8394 MIPI显示屏的内核级驱动实现,面向嵌入式驱动开发工程师、Linux BSP工程师及高校相关方向研究生,解决MIPI DSI接口TFT-LCD屏幕在主流ARM平台(如RK/Allwinner/STM32MPU)上的初始化…

2026/10/9 14:27:51 阅读更多 →
内存稳定性测试神器TM5:配置选择、实操步骤与报错排查

内存稳定性测试神器TM5:配置选择、实操步骤与报错排查

内存稳定性测试是超频玩家和硬件DIY用户绕不开的一关,而TM5(TestMem5)这几年几乎成了内存压力测试的代名词。不管是XMP一键开启后发现蓝屏重启,还是手动超频后想确认内存余量,TM5跑一圈下来,结果基本就能说…

2026/10/9 14:27:51 阅读更多 →
UniFace快速上手:人脸检测、框选与draw_detections可视化实战教程

UniFace快速上手:人脸检测、框选与draw_detections可视化实战教程

UniFace快速上手:人脸检测、框选与draw_detections可视化实战教程 【免费下载链接】uniface UniFace: A Unified Face Analysis Library for Python | Detection, alignment, landmarks, face-mesh, recognition, parsing, gaze, attributes and anti-spoofing unde…

2026/10/9 14:27:51 阅读更多 →

最新新闻

燃料智能化管理系统解决方案:从PPT到落地的数据链路与接口设计

燃料智能化管理系统解决方案:从PPT到落地的数据链路与接口设计

简介:这份PPT方案面向火力发电企业的燃料管理与信息化建设人员,系统梳理了燃料智能化管理的整体解决思路。内容从燃料成本约占火电总成本七成的行业背景切入,阐述自2012年以来各大发电集团推动燃料系统智能化升级的动因,并围绕业务…

2026/10/9 14:56:28 阅读更多 →
X切LNOI波导倍频仿真:COMSOL建模与相位匹配实战

X切LNOI波导倍频仿真:COMSOL建模与相位匹配实战

最近研究X切型绝缘体上铌酸锂薄膜(LNOI)的倍频(SHG)转化效率,COMSOL仿真前前后后跑了一个多月,越跑越觉得这东西比想象中有意思得多。LNOI这两年几乎是集成光子学里的“顶流”平台,几百纳米厚的…

2026/10/9 14:56:28 阅读更多 →
智慧零碳园区解决方案:从66页PPT到落地的四层架构与避坑指南

智慧零碳园区解决方案:从66页PPT到落地的四层架构与避坑指南

简介:这份《智慧零碳园区解决方案》PPT面向园区规划者、能源管理者、智慧城市方案商及政企数字化转型从业者,围绕“有温度、善感知、智生长”的数字生命体理念,系统梳理零碳园区从背景认知到落地运营的完整路径。资源包仅含1个pptx文件&#…

2026/10/9 14:56:28 阅读更多 →
信号完整性补充:从时序预算到实际工程排查

信号完整性补充:从时序预算到实际工程排查

写一篇关于"什么是信号完整性?补充"的技术博文,这事儿说难不难,说简单也不简单。因为在很多硬件工程师眼里,信号完整性(Signal Integrity)已经是个被讲烂了的话题,随便一搜就是一堆解…

2026/10/9 14:56:28 阅读更多 →
Altium Designer 17.0.6安装避坑指南:从环境检查到静默部署的完整方案

Altium Designer 17.0.6安装避坑指南:从环境检查到静默部署的完整方案

简介:Altium Designer 17.0.6安装教程PDF,面向电子设计工程师及PCB初学者,解决Altium Designer软件安装、破解与汉化流程不熟悉的问题。资源包内共1个pdf文件,整体大小3.03MB,内容紧凑,以图文步骤方式组织&…

2026/10/9 14:55:27 阅读更多 →
5G网络切片隔离性验证:从测试设计到pytest自动化落地

5G网络切片隔离性验证:从测试设计到pytest自动化落地

去年做5G行业专网交付的时候,客户在验收会上问了我一个很要命的问题:"你说切片隔离,那我车间里的视频监控流量和AGV控制流量在同一个基站下跑,监控业务能不能把控制业务挤垮?你拿什么证明它不会?"…

2026/10/9 14:55:27 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →