
Благодаря быстрому развитию искусственного интеллекта и постоянного улучшения аппаратного уровня терминального оборудования можно напрямую запускать интеллектуальные системы на терминальном оборудовании. В то же время, это снижает риск ненадежной передачи сети в облачном интеллекте, что делает более и больше внимания интеллекта конечной стороны. Более зрелыми областями интеллекта конечной стороны являются NLP и CV. В области CV OpenCV является открытым исходным кодом и мощной кроссплатформенной библиотекой компьютерных зрений и широко используется в обработке изображений и распознавании изображений. Тем не менее, официальная платформа Android OpenCV SDK имеет много недостатков в предварительном просмотре изображений.
SmartoPencv - это улучшенная библиотека для OpenCV на стороне Android, которая решает много проблем в предварительном JavaCameraView изображения Android SDK Open JavaCamera2View XML Zhonglin OpenCV.
Хотя Android SDK OpenCV прост в использовании и использовании, есть много проблем с предварительным просмотром, и общие проблемы заключаются в следующем:
Отображается горизонтальный экран по умолчанию, и направление предварительного просмотра не может быть изменено через интерфейс
В рисунке предварительного просмотра есть черный край : Алгоритм рисования по умолчанию OpenCV имеет определенное смещение, когда рисунок предварительно просмотр изображений в холст.
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 );
} Легкий в использовании : если вы использовали официальный SDK OpenCV в своем проекте, после введения SmartOpenCV, вам нужно только заменить JavaCameraView / JavaCamera2View в файле XML с помощью CamerPreview / Camera2Preview Полем
Улучшение функции :
Предоставьте более дружественный интерфейс API : в то время как унаследовав официальный интерфейс OpenCV, SmartOpenCV настраивает многие сложные операции с помощью камераконфигурации, обеспечивая более дружелюбный интерфейс API, позволяя разработчикам более гибко управлять предварительным просмотром и отображать параметры и конфигурации.
Не полагайтесь непосредственно на официальный SDK, чтобы облегчить модернизацию официального SDK : отделен от официального SDK OpenCV. I. После использования SmartOpenCV, если вы планируете обновить зависимый OpenCV в будущем, он будет обновлен.
| Горизонтальный экран | Вертикальный экран | |
|---|---|---|
| OpenCV | Даже если как ширина, так и высота установлены в Match_parent, полный экран не может быть полноэкранным, и есть черный край. ![]() | Есть черный край, а вертикальный экран не поддерживается по умолчанию ![]() |
| Smartopencv | ![]() | ![]() |
SmartoPencv-app-debug.apk
opencv-app-debug.apk
Шаг 1: Добавьте конфигурацию в репозиторий Jitpack в Build.Gradle в корневом каталоге проекта
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Шаг 2: Добавьте зависимости в модулях, которые необходимо использовать библиотеку SmartOpenCV
dependencies {
implementation('com.github.HuTianQi:SmartOpenCV:1.0.1') { // 版本号建议使用已release的最新版本
exclude module: 'openCVLibrary411' // 由于目前多模块依赖时jitpack打包存在bug,排除打包时依赖的该模块
}
}
Вам необходимо использовать предварительный просмотр XML в проекте, чтобы заменить JavaCameraView / JavaCamera2View SmartoPencv и использовать CameraPreview / Camera2Preview 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 > Если вы планируете использовать интерфейс, предоставленный 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 ());ЛИЦЕНЗИЯ
