OpenCV4Android 3.3.0 集成 opencv_contrib 实战指南
简介本资源是专为Android平台定制的OpenCV 3.3.0完整开发包集成官方主库与opencv_contrib扩展模块面向具备Java/C基础的移动视觉开发者解决Android端缺乏SIFT/SURF、人脸识别人脸识别、AR标记检测、背景建模等高级算法支持的痛点适用于人脸识别App、智能图像增强、AR互动应用等实战场景。压缩包共683个文件含289个C头文件hpp/h支撑核心算法调用182个Java封装类实现Android层快速接入102个静态库文件.a覆盖dnn、imgproc、core、tracking等关键模块另有XML配置、CMake构建脚本及SO动态库整体56.2MB结构完整适配NDK开发流程。已有694人学习下载提供开箱即用的编译产物与模块化组织开发者可按需启用Xfeatures2D、Face、aruco等contrib功能避免自行交叉编译的复杂性与兼容性风险显著缩短Android视觉功能落地周期。1. OpenCV4Android-3.3.0 opencv_contrib为什么你在 Android 上跑通 SIFT/SURF/ORB 特征匹配总卡在「找不到模块」如果你正试图在 Android 项目里调用xfeatures2d::SIFT::create()却收到UnsatisfiedLinkError: dlopen failed: library libopencv_xfeatures2d.so not found或者cv::StereoBM::create()报undefined reference那不是你 Gradle 配置漏了.so而是你手里的 OpenCV Android SDK 本就不含这些算法——标准版 OpenCV4Android-3.3.0 默认剥离了opencv_contrib模块。这个组合标题直指一个真实痛点OpenCV 官方 Android 发行包3.3.0与扩展模块contrib的二进制不兼容、JNI 接口断裂、C 符号未导出。它不是“装个包就能用”的功能叠加而是一场涉及 NDK 构建链、ABI 对齐、CMake 导出控制、Java 层 JNI 封装补全的系统性缝合工程。适合已能跑通Core.imread()和Imgproc.cvtColor()的中级 Android 视觉开发者目标明确在 ARMv7-A / ARM64-v8a 设备上稳定调用SIFT、SURF、AKAZE、text::OCRTesseract或tracking::MultiTracker。别被“3.3.0”这个老版本劝退——它仍是工业现场存量设备如嵌入式工控屏、国产安卓终端的主流支持基线而opencv_contrib是绕不开的算法刚需。2. 为什么不能直接 copy-paste opencv_contrib 到 OpenCV4Android 工程里2.1 官方发行包的「阉割逻辑」哪些模块被移除了为什么OpenCV4Android-3.3.0 的官方预编译包 opencv.org/releases/ 下载页标注为android是经过严格裁剪的。其sdk/native/libs/目录下仅包含以下.soarmeabi-v7a/ ├── libopencv_core.so ├── libopencv_imgproc.so ├── libopencv_imgcodecs.so ├── libopencv_videoio.so ├── libopencv_highgui.so └── libopencv_features2d.so ← 注意此文件存在但仅含 FAST、ORB、BRISK 等基础类不含 SIFT/SURF而opencv_contrib中的关键模块xfeatures2d,text,tracking,sfm,rgbd根本不在任何预编译.so中。原因有三专利规避SIFT和SURF在 3.3.0 时代仍受专利保护2020 年后才陆续过期OpenCV 官方默认关闭其构建依赖冲突text::OCRTesseract依赖tesseract-ocr第三方库sfm::triangulatePoints依赖ceres-solver这些 C 第三方库无法打包进 Android SDK 的扁平.so结构ABI 兼容性断层官方预编译包使用arm-linux-androideabi-4.9工具链NDK r10e而opencv_contrib的CMakeLists.txt默认适配较新 NDKr12b直接 include 会导致__android_log_print符号未定义等链接错误。提示不要尝试把opencv_contrib/modules/xfeatures2d/src/sift.cpp直接拖进 Android Studio 的cpp/目录——OpenCV 的cv::Algorithm注册机制、cv::Ptr智能指针生命周期、以及cv::String与std::string的 ABI 兼容性都要求所有 OpenCV 相关代码必须由同一套 CMake 工具链统一编译否则必现SIGSEGV或pure virtual method called。2.2 正确路径从源码重建完整 Android SDK含 contrib我们必须放弃「下载即用」思维转为「本地全量构建」。核心步骤是① 下载 OpenCV 3.3.0 主干源码② 下载匹配的opencv_contrib3.3.0 分支注意必须 commit hash 一致③ 使用 NDK r10e与官方预编译包 ABI 一致 CMake 3.6.0OpenCV 3.3.0 最高兼容版本重新编译④ 替换sdk/native/下全部内容重生成OpenCV-android-sdk/sdk/java/的classes.jar。以下是可复现的最小构建脚本Linux/macOSWindows 用户请改用 WSL# 假设工作目录为 ~/opencv-build mkdir -p ~/opencv-build cd ~/opencv-build # 1. 获取 OpenCV 3.3.0 源码tag: 3.3.0 git clone https://github.com/opencv/opencv.git cd opencv git checkout 3.3.0 cd .. # 2. 获取 opencv_contrib 3.3.0关键必须用同一 commit git clone https://github.com/opencv/opencv_contrib.git cd opencv_contrib git checkout 3.3.0 cd .. # 3. 创建构建目录并进入 mkdir build_android cd build_android # 4. 执行 CMake 配置重点参数说明见下方 cmake -DCMAKE_TOOLCHAIN_FILE$ANDROID_NDK/build/cmake/android.toolchain.cmake \ -DANDROID_ABIarmeabi-v7a \ -DANDROID_ARM_NEONON \ -DANDROID_PLATFORMandroid-19 \ -DANDROID_NDK$ANDROID_NDK \ -DCMAKE_BUILD_TYPERelease \ -DBUILD_TESTSOFF \ -DBUILD_PERF_TESTSOFF \ -DBUILD_opencv_python2OFF \ -DBUILD_opencv_python3OFF \ -DBUILD_ANDROID_EXAMPLESOFF \ -DOPENCV_EXTRA_MODULES_PATH../opencv_contrib/modules \ -DOPENCV_ENABLE_NONFREEON \ # 必开否则 SIFT/SURF 不编译 -DBUILD_SHARED_LIBSON \ ../opencv # 5. 编译-j4 根据 CPU 核数调整 make -j4 # 6. 安装到本地 sdk/ 目录生成完整 Android SDK 结构 make install参数关键说明-DANDROID_ABIarmeabi-v7a若需支持 64 位需额外执行一次-DANDROID_ABIarm64-v8a构建并合并libs/目录-DOPENCV_ENABLE_NONFREEON这是启用SIFT/SURF的开关OpenCV 3.3.0 默认OFF-DOPENCV_EXTRA_MODULES_PATH../opencv_contrib/modules告诉 CMake 去哪找 contrib 模块-DANDROID_PLATFORMandroid-19对应 Android 4.4覆盖绝大多数存量设备$ANDROID_NDK环境变量需提前设置为 NDK r10e 路径如~/android-ndk-r10e。构建成功后build_android/install/sdk/native/就是你的全新 SDK其中libs/armeabi-v7a/下将出现libopencv_xfeatures2d.so ← SIFT/SURF/AKAZE 全在此 libopencv_text.so ← OCR 模块 libopencv_tracking.so ← 多目标跟踪 libopencv_sfm.so ← 结构光三维重建需 ceres3. 在 Android Studio 中集成自建 SDKGradle 配置与 Java 层封装补丁3.1 替换 SDK 并配置 C 支持将上一步生成的build_android/install/sdk/整个目录复制到你的 Android 项目中例如app/src/main/jniLibs/删除原OpenCV-android-sdk。然后修改app/build.gradleandroid { compileSdkVersion 33 defaultConfig { applicationId com.example.opencvcontrib minSdkVersion 19 // 必须 ≥19因我们用了 android-19 platform targetSdkVersion 33 versionCode 1 versionName 1.0 // 显式声明支持的 ABI与构建时一致 ndk { abiFilters armeabi-v7a, arm64-v8a } } // 关键sourceSets 指向新 SDK 的 native libs sourceSets { main { jniLibs.srcDirs [src/main/jniLibs] } } }注意jniLibs.srcDirs必须指向你make install生成的sdk/native/libs/而非sdk/native/jni/。后者是头文件目录.so在libs/下。3.2 补全 Java 层 JNI 封装为什么xfeatures2d.SIFT.create()仍报错OpenCV4Android 的 Java API 是通过gen_java.py自动生成的但opencv_contrib模块的 Java 封装不会自动注入到OpenCV-android-sdk/sdk/java/中。你必须手动补全。以SIFT为例进入build_android/install/sdk/java/即make install生成的 Java SDK打开src/org/opencv/features2d/Features2d.java找到public static Feature2D create(int detectorType)方法在switch(detectorType)中添加 casecase CvType.CV_32F: return new SIFT();在同包下新建SIFT.javapackage org.opencv.features2d; import org.opencv.core.Mat; import org.opencv.core.MatOfKeyPoint; import org.opencv.core.MatOfDMatch; public class SIFT extends Feature2D { private long nativeObj; protected SIFT(long addr) { nativeObj addr; } public SIFT() { nativeObj SIFT_0(); } // JNI 方法声明需在 .cpp 中实现 private static native long SIFT_0(); Override protected long getNativeObjAddr() { return nativeObj; } // 可选暴露更多参数控制 public static SIFT create(int nfeatures, int nOctaveLayers, double contrastThreshold, double edgeThreshold, double sigma) { return new SIFT(create_1(nfeatures, nOctaveLayers, contrastThreshold, edgeThreshold, sigma)); } private static native long create_1(int nfeatures, int nOctaveLayers, double contrastThreshold, double edgeThreshold, double sigma); }在build_android/install/sdk/native/jni/下创建modules/xfeatures2d/src/java/SIFT.cpp需同步修改CMakeLists.txt加入该源文件#include opencv2/opencv.hpp #include opencv2/xfeatures2d.hpp #include jni.h extern C { JNIEXPORT jlong JNICALL Java_org_opencv_features2d_SIFT_SIFT_10(JNIEnv*, jclass) { cv::Ptrcv::xfeatures2d::SIFT sift cv::xfeatures2d::SIFT::create(); return (jlong)sift.get(); } JNIEXPORT jlong JNICALL Java_org_opencv_features2d_SIFT_create_11( JNIEnv*, jclass, jint nfeatures, jint nOctaveLayers, jdouble contrastThreshold, jdouble edgeThreshold, jdouble sigma) { cv::Ptrcv::xfeatures2d::SIFT sift cv::xfeatures2d::SIFT::create( nfeatures, nOctaveLayers, contrastThreshold, edgeThreshold, sigma); return (jlong)sift.get(); } }重新make install并将新生成的sdk/java/替换进 Android 项目的app/src/main/java/org/opencv/。提示此过程繁琐但不可跳过。opencv_contrib的 Java 封装缺失是 OpenCV4Android-3.3.0 的历史遗留问题社区无官方补丁。我一般会写一个 Python 脚本批量生成xxx.java和xxx.cpp模板针对xfeatures2d、text、tracking三大高频模块优先补全。4. 避坑OpenCV4Android-3.3.0 contrib 的 5 个血泪经验4.1 现象System.loadLibrary(opencv_java3)成功但SIFT.create()报UnsatisfiedLinkError: Native method not found原因Java 层调用的 JNI 方法名与 C 实现不匹配。OpenCV 3.3.0 的 JNI 命名规则为Java_package_Class_methodName且包名中的.需替换为_如org.opencv.features2d.SIFT→Java_org_opencv_features2d_SIFT。若 C 文件中写成Java_org_opencv_xfeatures2d_SIFT多写了x或 Java 类放在org.opencv.xfeatures2d包下实际应为org.opencv.features2d均导致符号未找到。解决用nm -D libopencv_java3.so | grep SIFT检查导出符号确保 C 函数名与 Java 调用路径完全一致Java 类必须放在org.opencv.features2d包下即使它来自xfeatures2d模块。4.2 现象SIFT.detectAndCompute()返回空MatOfKeyPoint无 crash 但无特征点原因输入图像Mat的type()不符合 SIFT 要求。SIFT 仅接受CV_8UC1单通道灰度图。若传入CV_8UC3BGR 彩图或CV_8UC4BGRA内部会静默失败不抛异常。解决强制转换Mat gray new Mat(); Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); // 确保 src 是 BGR // 再传 gray 给 SIFT4.3 现象ARM64 设备上libopencv_xfeatures2d.so加载失败logcat 显示dlopen failed: cannot locate symbol log2f原因NDK r10e 的arm64-v8a工具链中log2f符号未正确链接。这是 NDK r10e 的已知 bug仅影响 64 位构建。解决在CMakeLists.txt的target_link_libraries前添加if(ANDROID_ABI STREQUAL arm64-v8a) target_link_libraries(${the_target} log) endif()或降级使用 NDK r11c更稳定但需同步更新android.toolchain.cmake路径。4.4 现象text::OCRTesseract初始化时报Tesseract couldnt load any languages!原因libopencv_text.so依赖tesseract运行时库但 OpenCV 构建时未嵌入tessdata语言包且tesseract的SetVariable(tessedit_char_whitelist, ...)等 API 在 Android 上需手动指定tessdata路径。解决① 将tessdata文件夹含eng.traineddata放入app/src/main/assets/tessdata/② 在 Java 中初始化时指定路径TessBaseAPI baseApi new TessBaseAPI(); baseApi.init(getAssets().openFd(tessdata/).getFileDescriptor(), eng);③ 确保CMakeLists.txt中find_package(tesseract REQUIRED)成功且tesseract库已交叉编译进libs/arm64-v8a/libtesseract.so。4.5 现象tracking::MultiTracker创建后update()返回false跟踪框消失原因MultiTracker在 OpenCV 3.3.0 中对初始化矩形Rect的坐标合法性校验极严。若x0、y0、width0或height0add()会静默失败后续update()直接返回false。解决初始化前强校验Rect initRect new Rect(x, y, w, h); initRect.x Math.max(0, initRect.x); initRect.y Math.max(0, initRect.y); initRect.width Math.max(1, initRect.width); initRect.height Math.max(1, initRect.height); multiTracker.add(tracker, frame, initRect); // 必须用校验后的 rect5. 验证与性能调优如何确认 SIFT 真正在 ARM 设备上跑起来5.1 最小可验证单元MVU5 行代码测通 SIFT在Activity中写一个按钮点击事件执行以下逻辑务必在子线程避免 ANRnew Thread(() - { try { // 1. 加载一张 640x480 灰度图assets 中放 test.jpg Mat img Utils.loadResource(this, R.drawable.test); Imgproc.cvtColor(img, img, Imgproc.COLOR_RGBA2GRAY); // 2. 创建 SIFT非空即成功 SIFT sift SIFT.create(0, 3, 0.04, 10.0, 1.6); // 参数含义见下表 // 3. 检测关键点耗时主因 MatOfKeyPoint keypoints new MatOfKeyPoint(); long t0 System.nanoTime(); sift.detect(img, keypoints); long t1 System.nanoTime(); Log.d(SIFT, Detected keypoints.toArray().length points in (t1-t0)/1e6 ms); // 4. 计算描述子可选 Mat descriptors new Mat(); sift.compute(img, keypoints, descriptors); Log.d(SIFT, Descriptors: descriptors.size()); runOnUiThread(() - Toast.makeText(this, SIFT OK: keypoints.toArray().length pts, Toast.LENGTH_SHORT).show()); } catch (Exception e) { Log.e(SIFT, Failed, e); runOnUiThread(() - Toast.makeText(this, SIFT FAIL: e.getMessage(), Toast.LENGTH_LONG).show()); } }).start();若看到SIFT OK: 127 pts说明全流程打通。若卡在detect()超过 2 秒进入下一步调优。5.2 SIFT 参数与 ARM 性能对照表实测 armeabi-v7a / 1.2GHz Cortex-A7参数名含义推荐值平衡精度/速度127 pts 耗时ms备注nfeatures最大关键点数0自动18000表示不限但实际受图像尺寸限制nOctaveLayers每组 octave 的层数318002降至 1200ms但重复率↑30%contrastThreshold对比度阈值0.0418000.02使点数翻倍耗时400msedgeThreshold边缘响应阈值10.018005.0使点数25%耗时150mssigma初始高斯模糊系数1.618000.8使点数15%耗时80ms提示在低端设备如 Cortex-A7上永远不要设nfeatures 0。OpenCV 的nfeatures限制是后处理裁剪检测阶段仍全量计算白费 CPU。用MatOfKeyPoint.toArray()后手动取前 N 个更高效。5.3 内存与线程安全为什么连续调用 SIFT 会 OOMSIFT对象内部持有大量临时Mat如高斯金字塔OpenCV 3.3.0 的cv::Ptr在 Java 层 GC 时不保证立即释放 native 内存。若每帧都new SIFT()内存泄漏不可避免。我的固定写法// Activity 成员变量复用 private SIFT sift; private MatOfKeyPoint keypoints new MatOfKeyPoint(); private Mat descriptors new Mat(); Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sift SIFT.create(); // 仅创建一次 } // onCameraFrame 回调中 public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { Mat frame inputFrame.gray(); // 已是 CV_8UC1 keypoints.release(); // 显式清空 descriptors.release(); sift.detect(frame, keypoints); sift.compute(frame, keypoints, descriptors); return frame; }keypoints.release()和descriptors.release()是关键——它触发 nativeMat的deallocate()避免MatOfKeyPoint的ListKeyPoint在 Java 层堆积。这是 OpenCV4Android-3.3.0 的黑匣子不调就等着OutOfMemoryError: pthread_create (1040KB stack) failed: Try again吧。我踩过最深的坑是以为SIFT.create()很轻量结果在 1080p 摄像头下 3 秒就 OOM。后来发现release()调用时机比创建时机重要十倍。现在我的所有 OpenCV 对象都遵循「成员变量 显式 release」模式再没翻过车。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Java接口与抽象类怎么选?从语法区别到实战设计原则一次讲透

Java接口与抽象类怎么选?从语法区别到实战设计原则一次讲透

1. 面试题背后的真实考点 如果你正打算跳槽,或者刚面完几家公司,大概率遇到过这个问题。Java 中接口和抽象类的区别是什么?怎么选择? 很多人的第一反应是:接口用 implements,抽象类用 extends;…

2026/10/13 14:29:38 阅读更多 →
Java接口和抽象类怎么选?从语法区别到设计实践

Java接口和抽象类怎么选?从语法区别到设计实践

面试官:Java 中接口和抽象类的区别是什么?怎么选择? 这道题几乎是 Java 面试的“送分题”,但也是“送命题”。说送分,是因为只要背过八股文的人都能吐出几句:接口用 implements,抽象类用 exten…

2026/10/13 14:29:38 阅读更多 →
商业秘密侵权纠纷中“不为公众所知悉”的秘密性认定与整体性判断

商业秘密侵权纠纷中“不为公众所知悉”的秘密性认定与整体性判断

商业秘密案件里,最让权利人头疼的往往不是证据多不多,而是被告一句“你这些东西早就公开了,还谈什么秘密”。我处理过不少技术秘密纠纷,“不为公众所知悉”这六个字,几乎就是整场诉讼的胜负手。最近我完整复盘了一个老…

2026/10/13 14:29:38 阅读更多 →

最新新闻

fabric.js画布编辑器实战:从zip解包到高效避坑指南

fabric.js画布编辑器实战:从zip解包到高效避坑指南

简介:面向前端开发者的 Fabric.js 源代码压缩包,专注于解决 HTML5 Canvas 原生 API 在图形绘制和交互上较为底层、繁琐的问题。包内含完整的 Fabric.js 库文件,以及配套的 SVG 素材、PNG 图像、测试样例与配置文件,共 307 个文件&…

2026/10/13 15:20:55 阅读更多 →
QT自助点餐系统源码解析:从架构到避坑的完整指南

QT自助点餐系统源码解析:从架构到避坑的完整指南

简介:这是一份基于QT框架开发的自助点餐系统源码,面向餐饮行业应用开发学习者与C/QT进阶开发者,可用于理解触摸屏点餐、菜单浏览、下单与支付等完整业务流程的实现思路。资源包共23个文件,约23KB,以6个cpp源文件、6个h…

2026/10/13 15:20:55 阅读更多 →
DeepSeek论文AI率98%降到8%:四轮实操与学术写作降AIGC检测全流程

DeepSeek论文AI率98%降到8%:四轮实操与学术写作降AIGC检测全流程

你花了大半天时间,用DeepSeek把论文初稿整体过了一遍,逻辑清晰、段落整齐,心里还挺满意。结果顺手丢进查重平台一看,AI率98%,直接红得发黑。我最初遇到这个数字时,第一反应是检测平台坏了,后来拿…

2026/10/13 15:20:55 阅读更多 →
西门子杯流程行业自动化:PID整定与联锁开车程序的实战避坑手册

西门子杯流程行业自动化:PID整定与联锁开车程序的实战避坑手册

简介:面向西门子杯流程行业自动化竞赛参与者及PCS7系统学习者,这份资源收录了完整的流程行业自动化项目程序包。内容围绕西门子PCS7过程控制系统的实际应用展开,涵盖控制程序配置、过程数据库、运行日志、标签索引等多类工程文件,…

2026/10/13 15:20:55 阅读更多 →
51单片机Modbus RTU从机实战:从零实现可被轮询的工业通信

51单片机Modbus RTU从机实战:从零实现可被轮询的工业通信

简介:这份资源面向嵌入式初学者与工业自动化方向的开发者,提供在51单片机上实现Modbus通信协议的完整实例代码,帮助解决串口通信配置、协议解析与主从交互等实际问题。压缩包共21个文件,约57KB,包含2个c源文件与2个h头…

2026/10/13 15:20:55 阅读更多 →
健康管理平台PRD:状态机、字段字典与接口契约实战解析

健康管理平台PRD:状态机、字段字典与接口契约实战解析

简介:这是一份传智健康管理系统的产品需求文档,面向产品经理、需求分析师及系统设计人员。文档围绕数据结构管理展开,详细定义健康评估指标的关键字段——序号、指标名称、参考值、单位、针对性别,并明确用户(病人&…

2026/10/13 15:19:55 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →