VC++实战Windows Shell编程:从COM接口到自定义右键菜单与属性页开发
1. 项目概述当VC遇见Windows Shell如果你是一个在Windows平台上摸爬滚打多年的C开发者那么“Windows Shell编程”这个词组对你来说可能既熟悉又陌生。熟悉的是我们每天都在和资源管理器、任务栏、桌面图标打交道陌生的是如何用代码去操控这些看似由操作系统牢牢掌控的界面元素。这正是Visual CVC在Shell编程领域大显身手的地方。这不仅仅是写几个API调用那么简单它关乎如何深入Windows的“心脏地带”去定制、扩展甚至重塑用户与操作系统的交互界面。从为文件类型添加上下文菜单到开发一个全新的文件管理器插件再到监控系统的文件操作VC提供了从COM组件到原生API的一整套工具链。今天我们就抛开那些浅尝辄止的教程深入探索VC在Windows Shell编程中的核心应用、实战技巧以及那些官方文档里不会明说的“坑”。2. 环境准备与核心概念解析2.1 开发环境搭建不止是装个VS要玩转Shell编程第一步就是搭好台子。很多人以为装个Visual Studio 2022就万事大吉但这里面的门道不少。首先Visual Studio的安装选项至关重要。在安装时务必勾选“使用C的桌面开发”工作负载这自不必说。但关键在于其下的可选组件。你需要确保安装了Windows 10/11 SDK这是Shell编程的基石包含了所有必要的头文件如shlobj.h,shlwapi.h,propkey.h和库文件。C ATL (Active Template Library)和MFC (Microsoft Foundation Classes)对于需要创建COM组件如Shell扩展的项目ATL是最高效轻量的选择。而MFC则提供了一些现成的包装类虽然现在新项目不推荐但维护老代码或快速原型时可能用到。注意如果你在安装其他软件如Node.js、某些游戏时遇到“Microsoft Visual C 20XX Redistributable安装包不存在”的错误这通常是因为系统缺少对应版本的VC运行时库。对于开发者而言我们关心的是开发库SDK运行时库是给最终用户用的。确保你的VS安装了对应版本的“MSVC vXXX - VS 20XX C x64/x86生成工具”这才是编译时真正依赖的。其次项目属性配置是第二个关键点。新建一个“Windows桌面向导”项目后我习惯做以下调整字符集在“项目属性 - 高级”中将“字符集”设置为“使用Unicode字符集”。Windows Shell API从Win95后期就开始转向Unicode宽字符坚持使用Unicode (wchar_t,L”string”) 能避免大量转换和潜在乱码问题。运行时库在“C/C - 代码生成”中对于Debug配置使用/MDd多线程DLL调试对于Release使用/MD多线程DLL。这能让你的程序更小并且与系统DLL共享CRT运行时是Shell扩展这类需要被资源管理器加载的DLL的推荐设置。链接器设置你需要链接一些特定的库。在“链接器 - 输入 - 附加依赖项”中根据项目需要添加shell32.lib最核心的Shell API库。shlwapi.lib提供Shell轻量级工具函数如路径处理、注册表辅助等。ole32.lib和oleaut32.lib用于COM编程。propsys.lib如果你需要处理文件属性系统Property System。2.2 理解Windows Shell的核心架构COM是灵魂在动手写代码前必须理解Windows Shell的本质它是一个基于COMComponent Object Model构建的庞大系统。资源管理器explorer.exe本身就是一个COM客户端它通过查询、创建、调用各种COM对象来呈现桌面、任务栏和文件列表。这意味着你要与Shell交互绝大多数时候就是在和COM接口打交道。例如IShellFolder代表一个文件夹对象可以枚举其中的内容文件、子文件夹。IShellView代表一个文件夹的视图如详细信息、大图标。IContextMenu这就是我们右键菜单的源头。当你右键点击一个文件时Shell会收集所有注册了该文件类型的IContextMenu接口的实现并合并显示。IShellExtInit和IShellPropSheetExt分别是Shell扩展初始化和属性页扩展的接口。为什么是COMCOM提供了二进制级别的兼容性和语言无关性。你的VC DLL只要实现了约定的接口一个由函数指针表构成的结构体即vtable并正确注册就能被资源管理器可能是C写的加载和调用。这种松耦合的设计是Shell可扩展性的基石。一个最简单的思维模型Shell是一个舞台资源管理器舞台上的演员文件图标、菜单项、属性页都是COM对象。你的VC代码就是后台负责制作实现这些演员并把他们送到舞台经理注册表那里登记。当舞台需要时经理就会叫你的演员上台表演。3. 核心应用场景与实战拆解3.1 场景一创建自定义文件右键菜单处理器这是Shell编程中最常见、最实用的需求。比如我们想为.myapp文件添加一个“用我的工具加密”的菜单项。第一步使用ATL创建COM DLL项目在VS中不要选择普通的“动态链接库”而是选择“ATL项目”。ATL向导会帮你生成正确的DLL入口点、类工厂等样板代码极大简化COM开发。项目名可以叫MyShellExt。第二步实现核心COM类在“类视图”中右键项目添加“ATL简单对象”。类名可以叫CMyContextMenuExt。在创建向导中“线程模型”选择“单元”Apartment因为Shell扩展通常运行在资源管理器的UI线程中。“聚合”选择“否”。向导会生成CMyContextMenuExt类的头文件和实现文件。这个类默认继承自CComObjectRootEx和CComCoClass并实现了IUnknown。我们需要让它额外实现两个接口IShellExtInit和IContextMenu。在类定义中.h文件添加继承和接口映射class ATL_NO_VTABLE CMyContextMenuExt : public CComObjectRootExCComSingleThreadModel, public CComCoClassCMyContextMenuExt, CLSID_CMyContextMenuExt, public IShellExtInit, public IContextMenu { public: DECLARE_REGISTRY_RESOURCEID(IDR_MYCONTEXTMENUEXT) BEGIN_COM_MAP(CMyContextMenuExt) COM_INTERFACE_ENTRY(IShellExtInit) COM_INTERFACE_ENTRY(IContextMenu) END_COM_MAP() // IShellExtInit STDMETHOD(Initialize)(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hkeyProgID); // IContextMenu STDMETHOD(QueryContextMenu)(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags); STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO pici); STDMETHOD(GetCommandString)(UINT_PTR idCmd, UINT uType, UINT* pReserved, LPSTR pszName, UINT cchMax); private: // 存储选中的文件路径列表 CStringList m_listFiles; };第三步实现IShellExtInit::Initialize这个方法在Shell准备显示菜单时被调用pDataObj参数包含了用户选中的文件列表可能是多个。我们的任务就是从中提取出文件路径。STDMETHODIMP CMyContextMenuExt::Initialize(LPCITEMIDLIST /*pidlFolder*/, LPDATAOBJECT pDataObj, HKEY /*hkeyProgID*/) { if (pDataObj NULL) return E_INVALIDARG; m_listFiles.RemoveAll(); FORMATETC fmt { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; STGMEDIUM stg { TYMED_HGLOBAL }; if (SUCCEEDED(pDataObj-GetData(fmt, stg))) { HDROP hDrop (HDROP)GlobalLock(stg.hGlobal); if (hDrop ! NULL) { UINT nFiles DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); TCHAR szFile[MAX_PATH]; for (UINT i 0; i nFiles; i) { if (DragQueryFile(hDrop, i, szFile, MAX_PATH) 0) { // 可以在这里检查文件扩展名只处理.myapp文件 // if (PathMatchSpec(szFile, _T(*.myapp))) ... m_listFiles.AddTail(szFile); } } GlobalUnlock(stg.hGlobal); } ReleaseStgMedium(stg); } return (m_listFiles.IsEmpty() ? E_FAIL : S_OK); }第四步实现IContextMenu::QueryContextMenu这个方法被调用来让我们向菜单中插入项。idCmdFirst是Shell分配给我们的第一个命令ID起始值我们必须使用从这个值开始的ID。STDMETHODIMP CMyContextMenuExt::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { // 如果是在“发送到”或“打开方式”等特殊菜单则不添加 if (uFlags CMF_DEFAULTONLY) return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0); // 插入一个菜单项 CString strMenuText(_T(用我的工具加密)); if (InsertMenu(hmenu, indexMenu, MF_STRING | MF_BYPOSITION, idCmdFirst, strMenuText)) { // 返回我们添加的菜单项数量1个 return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 1); } return E_FAIL; }第五步实现IContextMenu::InvokeCommand当用户点击我们的菜单项时这个方法被调用。pici-lpVerb可以区分是哪个命令因为我们只有一个所以是0。STDMETHODIMP CMyContextMenuExt::InvokeCommand(LPCMINVOKECOMMANDINFO pici) { // 如果是以字符串形式调用高字节不为0则转换 if (HIWORD(pici-lpVerb) ! 0) return E_INVALIDARG; // 检查命令ID是否是我们添加的第一个所以是0 if (LOWORD(pici-lpVerb) ! 0) return E_INVALIDARG; // 在这里执行实际的加密操作 POSITION pos m_listFiles.GetHeadPosition(); while (pos) { CString filePath m_listFiles.GetNext(pos); // 调用你的加密函数例如MyEncryptTool(filePath); MessageBox(pici-hwnd, CString(_T(处理文件: )) filePath, _T(提示), MB_OK); } return S_OK; }第六步注册与反注册ATL项目会自动生成DllRegisterServer和DllUnregisterServer函数。我们需要在.rgs注册表脚本文件中添加我们的CLSID注册信息。关键是在HKEY_CLASSES_ROOT\\*\\shellex\\ContextMenuHandlers所有文件或HKEY_CLASSES_ROOT\\.myapp\\shellex\\ContextMenuHandlers特定文件类型下创建一个以我们类名命名的子项其默认值设置为我们的CLSID一串GUID。实操心得调试Shell扩展非常棘手因为它运行在explorer.exe进程内。我的常用方法是在InvokeCommand里需要调试的地方写DebugBreak();然后用VS的“调试 - 附加到进程”选择explorer.exe。更高级的做法是修改注册表让Shell在加载DLL时自动调用调试器通过Image File Execution Options但这更复杂。一个简单的替代方案是在InvokeCommand里把操作日志写到文件这是最可靠的调试方式之一。3.2 场景二开发自定义文件属性页除了右键菜单我们还可以为特定文件类型添加自定义的属性页标签。比如为.myapp文件添加一个“我的元数据”标签页。实现思路创建一个新的ATL简单对象例如CMyPropertySheetExt。让它实现IShellExtInit同上用于获取文件和IShellPropSheetExt接口。关键实现IShellPropSheetExt::AddPages方法。在这个方法里你需要创建一个标准的属性页对话框通常是一个Win32对话框或ATL对话框并将其HPROPSHEETPAGE句柄通过回调函数添加到Shell提供的属性表中。这个自定义对话框负责显示和编辑你定义的元数据例如从文件头部读取或写入特定信息。技术细节属性页对话框是模态的但它的生命周期由Shell管理。你需要处理PSN_APPLY通知当用户点击“应用”或“确定”时将修改写回文件。注册位置在HKEY_CLASSES_ROOT\\*\\shellex\\PropertySheetHandlers或针对特定文件类型。3.3 场景三编写命名空间扩展Namespace Extension这是Shell编程的“深水区”目标是创建一个像“我的电脑”、“控制面板”那样的虚拟文件夹。它有自己的树状结构、图标、视图和菜单。核心挑战实现大量接口至少需要实现IShellFolder、IEnumIDList、IPersistFolder等。IShellFolder是核心它定义了如何枚举项目、获取属性、创建视图等。PIDL管理Shell使用ITEMIDLISTPIDL结构来唯一标识命名空间中的每个项目。你需要自己分配、填充、复制和释放这些内存结构这是最容易出错的地方之一。视图对象你可能还需要实现IShellView来控制显示方式。建议除非有非常强烈的定制需求如开发一个FTP客户端集成到资源管理器否则不建议从头实现完整的命名空间扩展。可以考虑使用IShellFolder的轻量级替代方案或者使用IContextMenu和属性页来增强现有文件夹。4. 高级技巧与性能优化4.1 异步操作与进度对话框在InvokeCommand中执行耗时操作如加密大文件会阻塞Shell的UI线程导致资源管理器“无响应”。绝对要避免这种情况。正确做法是创建新线程在InvokeCommand中不要直接执行任务。创建或使用一个线程池CreateThread或std::thread将文件列表和必要的参数传递给工作线程。立即从InvokeCommand返回S_OK。工作线程负责实际处理并可以通过窗口消息、回调函数或COM接口向进度对话框你需要自己创建报告进度。你可以使用ITaskbarList3接口Win7及以上在任务栏按钮上显示进度。更传统的做法是弹出一个模式或无模式对话框显示进度条和取消按钮。4.2 正确处理多实例与状态共享你的Shell扩展DLL可能会被多个Explorer实例甚至不同进程加载。默认情况下每个进程都有自己独立的DLL副本。如果需要在所有实例间共享数据例如一个全局的配置或缓存你需要使用共享内存段Memory-Mapped File或命名互斥体/事件来进行进程间通信IPC。重要原则尽量减少共享状态。Shell扩展应该设计为无状态的或者状态仅存在于单次操作的生命周期内如Initialize到InvokeCommand。全局状态是复杂性和不稳定的根源。4.3 资源管理与错误处理内存泄漏严格遵守COM规则AddRef和Release必须配对。使用CComPtr、CComQIPtr等ATL智能指针可以极大降低风险。异常安全Shell扩展中不要抛出C异常跨越COM接口边界。所有接口方法都应返回HRESULT并使用SUCCEEDED/FAILED宏检查。路径处理始终使用MAX_PATH定义缓冲区大小或者使用动态分配。考虑使用PathCch系列函数来自pathcch.h进行安全的路径操作。5. 调试、部署与疑难排查5.1 调试策略实录日志输出法如前所述在关键函数入口将参数和状态写入一个日志文件如OutputDebugString配合DebugView工具或直接写文件。这是最通用、最有效的方法。消息框断点在怀疑出问题的地方弹出一个MessageBox。虽然“土”但能立刻确认执行流。VS附加调试编译Debug版本的DLL。在代码中设置断点。运行Explorer如果已经运行可以先结束进程再启动。在VS中“调试” - “附加到进程” - 选择“explorer.exe”。执行会触发你扩展的操作如右键点击文件。如果DLL被加载断点应该能命中。注意可能需要禁用Explorer的“在单独进程中打开文件夹”选项否则扩展可能运行在另一个explorer.exe进程中。5.2 部署与注册你的产品安装程序如MSI必须将编译好的DLL通常是Release版复制到合适位置如%ProgramFiles%\\YourCompany\\YourApp\\下。以管理员权限调用regsvr32.exe yourshell.dll来注册或者直接在安装程序中写入对应的注册表项更专业。对于64位系统要特别注意32位x86和64位x64的兼容性。64位Explorer会加载64位DLL32位应用程序如旧版Office调用的Shell对话框可能会加载32位DLL。你需要为两者分别编译和注册。32位DLL注册在HKEY_CLASSES_ROOT\\...的Wow64节点下实际是HKCR\\...但32位进程有重定向64位DLL注册在原生节点。通常需要制作两个MSI包或在一个包内处理两种架构。5.3 常见问题排查表问题现象可能原因排查步骤右键菜单不出现1. 注册表项错误或位置不对。2. DLL注册失败依赖项缺失。3. DLL加载失败路径错误或权限问题。4.QueryContextMenu返回了0或错误。1. 用RegEdit检查CLSID是否正确注册到ContextMenuHandlers下。2. 使用Process Monitor工具过滤explorer.exe对注册表和DLL文件的访问看是否有“NAME NOT FOUND”或“ACCESS DENIED”错误。3. 检查DllRegisterServer是否成功执行。4. 在QueryContextMenu中加日志看是否被调用以及返回值。点击菜单项无反应或Explorer崩溃1.InvokeCommand中有未处理的异常或内存访问违规。2. 阻塞了UI线程。3. 在错误的线程中调用了COM方法线程模型问题。1. 使用日志法或附加调试器定位崩溃点。2. 确保耗时操作已移至后台线程。3. 检查ATL对象的线程模型是否与调用环境匹配。对于UI操作通常需要切换到主线程用PostMessage或CreateWindow。仅在部分文件类型上显示菜单IShellExtInit::Initialize中的文件过滤逻辑有问题或注册路径不正确。1. 在Initialize中记录所有接收到的文件路径检查过滤条件。2. 确认注册表项是针对*所有文件还是特定扩展名如.myapp。在64位系统上某些程序右键不显示菜单32位/64位DLL注册混淆。32位程序调用Shell时会加载32位上下文。1. 确认是否为32位和64位系统分别提供了对应的DLL并正确注册。2. 检查HKEY_CLASSES_ROOT\\...\\ContextMenuHandlers和HKEY_CLASSES_ROOT\\Wow6432Node\\...\\ContextMenuHandlers下的注册情况。深入Windows Shell编程就像获得了一把打开系统UI定制化大门的钥匙而Visual C和ATL是锻造这把钥匙的最佳工具组合。整个过程充满了挑战尤其是COM编程模型和进程内调试但带来的能力提升和项目价值是巨大的。从我个人的经验来看成功的Shell扩展离不开三点一是对COM基础的深刻理解二是严谨的资源管理和错误处理三是大量的日志记录以应对复杂的运行时环境。当你看到自己编写的菜单项出现在系统右键菜单中并稳定可靠地工作时那种成就感是对这些复杂性的最好回报。最后一个小建议在正式集成到产品前务必在从Win10到Win11的多个系统版本上进行测试因为Shell的行为在不同版本间可能会有细微调整。

相关新闻

STM32 HAL库I2C通信稳定性实战:从总线锁死到软件恢复全解析

STM32 HAL库I2C通信稳定性实战:从总线锁死到软件恢复全解析

1. 项目概述:当I2C遇上HAL库,一场开发者与硬件的“拉锯战”如果你正在用STM32的HAL库驱动I2C设备,大概率已经或即将遇到一些“玄学”问题。设备时好时坏,调试器一挂上就正常,跑起来就卡死,或者干脆连起始信…

2026/7/30 4:05:36 阅读更多 →
Android开发语言选型:Kotlin与Java的实战对比与迁移策略

Android开发语言选型:Kotlin与Java的实战对比与迁移策略

1. 项目概述:一场持续的技术选型辩论如果你在2024年还在纠结Android开发该选Kotlin还是Java,那说明你至少是个对技术有追求的开发者。这场“语言之争”从2017年Google宣布Kotlin成为Android官方一级支持语言开始,就从未真正平息过。我经历过从…

2026/7/30 4:05:36 阅读更多 →
从“加载模型”界面到端侧推理:拆解一个 React + WebGPU 大模型 Demo

从“加载模型”界面到端侧推理:拆解一个 React + WebGPU 大模型 Demo

这个项目还没有真正把大模型跑起来,但它已经把端侧 AI 应用最重要的 UI 骨架搭好了:能力检测、加载状态、错误出口、下载进度和输入交互。本文从现有代码出发,梳理它已经完成的部分,以及接入真实推理链路还差什么。每次调用云端大…

2026/7/30 4:05:36 阅读更多 →

最新新闻

基于51单片机的电子密码锁设计与实现:从原理到实践

基于51单片机的电子密码锁设计与实现:从原理到实践

1. 项目概述:从零打造一个硬核的电子密码锁最近在整理工作室的旧物,翻出来一堆大学时期玩剩下的STC89C52RC芯片和一堆共阳数码管,看着它们,一个念头就冒了出来:用这些最基础的元件,能不能做一个既实用又有趣…

2026/7/31 5:57:53 阅读更多 →
AI Native, Now|阿里云 Milvus AI Function,从能力集成走向产品化落地

AI Native, Now|阿里云 Milvus AI Function,从能力集成走向产品化落地

作者:周弘懿(锦琛) 企业落地 AI,真正的分水岭,早已不是“有没有模型”,而是能否把模型变成一条接得快、跑得稳、成本可控、风险可防的业务生产链路。 过去,每新增一种 AI 能力,往往…

2026/7/31 5:57:53 阅读更多 →
STM32标准库开发环境搭建与工程模板创建指南

STM32标准库开发环境搭建与工程模板创建指南

1. 项目概述:从零搭建STM32标准库开发环境很多刚接触STM32单片机的朋友,拿到一块开发板后,面对的第一个难题往往不是写代码,而是“环境怎么搭”。官方的标准外设库(Standard Peripheral Library, 也就是我们…

2026/7/31 5:57:53 阅读更多 →
AI音乐改编工具有哪些,Remix曲风重制与音乐二创实测心得

AI音乐改编工具有哪些,Remix曲风重制与音乐二创实测心得

做音乐改编、曲风重制和Remix创作的人,大多都有过纠结的时刻。手里有一段自己授权完备的原创BGM、翻唱片段或者老歌素材,想换个风格做成短视频配乐、全新改编版本,却总遇到各种问题。要么改完之后原曲旋律完全跑偏,核心记忆点丢失…

2026/7/31 5:57:53 阅读更多 →
Skills工作流实战:用工程化方法解决AI幻觉,构建可信应用

Skills工作流实战:用工程化方法解决AI幻觉,构建可信应用

在实际 AI 应用开发中,一个长期困扰开发者的核心问题是“AI 幻觉”——模型会生成看似合理但实际错误或虚构的信息。这种问题在代码生成、技术问答、数据分析和内容创作等场景中尤为致命,可能导致项目引入隐蔽 Bug、技术决策失误或数据污染。Matt Pocock…

2026/7/31 5:57:53 阅读更多 →
为J-Flash添加华大MCU支持:HC32系列烧录配置全攻略

为J-Flash添加华大MCU支持:HC32系列烧录配置全攻略

1. 项目概述:为什么需要为J-Flash添加华大MCU型号?如果你手头有一块基于华大半导体HC32F460系列(或者其他HC32系列)的板子,兴致勃勃地准备用J-Link配合J-Flash进行程序烧录,大概率会碰上一个不大不小的钉子…

2026/7/31 5:56:53 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻