
مع التطور السريع للذكاء الاصطناعي والتحسين المستمر لمستوى الأجهزة للمعدات الطرفية ، من الممكن تشغيل أنظمة ذكية مباشرة على المعدات الطرفية. في الوقت نفسه ، فإنه يقلل من خطر انتقال الشبكة غير الموثوق به في الذكاء السحابي ، مما يجعل الذكاء النهائي أكثر وأكثر اهتمامًا. المناطق الأكثر نضجا من الذكاء في الجانب النهائي هي NLP و CV. في مجال السيرة الذاتية ، يعد OpenCV مكتبة رؤية كمبيوتر متشابكة مفتوحة وقوية ، وقد تم استخدامها على نطاق واسع في معالجة الصور والتعرف على الصور. ومع ذلك ، فإن منصة Android الرسمية OpenCV SDK لديها العديد من العيوب في معاينة الصور.
SmartOpencv هي مكتبة محسّنة لـ OpenCV على جانب Android ، والتي تحل العديد من المشكلات في معاينة JavaCameraView لـ OpenCV Android SDK. JavaCamera2View من XML Zhonglin OpenCV.
على الرغم من أن OpenCV Android SDK سهل الاستخدام والاستخدام ، إلا أن هناك العديد من المشكلات في المعاينة ، والمشاكل الشائعة هي كما يلي:
يتم عرض الشاشة الأفقية الافتراضية ، ولا يمكن تعديل اتجاه المعاينة من خلال الواجهة
هناك حافة سوداء في رسم المعاينة : تحتوي خوارزمية الرسم الافتراضية على 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 من SmartOpencv .
تعزيز الميزة :
توفير واجهة API أكثر ودية : في حين يرث واجهة OpenCV الرسمية ، فإن SmartOpenCV تكوين العديد من العمليات المعقدة من خلال تكوين الكاميرات ، مما يوفر واجهة API بطلاقة أكثر ودية ، مما يسمح للمطورين بالتحكم في المعلمات والتكوينات ذات الصلة بشكل أكثر بمرونة.
لا تعتمد مباشرة على SDK الرسمي لتسهيل ترقية SDK الرسمي : مفصل من SDK الرسمي لـ OpenCV. .
| الشاشة الأفقية | الشاشة الرأسية | |
|---|---|---|
| OpenCV | حتى إذا تم تعيين كل من العرض والارتفاع على match_parent ، لا يمكن أن تكون الشاشة ملء الشاشة ، وهناك حافة سوداء. ![]() | هناك حافة سوداء ، والشاشة العمودية غير مدعومة بشكل افتراضي ![]() |
| SmartOpencv | ![]() | ![]() |
Smartopencv-app-debug.apk
opencv-app-debug.apk
Step1: أضف التكوين إلى مستودع JitPack في Build.gradle في دليل جذر المشروع
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Step2: أضف تبعيات في الوحدات النمطية التي تحتاج إلى استخدام مكتبة 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 ());رخصة
