
Con el rápido desarrollo de la inteligencia artificial y la mejora continua del nivel de hardware del equipo terminal, es posible ejecutar directamente sistemas inteligentes en el equipo terminal. Al mismo tiempo, reduce el riesgo de transmisión de red poco confiable en la inteligencia de la nube, lo que hace que la inteligencia del lado final sea más y más atención. Las áreas más maduras de la inteligencia del lado final son NLP y CV. En el campo de CV, OpenCV es un código abierto y una potente biblioteca de visión por computadora multiplataforma, y se ha utilizado ampliamente en el procesamiento de imágenes y el reconocimiento de imágenes. Sin embargo, la plataforma Android oficial OpenCV SDK tiene muchos defectos en la vista previa de imágenes.
SmartOpENCV es una biblioteca mejorada para OpenCV en el lado de Android, que resuelve muchos problemas en la vista previa de la JavaCameraView del SDK de OpenCV Android. JavaCamera2View del XML Zhonglin OpenCV.
Aunque el SDK de Android OpenCV es fácil de usar y usar, hay muchos problemas con la vista previa, y los problemas comunes son los siguientes:
Se muestra la pantalla horizontal predeterminada y la dirección de vista previa no se puede modificar a través de la interfaz
Hay un borde negro en el dibujo de vista previa : el algoritmo de dibujo predeterminado de OpenCV tiene un cierto desplazamiento al dibujar imágenes de marco de vista previa al lienzo, el marco de vista previa solo ocupará parte del control SurfaceView, y el área de compensación se mostrará como negra.
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 );
}El algoritmo de selección de tamaño de marco de vista previa no cumple con los requisitos reales de la escena : para la selección del tamaño del marco de vista previa, el algoritmo OpenCV predeterminado es seleccionar la vista previa máxima que es más pequeña que el control de vista previa (o el conjunto de tamaño de marco máximo), que Will Will Haga que la imagen de vista previa se muestre en muchos casos.
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 );
} Fácil de usar : si usó el SDK oficial de OpenCV en su proyecto, después de presentar SmartOpenCV, solo necesita reemplazar JavaCameraView / JavaCamera2View en el archivo XML con CamerPreview / Camera2Preview de Smartopencv para lograr el mismo efecto que utilizando el SDK oficial .
Mejora de características :
Proporcione una interfaz API más amigable : mientras hereda la interfaz OpenCV oficial, SmartOpenCV configura muchas operaciones complicadas a través de Cameraconfiguration, proporcionando una interfaz API con fluidez más amigable, lo que permite a los desarrolladores controlar de manera más flexible la vista previa y mostrar parámetros y configuraciones relacionadas.
No confíe directamente en el SDK oficial para facilitar la actualización del SDK oficial : desacoplado del SDK oficial de OpenCV. . Después de usar SmartOpencv, si planea actualizar el dependiente OpenCV en el futuro, se actualizará.
| Pantalla horizontal | Pantalla vertical | |
|---|---|---|
| Opencvv | Incluso si tanto el ancho como la altura están configurados en Match_parent, la pantalla completa no puede ser una pantalla completa y hay un borde negro. ![]() | Hay un borde negro, y la pantalla vertical no es compatible de forma predeterminada ![]() |
| Smartopencv | ![]() | ![]() |
smartopencv-app-debug.apk
opencv-app-debug.apk
Paso 1: Agregue la configuración al repositorio jitpack en la compilación.
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Paso 2: Agregar dependencias en módulos que necesitan usar la biblioteca SmartOpenCV
dependencies {
implementation('com.github.HuTianQi:SmartOpenCV:1.0.1') { // 版本号建议使用已release的最新版本
exclude module: 'openCVLibrary411' // 由于目前多模块依赖时jitpack打包存在bug,排除打包时依赖的该模块
}
}
Debe utilizar el XML de vista previa en el proyecto para reemplazar el JavaCameraView / JavaCamera2View de SmartOpencv y usar CameraPreview / Camera2Preview de OpenCV.
< 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 > Si planea utilizar la interfaz proporcionada por SmartOpENCV para controlar de manera más flexible la vista previa de parámetros y configuraciones relacionados, entonces llame a SmartOpenCV.getInstance().init() para pasar el objeto de control previo obtenido anteriormente.
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 ());LICENCIA
