← 开源
HuTianQi

SmartOpenCV

:fire: :fire: :fire: SmartOpenCV是一个OpenCV在Android端的增强库,解决了OpenCV Android SDK在图像预览方面存在的诸多问题,且无需修改OpenCV SDK源码,与OpenCV的SDK解耦

InfrastructureKernelsC++
在 GitHub 打开
增长势头
+-124 小时新增 Star-0.1%
1.96k
Star
509
Fork
+0
本周
1
贡献者
创建于 2016-11-13 · 更新于 2026-10-16 · 今日第 18767 名
主要开发者
HuTianQi

HuTianQi/SmartOpenCV 排名第 18,767,有 1,960 个星标。

同类别比较

HuTianQi/SmartOpenCV 排名第 18,767,此处有 8 个同类条目;NVIDIA/Stable-Diffusion-WebUI-TensorRT 排名第 18,765。

同类别比较
名称排名指标
instill-ai/instill-core18,716
语言:
Python
星标数:
2,317
分叉数:
127
简介:
🔮 Instill Core is a full-stack AI infrastructure tool for data, model and pipeline orchestration, designed to streamline every aspect of building versatile AI-first applications
aws/sagemaker-python-sdk18,721
语言:
Python
星标数:
2,269
分叉数:
1,316
简介:
A library for training and deploying machine learning models on Amazon SageMaker
666DZY666/micronet18,724
语言:
Python
星标数:
2,262
分叉数:
469
简介:
micronet, a model compression and deploy lib. compression: 1、quantization: quantization-aware-training(QAT), High-Bit(>2b)(DoReFa/Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference)、Low-Bit(≤2b)/Ternary and Binary(TWN/BNN/XNOR-Net); post-training-quantization(PTQ), 8-bit(tensorrt); 2、 pruning: normal、regular and group convolutional channel pruning; 3、 group convolution structure; 4、batch-normalization fuse for quantization. deploy: tensorrt, fp32/fp16/int8(ptq-calibration)、op-adapt(upsample)、dynamic_shape
NVIDIA/Stable-Diffusion-WebUI-TensorRT18,765
语言:
Python
星标数:
1,981
分叉数:
164
简介:
TensorRT Extension for Stable Diffusion Web UI
NVIDIA/aistore18,770
语言:
Go
星标数:
1,946
分叉数:
289
简介:
AIStore: scalable storage for AI applications
llvm/torch-mlir18,772
语言:
C++
星标数:
1,934
分叉数:
750
简介:
The Torch-MLIR project aims to provide first class support from the PyTorch ecosystem to the MLIR ecosystem.
laugh12321/TensorRT-YOLO18,782
语言:
C++
星标数:
1,891
分叉数:
199
简介:
🚀 Easier & Faster YOLO Deployment Toolkit for NVIDIA 🛠️
facebookresearch/DPR18,785
语言:
Python
星标数:
1,869
分叉数:
310
简介:
Dense Passage Retriever - is a set of tools and models for open domain Q&A task.
关键参数与规格
关键参数与规格
参数值
语言C++
类别Infrastructure
子类别Kernels
星标数1,960
分叉数509
贡献者1
创建日期2016-11-13
更新日期2026-10-16
1 天星标数-1
7 天星标数0
排名18,767
上次排名9,223
排名变化-9,544
7 天星标排名12,205
上次 7 天星标排名7,910
7 天星标排名变化-4,295
总星标排名6,456
上次总星标排名6,445
总星标排名变化-11
国家China
README 摘录

SmartOpenCV 前言 :fire: :fire: :fire: 随着人工智能的快速发展以及终端设备硬件水平的不断提升,在终端设备上直接运行智能系统成为可能,端侧智能具备低延时,隐私安全等特点。 在CV领域OpenCV作为开源且强大的跨

平台计算机视觉库,在图像处理以及图像识别方向得到了广泛应用。 SmartOpenCV是什么 SmartOpenCV是一个OpenCV在Android端的增强库,解决了OpenCV Android SDK在图像预览方面存在的诸多问题,而且无需修改OpenCV SDK源码,与OpenCV的SDK解耦

,只需替换xml中原OpenCV的 / 即可达到具备OpenCV官方SDK的原功能以及SmartOpenCV的增强功能。 OpenCV官方SDK存在的问题 OpenCV Android端SDK虽然很容易上手和使用,但是预览存在很多问题,常见问题如下: **默认横屏显示,且无法通

过接口修改预览方向** **预览绘制存在黑边**:OpenCV默认绘制算法在绘制预览帧图像到Canvas时存在一定的偏移,在视觉上表现就是预览帧只会占SurfaceView控件的一部分区域,偏移部分区域会显示为黑色 **预览帧

大小选择算法不符合实际场景要求**:对于预览帧大小的选择,OpenCV默认算法是选择**小于**预览控件(或设置的最大帧大小)的最大预览,这将导致在很多情况下预览图像的显示不能铺满整个控件甚至

远小于控件大小, 在绝大部分业务场景下,这种算法不能满足实际需求 SmartOpenCV的特点 **易使用**:如果你项目中之前使用的是OpenCV的官方SDK,那么引入SmartOpenCV后只需将xml文件中的 / 替换为SmartOpenCV的 / 即可达到与使用官

方SDK相同的效果 **功能增强**: 1. 预览自适应:自动根

常见问题

记录了多少星标和分叉?

HuTianQi/SmartOpenCV 有 1,960 个星标和 509 个分叉。

仓库排名是多少?

HuTianQi/SmartOpenCV 排名第 18,767。

记录的语言和类别是什么?

HuTianQi/SmartOpenCV 有 1,960 个星标,语言为 C++,类别为 Infrastructure。

哪个仓库排名最接近?

HuTianQi/SmartOpenCV 与 NVIDIA/Stable-Diffusion-WebUI-TensorRT 比较,后者排名第 18,765,有 1,981 个星标。

README

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相同的效果

  • 功能增强:

    1. 预览自适应:自动根据前后摄像头,横竖屏以及不同摄像头参数来调整与适配预览方向以及大小,开发者无需写任何额外代码
    2. 可扩展预览绘制算法:SmartOpenCV内置了一种默认的预览帧绘制算法,同时提供策略接口让开发者根据自己的业务场景自定义预览绘制算法
    3. 可扩展预览帧大小选择算法:SmartOpenCV内置了一种默认的预览帧大小计算算法,同时提供策略接口让开发者根据自己的业务自定义预览帧大小计算算法
    4. 支持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,排除打包时依赖的该模块
    }
}

Usage

基础用法

在项目中需要使用预览的xml中用SmartOpenCV的CameraPreview/Camera2Preview替换OpenCV的JavaCameraView/JavaCamera2View即可,就这么简单,其余的什么都不用做



    
    
    
    

    

高级用法

如果打算通过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 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());

LICENSE

LICENSE

公众号

排名相邻
同类项目