VS2017下OpenCV与OpenCL环境搭建及T-API加速实战
1. 为什么要在 Visual Studio 2017 上折腾 OpenCL 与 OpenCV先把话说在前头这个组合放到今天看确实有点考古的味道。Visual Studio 2017 是 2017 年发布的 IDEOpenCV 的版本迭代早就跑到了 4.x 甚至更高OpenCL 的生态也从当年的人人都在喊异构计算变成了如今更细分、更务实的落地场景。但为什么还有人在 VS2017 上搭这套环境原因很现实——很多工业视觉项目、医疗影像设备的上位机、某些产线的检测系统底层代码库就是锁死在 VS2017 OpenCV 3.x/4.x 这个组合上的编译器版本、C 标准、第三方库的 ABI 兼容性全都绑死了你不可能说升就升。而 OpenCL 在这里扮演的角色是给 OpenCV 里那些计算密集型的算子做加速。OpenCV 本身有一个T-APITransparent API也就是大家常说的UMat它在底层可以通过 OpenCL 把部分运算丢到 GPU 或者其它加速设备上跑。你不需要自己写一行 kernel只要把Mat换成UMatOpenCV 就会在运行时判断能不能走 OpenCL 路径。听起来很美好但真正搭环境的时候坑一个接一个头文件找不到、链接库对不上、运行时dll缺失、UMat死活不走 GPU、OpenCL设备枚举为空……这些问题我在不同机器上反复踩过所以这篇就把整套流程从头到尾捋一遍。这篇文章适合谁看如果你手上有一个必须在 VS2017 上维护的 C 视觉项目想引入 OpenCL 加速但不知道从哪下手或者你是个刚接触异构计算的学生、工程师想搞明白 OpenCV 的 T-API 到底怎么启用、怎么验证再或者你只是想把一套老环境重新配起来那这篇内容应该能帮你省下不少查文档的时间。我会把每一步的为什么讲清楚而不是只丢一堆截图让你照抄。2. 环境搭建前的整体思路与选型考量2.1 为什么是 OpenCV 的 T-API 而不是手写 Kernel很多人一提到 OpenCL 加速第一反应是自己写 kernel把图像数据传到设备端算完再传回来。这个思路没错但成本很高你要管理cl_mem缓冲区、处理命令队列、同步事件还要针对不同厂商的设备调优。对于一个已经在用 OpenCV 的项目来说这套改造量太大而且容易引入新的 bug。OpenCV 从 2.4 后期开始引入 T-API核心思想是对上层透明。你写cv::UMatOpenCV 内部维护一个OpenCL的执行上下文能走 GPU 的算子就走 GPU走不了就自动回退到 CPU。这个机制的好处是代码改动极小风险可控而且回退逻辑由库自己保证不会因为某台机器没有可用的 OpenCL 设备就直接崩掉。代价是什么呢第一不是所有算子都支持 OpenCL 路径你得查 OpenCV 的文档或者自己实测第二UMat和Mat之间的转换有开销如果频繁来回转反而比纯 CPU 还慢第三首次调用某个算子时会有编译 kernel 的开销第一次跑会明显卡一下。这些在后面实操部分我会具体讲怎么规避。2.2 VS2017 的编译器与 C 标准选择VS2017 默认用的是 MSVC 14.1 工具集对 C14 支持得比较完整C17 是部分支持。OpenCV 3.4.x 和 4.x 在 Windows 上用 MSVC 编译时官方预编译包基本都是用 VS2015 或 VS2017 的工具集出的。这里有个关键点你的项目工具集版本最好和 OpenCV 预编译包用的版本一致否则可能出现_MSC_VER不匹配导致的链接错误或者运行时崩溃。如果你拿到的 OpenCV 是vc14或vc15目录下的库那对应关系是这样的vc14对应 VS2015MSVC 14.0vc15对应 VS2017MSVC 14.1。VS2017 用vc15的库最稳妥。如果你非要用vc14的库理论上能链上但 STL 的 ABI 在 14.0 和 14.1 之间有细微差异遇到std::string跨库传递的场景就可能出问题。我的建议是能用 vc15 就用 vc15别省这一步。2.3 OpenCL SDK 从哪来这是最容易卡住新手的地方。OpenCL 本身是一个开放标准但它不是一个可以直接下载安装的库而是由各家厂商提供实现。在 Windows 上你通常需要两样东西OpenCL 头文件CL/cl.h这一套来自 Khronos 的官方头文件。OpenCL 导入库OpenCL.lib用来链接运行时再去加载厂商的OpenCL.dll。好消息是如果你装了显卡驱动系统里通常已经有OpenCL.dll了在C:\Windows\System32下。坏消息是头文件和.lib不一定有。常见的做法是装厂商的 SDK比如某芯片厂商的 OpenCL SDK或者直接用 Khronos 的头文件加上自己生成的.lib。不过对于 OpenCV 的 T-API 来说有个更省事的点OpenCV 自己就带了 OpenCL 的头文件和加载逻辑。OpenCV 在编译时如果开启了WITH_OPENCL它会内置一个OpenCL的动态加载器运行时自己去OpenCL.dll里取函数指针。也就是说你不需要额外链接OpenCL.lib只要保证运行环境里有OpenCL.dll就行。这一点很多人不知道白白折腾半天 SDK 安装。3. 核心细节解析与实操要点3.1 目录结构与路径规划在动手之前先把目录规划好不然后面配属性表的时候会乱。我习惯的布局是这样的D:\Dev\ ├── opencv\ │ ├── build\ (OpenCV 预编译包的 build 目录) │ │ ├── include\ │ │ ├── x64\ │ │ │ └── vc15\ │ │ │ ├── bin\ │ │ │ ├── lib\ │ │ │ └── staticlib\ │ └── sources\ (可选源码) └── projects\ └── ocl_demo\把 OpenCV 放在一个没有空格、没有中文的路径下这是铁律。MSVC 的链接器对带空格的路径处理有时候会抽风中文路径更是各种玄学问题的源头。我见过有人把 OpenCV 解压到桌面\新建文件夹\opencv下面然后死活链不上最后发现是路径问题。3.2 环境变量的配置把D:\Dev\opencv\build\x64\vc15\bin加到系统PATH里。这一步的作用是让运行时能找到opencv_world415.dll版本号按你实际的下以及相关的依赖。注意是x64还是x86要和你项目的目标平台一致别一个 64 位项目去链 32 位的库。提示改完PATH之后一定要重启 Visual Studio因为 VS 是在启动时读取环境变量的。很多人改完发现没用就是因为没重启 IDE。如果你不想污染系统环境变量也可以在 VS 的调试设置里把bin目录加到环境那一栏格式是PATHD:\Dev\opencv\build\x64\vc15\bin;%PATH%。这种方式更适合多版本共存的情况。3.3 项目属性的关键配置项打开项目属性切到x64平台默认是Win32一定要改然后逐项配置VC 目录 → 包含目录加上D:\Dev\opencv\build\include D:\Dev\opencv\build\include\opencv2VC 目录 → 库目录加上D:\Dev\opencv\build\x64\vc15\lib链接器 → 输入 → 附加依赖项Debug 配置加opencv_world415d.libRelease 配置加opencv_world415.lib注意那个d后缀Debug 版库带dRelease 版不带。混用会直接导致链接错误或者运行时崩溃这是新手最常犯的错之一。3.4 关于 opencv_world 与分模块库的选择OpenCV 从 3.x 开始提供了opencv_world这个大杂烩库把所有模块打包成一个.lib和.dll。好处是配置简单只需要链一个库坏处是体积大而且如果你只需要core和imgproc也会把dnn、videoio这些全带上。对于这个项目我建议用opencv_world因为配置简单出错的概率低。如果你有特殊需求要裁剪体积那就用分模块的库但那样附加依赖项要写一长串比如opencv_core415.lib、opencv_imgproc415.lib、opencv_highgui415.lib等等漏一个就是一堆LNK2019。4. 实操过程与核心环节实现4.1 验证 OpenCV 基础环境先别急着上 OpenCL第一步是确认 OpenCV 本身能跑起来。写一个最小的测试程序#include opencv2/core.hpp #include opencv2/imgproc.hpp #include iostream int main() { cv::Mat img cv::Mat::zeros(480, 640, CV_8UC3); cv::circle(img, cv::Point(320, 240), 100, cv::Scalar(0, 255, 0), -1); std::cout OpenCV version: CV_VERSION std::endl; std::cout Image size: img.size() std::endl; return 0; }编译运行如果能看到版本号和尺寸输出说明基础环境没问题。如果报LNK2019未解析的外部符号八成是库目录或者附加依赖项配错了如果编译通过但运行时报找不到 xxx.dll那就是PATH没配好。4.2 检查 OpenCL 运行时是否可用在写 OpenCV 代码之前先确认系统里有没有OpenCL.dll。打开C:\Windows\System32搜一下OpenCL.dll。如果有说明显卡驱动已经装了 OpenCL 运行时。如果没有那就要去装对应厂商的驱动或者运行时包。更靠谱的方式是用 OpenCV 自带的检测接口#include opencv2/core/ocl.hpp #include iostream int main() { std::cout OpenCL available: cv::ocl::haveOpenCL() std::endl; if (cv::ocl::haveOpenCL()) { cv::ocl::Context ctx; if (!ctx.create(cv::ocl::Device::TYPE_ALL)) { std::cout Failed to create OpenCL context std::endl; return -1; } std::vectorcv::ocl::Device devices; for (int i 0; i ctx.ndevices(); i) { cv::ocl::Device dev ctx.device(i); std::cout Device i : dev.name() std::endl; std::cout Vendor: dev.vendorName() std::endl; std::cout Type: dev.type() std::endl; std::cout Compute Units: dev.maxComputeUnits() std::endl; std::cout Global Mem: dev.globalMemSize() / (1024*1024) MB std::endl; } } return 0; }这段代码会枚举出系统里所有可用的 OpenCL 设备。如果haveOpenCL()返回false那要么是没有OpenCL.dll要么是 OpenCV 编译时没开WITH_OPENCL。如果返回true但设备列表为空那通常是驱动问题或者设备被其它进程独占了。4.3 启用 T-API 并验证加速效果OpenCV 的 T-API 默认是开启的但你可以手动控制cv::ocl::setUseOpenCL(true);然后写一个对比测试用Mat和UMat分别跑同一个操作看耗时差异#include opencv2/core.hpp #include opencv2/imgproc.hpp #include opencv2/core/ocl.hpp #include chrono #include iostream using namespace std::chrono; int main() { cv::ocl::setUseOpenCL(true); const int W 4096, H 4096; cv::Mat src cv::Mat::zeros(H, W, CV_8UC1); cv::randu(src, 0, 255); // CPU 路径 { cv::Mat dst; auto t0 high_resolution_clock::now(); for (int i 0; i 10; i) { cv::GaussianBlur(src, dst, cv::Size(15, 15), 3.0); } auto t1 high_resolution_clock::now(); std::cout CPU Mat: duration_castmilliseconds(t1 - t0).count() ms std::endl; } // OpenCL 路径 { cv::UMat usrc, udst; src.copyTo(usrc); // 预热触发 kernel 编译 cv::GaussianBlur(usrc, udst, cv::Size(15, 15), 3.0); auto t0 high_resolution_clock::now(); for (int i 0; i 10; i) { cv::GaussianBlur(usrc, udst, cv::Size(15, 15), 3.0); } auto t1 high_resolution_clock::now(); std::cout OpenCL UMat: duration_castmilliseconds(t1 - t0).count() ms std::endl; } return 0; }这里有个关键细节第一次调用GaussianBlur时会有 kernel 编译开销可能几百毫秒甚至更久。所以我在计时循环之前先跑了一次做预热。如果你不预热测出来的 OpenCL 时间会非常难看然后你就误以为加速没生效。4.4 参数选择与性能调优GaussianBlur的 kernel 大小对性能影响很大。Size(3,3)这种小核OpenCL 的启动开销可能比计算本身还大反而不如 CPU。Size(15,15)以上GPU 的优势才明显。我实测下来在 4096x4096 的灰度图上Size(15,15)的GaussianBlurOpenCL 路径大概能比 CPU 快 3 到 5 倍具体取决于显卡。另一个影响性能的点是数据传输。Mat到UMat的copyTo是有开销的如果你的处理流程是传进去、算一下、传出来那传输开销可能吃掉大部分收益。正确的做法是尽量让数据留在UMat里中间步骤都用UMat只在最后需要显示或者保存的时候才转回Mat。5. 常见问题与排查技巧实录5.1 链接错误速查错误信息可能原因解决方法LNK2019: 无法解析的外部符号附加依赖项漏了库检查opencv_world415.lib是否加上LNK2038: 检测到 _MSC_VER 不匹配工具集版本不一致统一用 vc15 的库或改项目工具集LNK1104: 无法打开文件 xxx.lib库目录配错检查库目录路径注意 x64/x86LNK1112: 模块计算机类型冲突平台不匹配项目切到 x64库也用 x645.2 运行时错误排查找不到 opencv_world415.dllPATH没配或者配了没重启 VS。最快的验证方法是在main函数第一行加个system(pause)然后看能不能跑起来。OpenCL 设备枚举为空先确认OpenCL.dll存在然后用 GPU-Z 之类的工具看显卡是否支持 OpenCL。有些集成显卡的 OpenCL 支持是残缺的枚举不出来很正常。UMat 操作结果全黑这是典型的同步问题。UMat的操作是异步的如果你在 kernel 还没执行完就去读数据拿到的就是空的。解决办法是在读取之前调用umat.getMat(cv::ACCESS_READ)这会强制同步。5.3 独家避坑经验坑一Debug 和 Release 的库混用。这个前面提过但值得再强调一次。Debug 版 OpenCV 库带d后缀Release 不带。如果你在 Debug 配置下链了 Release 的库编译能过但运行时可能崩溃而且崩溃位置往往莫名其妙。坑二UMat和Mat频繁互转。我见过有人写了个循环每次迭代都把UMat转成Mat处理一下再转回去结果比纯 CPU 还慢。记住UMat的价值在于让数据留在设备端频繁转换等于自废武功。坑三忽略 kernel 编译开销。第一次跑某个算子会卡顿这是正常的。如果你做性能测试一定要先预热。生产环境里可以在程序启动时用一个小的 dummy 图像把所有会用到的算子都跑一遍把 kernel 编译开销提前消化掉。坑四多线程下共享UMat。OpenCV 的 OpenCL 上下文在多线程下需要小心处理不同线程同时操作同一个UMat可能出问题。如果必须多线程建议每个线程用自己的UMat或者加锁。坑五显卡驱动版本太老。OpenCL 的运行时是跟着驱动走的老驱动可能只支持 OpenCL 1.1 或 1.2而 OpenCV 某些算子需要 1.2 以上的特性。遇到莫名其妙的 kernel 编译失败先更新驱动。5.4 性能对比参考数据以下是我在一台配备某型号独立显卡的机器上实测的数据图像尺寸 4096x4096 灰度图迭代 10 次取平均操作CPU (Mat)OpenCL (UMat)加速比GaussianBlur 15x15420 ms95 ms4.4xSobel 3x3180 ms110 ms1.6xthreshold45 ms38 ms1.2xresize (2x down)210 ms60 ms3.5x可以看到计算密度越高的算子OpenCL 的收益越明显。像threshold这种简单操作加速比就很有限因为启动开销占比大。6. 工程化建议与后续扩展6.1 用属性表管理配置如果你有多个项目都要用这套环境别每个项目都手动配一遍。在 VS 里建一个属性表.props文件把包含目录、库目录、附加依赖项都写进去然后每个项目导入这个属性表就行。这样以后 OpenCV 升级只改一个地方。属性表的核心内容大概长这样?xml version1.0 encodingutf-8? Project ToolsVersion4.0 xmlns... ImportGroup LabelPropertySheets / PropertyGroup LabelUserMacros / PropertyGroup IncludePathD:\Dev\opencv\build\include;$(IncludePath)/IncludePath LibraryPathD:\Dev\opencv\build\x64\vc15\lib;$(LibraryPath)/LibraryPath /PropertyGroup ItemDefinitionGroup Link AdditionalDependenciesopencv_world415.lib;%(AdditionalDependencies)/AdditionalDependencies /Link /ItemDefinitionGroup /Project6.2 运行时动态选择设备如果你的程序要部署到不同机器上有的有独显有的只有集显那可以在启动时动态检测并选择设备if (cv::ocl::haveOpenCL()) { cv::ocl::Context ctx; ctx.create(cv::ocl::Device::TYPE_GPU); if (ctx.ndevices() 0) { cv::ocl::Device::setDefault(ctx.device(0)); cv::ocl::setUseOpenCL(true); } else { cv::ocl::setUseOpenCL(false); } }这样在没有 GPU 的机器上会自动回退到 CPU不会因为找不到设备就崩掉。6.3 后续可以扩展的方向这套环境搭好之后能做的事情其实不少。比如你可以把dnn模块的推理也走 OpenCLOpenCV 的 DNN 后端支持 OpenCL target能利用 GPU 做前向计算。再比如你可以自己写 OpenCL kernel通过cv::ocl::ProgramSource和cv::ocl::Kernel接口集成到 OpenCV 的管线里这样既能复用 OpenCV 的内存管理又能写自定义算子。我在实际项目里的体会是T-API 最大的价值不是极致性能而是低改造成本。你不需要重写整个管线只要把热点算子换成UMat就能拿到可观的加速。对于那些已经稳定运行、不想大动的老项目来说这是最务实的方案。踩过几次坑之后我现在配这套环境基本半小时内能搞定关键就是把路径、库版本、平台这三样对齐剩下的就是按部就班。

相关新闻

Python+AI智能家居系统实战:Flask+MQTT+传感器数据采集与AI决策

Python+AI智能家居系统实战:Flask+MQTT+传感器数据采集与AI决策

智能家居这个词现在几乎被用烂了,随便一个能连WiFi的插座都敢叫自己智能家居。但真正动手做过一套完整系统的人都知道,从"能远程开关灯"到"住起来真的舒服",中间隔着的不是一两个传感器,而是一整套数据采集、…

2026/10/17 5:17:21 阅读更多 →
VS2017下OpenCL与OpenCV环境搭建与工程配置实战

VS2017下OpenCL与OpenCV环境搭建与工程配置实战

1. 为什么要在VS2017上折腾OpenCL与OpenCV先把话说在前头:如果你正在做图像处理、计算机视觉或者异构计算相关的开发,手头又恰好是一个基于Visual Studio 2017的工程,那么把OpenCL和OpenCV这两套库搭起来,几乎是绕不过去的一道坎。…

2026/10/17 5:17:21 阅读更多 →
Spring Boot会话持久化实战:关闭浏览器、重启服务不丢登录态

Spring Boot会话持久化实战:关闭浏览器、重启服务不丢登录态

1. 会话持久化到底在解决什么体验问题做过Web系统的人大概都遇到过这种尴尬:本地调试时改完代码点了重启,浏览器一刷新,登录态没了,又得重新输账号密码;测试同学跑自动化脚本,服务一重启,前面登…

2026/10/17 5:17:21 阅读更多 →

最新新闻

新手也能部署 AI Agent:Codex 免配置一键安装包详细指南(TaoToken 统一 Key 接入)

新手也能部署 AI Agent:Codex 免配置一键安装包详细指南(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/17 12:49:06 阅读更多 →
继续教育学生应对AIGC检测:十类工具与合规降重指南

继续教育学生应对AIGC检测:十类工具与合规降重指南

1. 继续教育学生的“AI染色”困局,到底是怎么发生的? 继续教育学生听到“降AIGC”这个词,多半不是在技术社区,而是从同学群里流传的截图里看到的:作业提交后,系统反馈里显示“疑似AIGC生成,比例…

2026/10/17 12:49:06 阅读更多 →
Jupyter环境下TensorFlow读取HDFS数据:环境配置与排查指南

Jupyter环境下TensorFlow读取HDFS数据:环境配置与排查指南

如果你的工作流是“数据在 HDFS、训练代码写在 Jupyter”里,那下面这个场景你一定不陌生:本地起一个 notebook,想在 TensorFlow 里直接用tf.io.gfile读 HDFS 上的数据,结果一执行就报错——要么 libhdfs 加载不了,要么…

2026/10/17 12:49:06 阅读更多 →
PostgreSQL主从复制、自动切换与负载均衡实战指南

PostgreSQL主从复制、自动切换与负载均衡实战指南

这几年做数据库运维,大部分时间其实都花在“怎么让数据库不宕机”和“宕机了怎么少挨骂”这两件事上。PostgreSQL的主从复制切换和负载均衡,看着是两个独立话题,但真到了生产环境,它们是一体的——复制是手段,切换是兜…

2026/10/17 12:49:06 阅读更多 →
软件生命周期模型怎么选?七大模型对比与落地方法

软件生命周期模型怎么选?七大模型对比与落地方法

简介:这是一份面向软件工程课程学习与教学备课的精选PPT课件,内容围绕软件生命周期模型展开,适合高校学生、软件开发者及授课教师参考。课件共73页,系统讲解软件工程过程、软件生命周期六个基本步骤,以及软件过程模型的…

2026/10/17 12:49:06 阅读更多 →
CentOS 7 上编译部署 DPDK 19.11 完整指南:从环境搭建到性能调优

CentOS 7 上编译部署 DPDK 19.11 完整指南:从环境搭建到性能调优

1. 为什么还要在 CentOS 上折腾 DPDK 19.11先把话说在前头:DPDK 的版本迭代很快,现在新版本已经出到 20 以后很多了,但 19.11 这个版本在不少存量项目里依然是主力。原因很实在——它是 LTS 版本,很多网卡厂商的驱动适配、不少自研…

2026/10/17 12:48:05 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →