
Avec le développement rapide de l'intelligence artificielle et l'amélioration continue du niveau matériel de l'équipement terminal, il est possible d'exécuter directement des systèmes intelligents sur l'équipement terminal. Dans le même temps, il réduit le risque de transmission de réseau peu fiable dans l'intelligence cloud, ce qui rend plus en plus d'attention de l'intelligence finale. Les zones les plus matures de l'intelligence finale sont la PNL et le CV. Dans le domaine de la CV, OpenCV est une bibliothèque de vision informatique Open Source et puissante et a été largement utilisée dans le traitement d'image et la reconnaissance d'image. Cependant, le SDK officiel de la plate-forme Android OpenCV a de nombreux défauts dans l'aperçu de l'image.
JavaCameraView est une bibliothèque améliorée pour OpenCV du côté Android, qui résout de nombreux problèmes dans l'aperçu du SDK Android OpenCV. JavaCamera2View du XML Zhonglin OpenCV.
Bien que le SDK Android OpenCV soit facile à utiliser et à utiliser, il existe de nombreux problèmes avec l'aperçu et les problèmes courants sont les suivants:
L'écran horizontal par défaut s'affiche et la direction de l'aperçu ne peut pas être modifiée via l'interface
Il y a un bord noir dans le dessin de prévisualisation : l'algorithme de dessin par défaut OpenCV a un certain décalage lors du dessin d'images de trame d'aperçu à Canvas.
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 );
}L'algorithme de sélection de la taille de la trame d'aperçu ne répond pas aux exigences réelles de la scène : pour la sélection de la taille de la trame d'aperçu, l'algorithme OpenCV par défaut consiste à sélectionner l'aperçu maximal qui est plus petit que le contrôle de l'aperçu (ou l'ensemble de taille maximale de trame), qui sera L'image de prévisualisation est affichée dans de nombreux cas.
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 );
} Facile à utiliser : si vous avez utilisé le SDK officiel d'OpenCV dans votre projet, après avoir introduit SmartOpenCV, il vous suffit de remplacer JavaCameraView / JavaCamera2View dans le même fichier XML avec CamerPreview / Camera2Preview .
Amélioration des fonctionnalités :
Fournissez une interface API plus conviviale : tout en héritant de l'interface OpenCV officielle, SmartoPenCV configure de nombreuses opérations compliquées via CamerAraconfiguration, offrant une interface API fluide plus conviviale, permettant aux développeurs de contrôler plus flexible l'aperçu et d'afficher les paramètres et les configurations connexes.
Ne comptez pas directement sur le SDK officiel pour faciliter la mise à niveau du SDK officiel : découplé du SDK officiel de l'OpenCV. .
| Écran horizontal | Écran vertical | |
|---|---|---|
| Opencv | Même si la largeur et la hauteur sont définies sur Match_parent, le plein écran ne peut pas être plein écran et il y a un bord noir. ![]() | Il y a un bord noir et l'écran vertical n'est pas pris en charge par défaut ![]() |
| Smartopencv | ![]() | ![]() |
smartopencv -pp-debug.apk
opencv -pp-debug.apk
Étape 1: Ajouter une configuration au référentiel Jitpack dans la build.gradle dans le répertoire racine du projet
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
ÉTAPE2: Ajouter des dépendances dans les modules qui doivent utiliser la bibliothèque SmartOpenCV
dependencies {
implementation('com.github.HuTianQi:SmartOpenCV:1.0.1') { // 版本号建议使用已release的最新版本
exclude module: 'openCVLibrary411' // 由于目前多模块依赖时jitpack打包存在bug,排除打包时依赖的该模块
}
}
Vous devez utiliser l'aperçu XML dans le projet pour remplacer JavaCameraView / JavaCamera2View de SmartOpencv et utiliser le CameraPreview / Camera2Preview of OpenCVv.
< 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 vous prévoyez d'utiliser l'interface fournie par SmartoPencv pour contrôler plus flexible les paramètres et configurations liés à l'affichage de prévisualisation, appelez SmartOpenCV.getInstance().init() pour passer dans l'objet de contrôle de prévisualisation obtenu plus tôt.
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 ());LICENCE
