SmartOpenCV
SmartOpenCV 是一款专为 Android 平台打造的 OpenCV 增强库,旨在解决官方 SDK 在摄像头图像预览方面的诸多痛点。在移动端智能视觉应用开发中,开发者常受限于官方预览组件默认横屏且无法调整、画面出现黑边偏移、以及自动选择的分辨率导致图像无法铺满屏幕等问题。SmartOpenCV 无需修改 OpenCV 源码,也与官方 SDK 解耦,开发者只需在布局文件中将原有的 JavaCameraView 替换为 SmartOpenCV 提供的视图组件,即可立即获得更完美的预览体验。
该工具特别适合从事 Android 计算机视觉开发的工程师使用。其核心技术亮点包括:智能自适应预览方向与尺寸,能自动适配前后摄像头及横竖屏切换;提供可扩展的策略接口,允许开发者根据业务需求自定义绘制算法和分辨率选择逻辑;额外支持 USB 外接摄像头,拓宽了应用场景。此外,SmartOpenCV 还封装了友好的 Fluent API,通过统一的配置类简化了复杂参数的设置。由于不直接依赖特定版本的官方 SDK,它在保持功能兼容的同时,也极大地方便了后续对 OpenCV 版本的升级与维护,是提升 Android 端视觉应用开发效率的实用利器。
使用场景
某安防团队正在开发一款基于 Android 平板的智能门禁系统,需实时调用摄像头进行人脸识别与活体检测。
没有 SmartOpenCV 时
- 预览方向错乱:设备在竖屏安装时,摄像头画面默认强制横屏显示,且官方 SDK 缺乏接口修正,导致用户面对歪斜的画面无法配合识别。
- 画面出现黑边:由于默认绘制算法存在坐标偏移,视频流无法铺满 SurfaceView 控件,四周出现明显黑边,严重压缩了有效识别区域。
- 分辨率适配差:默认的帧大小选择策略倾向于“小于控件的最大值”,导致在高密度屏幕上预览图像过小,远距离人脸细节模糊,识别率大幅下降。
- 外设兼容困难:项目需支持闸机上的 USB 摄像头,但官方 SDK 仅针对内置相机优化,接入外置设备时需大量修改底层源码才能调试通。
使用 SmartOpenCV 后
- 自动自适应方向:仅需将 XML 中的视图替换为
CameraPreview,SmartOpenCV 即自动根据设备姿态和摄像头类型调整画面方向,无需编写额外适配代码。 - 全屏无黑边显示:内置优化的绘制算法自动计算偏移量,确保视频流完美填充整个控件区域,最大化利用屏幕空间展示人脸细节。
- 智能分辨率策略:提供可自定义的帧大小计算接口,团队将其调整为“最接近控件尺寸”的策略,显著提升了预览清晰度与识别准确率。
- 无缝支持 USB 相机:直接复用现有逻辑即可兼容 USB 摄像头,解决了闸机场景下的外设接入难题,且完全无需修改 OpenCV 原始源码。
SmartOpenCV 通过解耦增强与自动化适配,让开发者从繁琐的底层图形调试中解放,专注于核心业务逻辑的实现。
运行环境要求
- Android
未说明
未说明

快速开始
SmartOpenCV
前言
:fire: :fire: :fire: 随着人工智能的快速发展以及终端设备硬件水平的不断提升,在终端设备上直接运行智能系统成为可能,端侧智能具备低延时,隐私安全等特点。同时降低了云端智能存在的网络传输不可靠风险,使得端侧智能越来越得到重视。端侧智能比较成熟的领域就是NLP以及CV。在CV领域OpenCV作为开源且强大的跨平台计算机视觉库,在图像处理以及图像识别方向得到了广泛应用。但是在Android平台OpenCV官方SDK在图像预览方面存在诸多缺陷。
SmartOpenCV是什么
SmartOpenCV是一个OpenCV在Android端的增强库,解决了OpenCV Android SDK在图像预览方面存在的诸多问题,而且无需修改OpenCV SDK源码,与OpenCV的SDK解耦,只需替换xml中原OpenCV的JavaCameraView/JavaCamera2View即可达到具备OpenCV官方SDK的原功能以及SmartOpenCV的增强功能。
OpenCV官方SDK存在的问题
OpenCV Android端SDK虽然很容易上手和使用,但是预览存在很多问题,常见问题如下:
默认横屏显示,且无法通过接口修改预览方向
预览绘制存在黑边:OpenCV默认绘制算法在绘制预览帧图像到Canvas时存在一定的偏移,在视觉上表现就是预览帧只会占SurfaceView控件的一部分区域,偏移部分区域会显示为黑色
if (mScale != 0) { canvas.drawBitmap(mCacheBitmap, new Rect(0, 0, mCacheBitmap.getWidth(), mCacheBitmap.getHeight()), new Rect((int) ((canvas.getWidth() - mScale * mCacheBitmap.getWidth()) / 2), (int) ((canvas.getHeight() - mScale * mCacheBitmap.getHeight()) / 2), (int) ((canvas.getWidth() - mScale * mCacheBitmap.getWidth()) / 2 + mScale * mCacheBitmap.getWidth()), (int) ((canvas.getHeight() - mScale * mCacheBitmap.getHeight()) / 2 + mScale * mCacheBitmap.getHeight())), null); } else { canvas.drawBitmap(mCacheBitmap, new Rect(0, 0, mCacheBitmap.getWidth(), mCacheBitmap.getHeight()), new Rect((canvas.getWidth() - mCacheBitmap.getWidth()) / 2, (canvas.getHeight() - mCacheBitmap.getHeight()) / 2, (canvas.getWidth() - mCacheBitmap.getWidth()) / 2 + mCacheBitmap.getWidth(), (canvas.getHeight() - mCacheBitmap.getHeight()) / 2 + mCacheBitmap.getHeight()), null); }预览帧大小选择算法不符合实际场景要求:对于预览帧大小的选择,OpenCV默认算法是选择小于预览控件(或设置的最大帧大小)的最大预览,这将导致在很多情况下预览图像的显示不能铺满整个控件甚至远小于控件大小, 在绝大部分业务场景下,这种算法不能满足实际需求
protected Size calculateCameraFrameSize(List<?> supportedSizes, ListItemAccessor accessor, int surfaceWidth, int surfaceHeight) { int calcWidth = 0; int calcHeight = 0; int maxAllowedWidth = (mMaxWidth != MAX_UNSPECIFIED && mMaxWidth < surfaceWidth)? mMaxWidth : surfaceWidth; int maxAllowedHeight = (mMaxHeight != MAX_UNSPECIFIED && mMaxHeight < surfaceHeight)? mMaxHeight : surfaceHeight; for (Object size : supportedSizes) { int width = accessor.getWidth(size); int height = accessor.getHeight(size); Log.d(TAG, "trying size: " + width + "x" + height); if (width <= maxAllowedWidth && height <= maxAllowedHeight) { if (width >= calcWidth && height >= calcHeight) { calcWidth = (int) width; calcHeight = (int) height; } } } if ((calcWidth == 0 || calcHeight == 0) && supportedSizes.size() > 0) { Log.i(TAG, "fallback to the first frame size"); Object size = supportedSizes.get(0); calcWidth = accessor.getWidth(size); calcHeight = accessor.getHeight(size); } return new Size(calcWidth, calcHeight); }
SmartOpenCV的特点
易使用:如果你项目中之前使用的是OpenCV的官方SDK,那么引入SmartOpenCV后只需将xml文件中的
JavaCameraView/JavaCamera2View替换为SmartOpenCV的CamerPreview/Camera2Preview即可达到与使用官方SDK相同的效果功能增强:
- 预览自适应:自动根据前后摄像头,横竖屏以及不同摄像头参数来调整与适配预览方向以及大小,开发者无需写任何额外代码
- 可扩展预览绘制算法:SmartOpenCV内置了一种默认的预览帧绘制算法,同时提供策略接口让开发者根据自己的业务场景自定义预览绘制算法
- 可扩展预览帧大小选择算法:SmartOpenCV内置了一种默认的预览帧大小计算算法,同时提供策略接口让开发者根据自己的业务自定义预览帧大小计算算法
- 支持USB摄像头:USB摄像头作为外设接入设备,和手机/平板等移动设备内置摄像头存在差异,SDK内部在处理移动设备摄像头的逻辑时也兼容了对闸机等的USB摄像头的处理
提供更友好的API接口:在继承OpenCV官方接口的同时,SmartOpenCV将众多繁杂操作统一通过CameraConfiguration来配置,提供更友好的Fluent API接口,让开发者能够更灵活的控制预览显示相关参数与配置
不直接依赖官方SDK,方便升级官方SDK:与OpenCV官方SDK解耦,只要官方SDK内部核心逻辑未做修改,那么SmartOpenCV可以兼容所有版本的官方SDK,使用SmartOpenCV后如果以后打算升级依赖的OpenCV为更新版本,只需将OpenCV的依赖更新为新版本即可,代码无需做任何改动
效果对比
以人脸识别为例
| 横屏 | 竖屏 | |
|---|---|---|
| OpenCV | 即使宽与高都设置为match_parent也无法全屏,存在黑边 ![]() |
存在黑边,且默认不支持竖屏 ![]() |
| SmartOpenCV | ![]() |
![]() |
Demo对比体验
smartopencv-app-debug.apk
opencv-app-debug.apk
Integration
Step1:在项目根目录的build.gradle中添加对jitpack仓库的配置
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Step2:在需要使用SmartOpenCV库的模块中添加依赖
dependencies {
implementation('com.github.HuTianQi:SmartOpenCV:1.0.1') { // 版本号建议使用已release的最新版本
exclude module: 'openCVLibrary411' // 由于目前多模块依赖时jitpack打包存在bug,排除打包时依赖的该模块
}
}
使用方法
基础用法
在项目中需要使用预览的XML文件中,将OpenCV的JavaCameraView/JavaCamera2View替换为SmartOpenCV的CameraPreview/Camera2Preview即可,非常简单,无需进行其他任何操作。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--<org.opencv.android.JavaCameraView-->
<!--android:id="@+id/fd_activity_surface_view"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="match_parent" />-->
<tech.huqi.smartopencv.core.preview.CameraPreview
android:id="@+id/fd_activity_surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
高级用法
如果希望通过SmartOpenCV提供的接口更灵活地控制预览显示的相关参数与配置,只需调用SmartOpenCV.getInstance().init()并传入之前获取的预览控件对象即可,用法如下:
SmartOpenCV.getInstance().init(mOpenCvCameraView, new CameraConfiguration.Builder()
.debug(true)
.cameraIndex(0) // 设置摄像头索引,主要用于多摄像头设备,优先级低于frontCamera
.keepScreenOn(false) // 是否保持屏幕常亮
.frontCamera(true) // 是否使用前置摄像头
.openCvDefaultDrawStrategy(false) // 是否使用OpenCV默认的预览图像绘制策略
.openCvDefaultPreviewCalculator(false) // 是否使用OpenCV默认的预览帧大小计算策略
.landscape(false) // 是否横屏显示
.enableFpsMeter(true) // 开启预览帧率的显示
.usbCamera(false) // 是否使用USB摄像头,当设备接入的是USB摄像头时将其设置为true
.maxFrameSize(400, 300) // 设置预览帧的最大大小
.cvCameraViewListener(this) // 设置OpenCV回调监听器
.previewSizeCalculator(new IPreviewSizeCalculator() { // 自定义预览帧大小计算策略
@Override
public Size calculateCameraFrameSize(List<Size> supportedSizes, int surfaceWidth, int surfaceHeight) {
// 若需要根据自己的具体业务场景改写览帧大小,覆写该方法逻辑
return new Size(1080,1920);
}
})
.drawStrategy(new IDrawStrategy() { // 自定义绘制策略
@Override
public void drawBitmap(Canvas canvas, Bitmap frameBitmap, int surfaceWidth, int surfaceHeight) {
// 若需根据自己的具体业务场景绘制预览帧图像,覆写该方法逻辑
}
})
.build());
许可证
公众号

版本历史
1.0.12020/04/07常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
opencode
OpenCode 是一款开源的 AI 编程助手(Coding Agent),旨在像一位智能搭档一样融入您的开发流程。它不仅仅是一个代码补全插件,而是一个能够理解项目上下文、自主规划任务并执行复杂编码操作的智能体。无论是生成全新功能、重构现有代码,还是排查难以定位的 Bug,OpenCode 都能通过自然语言交互高效完成,显著减少开发者在重复性劳动和上下文切换上的时间消耗。 这款工具专为软件开发者、工程师及技术研究人员设计,特别适合希望利用大模型能力来提升编码效率、加速原型开发或处理遗留代码维护的专业人群。其核心亮点在于完全开源的架构,这意味着用户可以审查代码逻辑、自定义行为策略,甚至私有化部署以保障数据安全,彻底打破了传统闭源 AI 助手的“黑盒”限制。 在技术体验上,OpenCode 提供了灵活的终端界面(Terminal UI)和正在测试中的桌面应用程序,支持 macOS、Windows 及 Linux 全平台。它兼容多种包管理工具,安装便捷,并能无缝集成到现有的开发环境中。无论您是追求极致控制权的资深极客,还是渴望提升产出的独立开发者,OpenCode 都提供了一个透明、可信
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。



