
Dengan perkembangan yang cepat dari kecerdasan buatan dan peningkatan berkelanjutan tingkat perangkat keras peralatan terminal, dimungkinkan untuk secara langsung menjalankan sistem cerdas pada peralatan terminal. Pada saat yang sama, ini mengurangi risiko transmisi jaringan yang tidak dapat diandalkan dalam kecerdasan cloud, membuat kecerdasan sisi akhir semakin banyak perhatian. Area intelijen sisi akhir yang lebih matang adalah NLP dan CV. Di bidang CV, OpenCV adalah source terbuka dan pustaka visi komputer lintas platform yang kuat, dan telah banyak digunakan dalam pemrosesan gambar dan pengenalan gambar. Namun, platform Android resmi Opencv SDK memiliki banyak kelemahan dalam pratinjau gambar.
SmartOpencv adalah perpustakaan yang ditingkatkan untuk OpenCV di sisi Android, yang memecahkan banyak masalah dalam pratinjau JavaCameraView OpenCV Android SDK. JavaCamera2View dari XML Zhonglin Opencv.
Meskipun OpenCV Android SDK mudah digunakan dan digunakan, ada banyak masalah dengan pratinjau, dan masalah umum adalah sebagai berikut:
Layar horizontal default ditampilkan, dan arah pratinjau tidak dapat dimodifikasi melalui antarmuka
Ada tepi hitam dalam gambar pratinjau : Algoritma gambar default OpenCV memiliki offset tertentu ketika menggambar gambar bingkai pratinjau ke kanvas.
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 );
}Algoritma pemilihan ukuran bingkai pratinjau tidak memenuhi persyaratan adegan aktual : Untuk pemilihan ukuran bingkai pratinjau, algoritma OpenCV default adalah untuk memilih pratinjau maksimum yang lebih kecil dari kontrol pratinjau (atau set ukuran bingkai maksimum), yang Will menyebabkan gambar pratinjau ditampilkan dalam banyak kasus.
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 );
} Mudah Digunakan : Jika Anda menggunakan SDK OpenCV resmi dalam proyek Anda, setelah memperkenalkan SmartOpencv, Anda hanya perlu mengganti JavaCameraView / JavaCamera2View dalam file XML dengan CamerPreview / Camera2Preview Resmi resmi .
Peningkatan fitur :
Berikan antarmuka API yang lebih ramah : sambil mewarisi antarmuka OpenCV resmi, SmartOpencv mengonfigurasi banyak operasi rumit melalui konfigurasi cameraCon, memberikan antarmuka API yang lebih ramah, memungkinkan pengembang untuk mengontrol pratinjau yang lebih fleksibel dan menampilkan parameter dan konfigurasi terkait.
Jangan bergantung langsung pada SDK resmi untuk memfasilitasi peningkatan SDK resmi : dipisahkan dari SDK resmi Opencv. Setelah menggunakan SmartOpencv, jika Anda berencana untuk meningkatkan OpenCV dependen di masa mendatang, itu akan diperbarui.
| Layar horizontal | Layar vertikal | |
|---|---|---|
| Opencv | Bahkan jika kedua lebar dan tinggi diatur ke Match_Parent, layar penuh tidak dapat berupa layar penuh, dan ada tepi hitam. ![]() | Ada tepi hitam, dan layar vertikal tidak didukung secara default ![]() |
| Smartopencv | ![]() | ![]() |
SmartOpencv-App-debug.apk
OpenCV-APP-DEBUG.APK
Langkah1: Tambahkan konfigurasi ke repositori jitpack di build.gradle di direktori root proyek
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Langkah2: Tambahkan dependensi dalam modul yang perlu menggunakan perpustakaan SmartOpenCV
dependencies {
implementation('com.github.HuTianQi:SmartOpenCV:1.0.1') { // 版本号建议使用已release的最新版本
exclude module: 'openCVLibrary411' // 由于目前多模块依赖时jitpack打包存在bug,排除打包时依赖的该模块
}
}
Anda perlu menggunakan pratinjau XML dalam proyek untuk menggantikan JavaCameraView / JavaCamera2View dari SmartOpencv dan menggunakan CameraPreview / Camera2Preview Of 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 > Jika Anda berencana untuk menggunakan antarmuka yang disediakan oleh SmartOpencv untuk lebih fleksibel mengontrol parameter dan konfigurasi yang terkait dengan tampilan pratinjau, maka hubungi SmartOpenCV.getInstance().init() untuk meneruskan objek kontrol pratinjau yang diperoleh sebelumnya.
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 ());LISENSI
