
ด้วยการพัฒนาอย่างรวดเร็วของปัญญาประดิษฐ์และการปรับปรุงระดับฮาร์ดแวร์อย่างต่อเนื่องของอุปกรณ์เทอร์มินัลเป็นไปได้ที่จะเรียกใช้ระบบอัจฉริยะโดยตรงบนอุปกรณ์เทอร์มินัล ในขณะเดียวกันก็ลดความเสี่ยงของการส่งเครือข่ายที่ไม่น่าเชื่อถือในระบบข่าวกรองคลาวด์ พื้นที่ที่เป็นผู้ใหญ่มากขึ้นของความฉลาดด้านปลายคือ NLP และ CV ในสาขา 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 เพื่อให้ได้ผลเช่นเดียวกับการใช้ SDK อย่างเป็นทางการ .
การปรับปรุงคุณสมบัติ :
ให้อินเทอร์เฟซ API ที่เป็นมิตรมากขึ้น : ในขณะที่สืบทอดอินเทอร์เฟซ OpENCV อย่างเป็นทางการ SMARTOPENCV กำหนดค่าการดำเนินงานที่ซับซ้อนจำนวนมากผ่าน CamerAconFiguration ให้อินเทอร์เฟซ API ที่คล่องแคล่วมากขึ้นทำให้นักพัฒนาสามารถควบคุมตัวอย่างและการกำหนดค่าพารามิเตอร์และการกำหนดค่าที่เกี่ยวข้องได้อย่างยืดหยุ่น
อย่าพึ่งพา SDK อย่างเป็นทางการโดยตรงเพื่ออำนวยความสะดวกในการอัพเกรด SDK อย่างเป็นทางการ : แยกออกจาก SDK อย่างเป็นทางการของ OpenCV . หลังจากใช้ 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 ());ใบอนุญาต
