
人工知能の急速な発展と、ターミナル機器のハードウェアレベルの継続的な改善により、末端インテリジェンスでインテリジェントシステムを直接実行することができます。同時に、クラウドインテリジェンスにおける信頼できないネットワーク伝送のリスクを減らし、エンドサイドインテリジェンスをますます注目します。エンドサイドインテリジェンスのより成熟した領域は、NLPとCVです。 CVの分野では、OpenCVはオープンソースで強力なクロスプラットフォームコンピュータービジョンライブラリであり、画像処理と画像認識で広く使用されています。ただし、公式のAndroidプラットフォームOpenCV SDKには、画像プレビューに多くの欠陥があります。
SmartOpenCV is an enhanced library for OpenCV on the Android side, which solves many problems in the image preview of the OpenCV Android SDK. There is no need to modify the OpenCV SDK source code and decouple it from the OpenCV SDK. Just replace JavaCameraView / XML Zhonglin OpenCVのJavaCamera2Viewは、公式のOpenCV SDKとSmartOpencvの強化された機能を備えています。
OpenCV Android SDKは使いやすく使用できますが、プレビューには多くの問題があり、一般的な問題は次のとおりです。
デフォルトの水平画面が表示され、プレビュー方向はインターフェイスを介して変更できません
プレビュー描画にはブラックエッジがあります:OpenCVデフォルトの描画アルゴリズムは、視覚的にプレビューフレーム画像を描画するときに特定のオフセットを持ち、プレビューフレームは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 );
}使いやすい:プロジェクトでOPENCVの公式SDKを使用した場合、SmartOpencvを導入した後、XMLファイルのJavaCameraView / JavaCamera2View SmartOpencvのCamerPreview / Camera2Previewに置き換えるだけで、公式のSDKを使用するのと同じ効果と同じ効果を達成する必要があります。 。
機能強化:
よりフレンドリーなAPIインターフェイスを提供する:公式のOPENCVインターフェイスを継承している間、SmartOpencvはカメラコンチュレーションを通じて多くの複雑な操作を構成し、よりフレンドリーな流fluent APIインターフェイスを提供し、開発者がより柔軟にプレビューを制御し、関連するパラメーターと構成を表示できるようにします。
公式のSDKのアップグレードを促進するために公式のSDKに直接依存しないでください:公式SDKの内部コアロジックが変更されていない限り、SmartOpencvは公式のSDKのすべてのバージョンと互換性があります。 SmartOpencvを使用した後、将来的に依存するOpenCVをアップグレードする場合、OpenCVの依存関係を更新します。
| 水平面画面 | 垂直画面 | |
|---|---|---|
| opencv | 幅と高さの両方がMatch_Parentに設定されていても、フル画面はフルスクリーンにすることはできず、黒いエッジがあります。 ![]() | 黒いエッジがあり、垂直画面はデフォルトではサポートされていません ![]() |
| SmartOpencv | ![]() | ![]() |
smartopencv-app-debug.apk
opencv-app-debug.apk
ステップ1:プロジェクトルートディレクトリのbuild.gradleのjitpackリポジトリに構成を追加する
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中用SmartOpenCV的CameraPreview / Camera2Preview替换OpenCV的JavaCameraView / JavaCamera2View即可,就这么简单,其余的什么都不用做
< 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 ());ライセンス
