
Com o rápido desenvolvimento da inteligência artificial e a melhoria contínua do nível de hardware do equipamento terminal, é possível executar diretamente sistemas inteligentes em equipamentos de terminal. Ao mesmo tempo, reduz o risco de transmissão de rede não confiável na inteligência em nuvem, tornando cada vez mais a inteligência do lado final. As áreas mais maduras da inteligência do lado final são PNL e CV. No campo do CV, o OpenCV é uma biblioteca de visão computacional de código aberto e poderosa plataforma cruzada e tem sido amplamente utilizado no processamento de imagens e no reconhecimento de imagem. No entanto, a plataforma oficial do Android OpenCV SDK tem muitas falhas na visualização de imagens.
JavaCameraView SmartOPENCV é uma biblioteca aprimorada para o OpenCV no lado Android, que resolve muitos problemas na visualização da imagem do OpenCV Android SDK. JavaCamera2View do XML Zhonglin OpenCV.
Embora o OpenCV Android SDK seja fácil de usar e usar, há muitos problemas com a visualização, e os problemas comuns são os seguintes:
A tela horizontal padrão é exibida e a direção da visualização não pode ser modificada através da interface
Há uma borda preta no desenho de visualização : o algoritmo de desenho padrão do OpenCV possui um determinado deslocamento ao desenhar imagens de quadro de visualização para tela.
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 );
}O algoritmo de seleção do tamanho do quadro de visualização não atende aos requisitos reais da cena : para a seleção do tamanho do quadro de visualização, o algoritmo OpenCV padrão é selecionar a visualização máxima menor que o controle de visualização (ou o tamanho máximo do quadro), que será Faça com que a imagem de visualização seja exibida em muitos 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 : se você usou o SDK oficial do OpenCV em seu projeto, depois de introduzir o SmartOpencV, só precisa substituir JavaCameraView / JavaCamera2View no arquivo XML pelo CamerPreview / Camera2Preview do SmartOpencv para obter o mesmo efeito que usando o SDK oficial .
Aprimoramento de recursos :
Forneça uma interface API mais amigável : ao herdar a interface OpenCV oficial, o SmartOpencV configura muitas operações complicadas por meio da Cameraconfiguration, fornecendo uma interface API fluente mais amigável, permitindo que os desenvolvedores controlem mais flexibilidade, visualizem e exibam parâmetros e configurações relacionadas.
Não confie diretamente no SDK oficial para facilitar a atualização do SDK oficial : dissociado do SDK oficial do OpenCV. Depois de usar o SmartOpencv, se você planeja atualizar o OpenCV dependente no futuro, ele será atualizado.
| Tela horizontal | Tela vertical | |
|---|---|---|
| OpenEncv | Mesmo que a largura e a altura estejam definidas como match_parent, a tela cheia não pode ser uma tela cheia e há uma borda preta. ![]() | Há uma borda preta e a tela vertical não é suportada por padrão ![]() |
| SmartOpencv | ![]() | ![]() |
SmartOpencv-Ap-dep-debug.apk
OpenCV-app-debug.apk
Etapa 1: Adicione a configuração ao repositório Jitpack no Build.gradle no diretório raiz do projeto
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Etapa2: Adicione dependências em módulos que precisam usar a biblioteca SmartOpenCV
dependencies {
implementation('com.github.HuTianQi:SmartOpenCV:1.0.1') { // 版本号建议使用已release的最新版本
exclude module: 'openCVLibrary411' // 由于目前多模块依赖时jitpack打包存在bug,排除打包时依赖的该模块
}
}
Você precisa usar o XML de visualização no projeto para substituir o JavaCameraView / JavaCamera2View do SmartOpencv e usar o CameraPreview / Camera2Preview do 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 > Se você planeja usar a interface fornecida pelo SmartOpencv para controlar com mais flexibilidade os parâmetros e configurações relacionados à exibição de visualização, ligue para SmartOpenCV.getInstance().init() para passar no objeto de controle de visualização obtido 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 ());LICENÇA
