
Mit der raschen Entwicklung künstlicher Intelligenz und der kontinuierlichen Verbesserung des Hardware-Niveaus der Terminalgeräte ist es möglich, intelligente Systeme für Terminalgeräte direkt durchzuführen. Gleichzeitig verringert es das Risiko einer unzuverlässigen Netzwerkübertragung in der Cloud-Intelligenz und macht die Endseite immer mehr Aufmerksamkeit. Die ausgereifteren Bereiche der Endseite der Intelligenz sind NLP und Lebenslauf. Im Bereich CV ist OpenCV eine Open Source und leistungsstarke plattformübergreifende Computer-Vision-Bibliothek und wurde in der Bildverarbeitung und Bilderkennung häufig verwendet. Die offizielle Android -Plattform OpenCV SDK hat jedoch viele Mängel in der Bildvorschau.
Smartopencv ist eine verbesserte Bibliothek für OpenCV auf der Android -Seite, die viele Probleme in der JavaCameraView des OpenCV -Android -SDK löst. JavaCamera2View des XML Zhonglin OpenCV.
Obwohl der OpenCV Android SDK einfach zu bedienen und zu bedienen ist, gibt es viele Probleme mit der Vorschau, und die häufigsten Probleme sind wie folgt:
Der Standardhorizontalbildschirm für horizontale Standard
In der Vorschau -Zeichnung gibt es eine schwarze Kante : OpenCV -Standardzeichnung Algorithmus hat einen bestimmten Offset beim Zeichnen von Vorschau -Frame -Bildern auf Leinwand.
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 );
}Der Auswahlalgorithmus zur Auswahl der Vorschauerrahmengröße entspricht nicht den tatsächlichen Szenenanforderungen . Für die Auswahl der Vorschau -Frame -Größe besteht der Standard -OpenCV -Algorithmus darin Besitzen Sie das Vorschau -Image in vielen Fällen.
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 );
} Camera2Preview zu bedienen : Wenn Sie den offiziellen SDK von OpenCV in Ihrem Projekt verwendet haben, müssen Sie nach der Einführung von SmartOpenCV nur JavaCameraView CamerPreview JavaCamera2View in der XML .
Feature -Verbesserung :
Bieten Sie eine freundlichere API -Schnittstelle an : SmartopencV erben die offizielle OpenCV -Schnittstelle und konfiguriert viele komplizierte Operationen durch Cameraconfiguration und bietet eine freundlichere Fluent -API -Schnittstelle, mit der Entwickler die Vorschau und die Anzeige der damit verbundenen Parameter und Konfigurationen flexibler steuern können.
Verlassen Sie sich nicht direkt auf das offizielle SDK, um das offizielle SDK zu verbessern : Entkoppelt aus dem offiziellen SDK von OpenCV. .
| Horizontaler Bildschirm | Vertikaler Bildschirm | |
|---|---|---|
| Opencv | Auch wenn sowohl die Breite als auch die Höhe auf match_parent eingestellt sind, kann der Vollbildschirm nicht Vollbildschirm sein und es gibt eine schwarze Kante. ![]() | Es gibt eine schwarze Kante und der vertikale Bildschirm wird standardmäßig nicht unterstützt ![]() |
| Smartopencv | ![]() | ![]() |
Smartopencv-App-debug.apk
opencv-App-debug.apk
SCHRITT1: Fügen Sie das JITPACK -Repository im Build.gradle in das Stammverzeichnis des Projekts hinzu.
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Schritt 2: Fügen Sie Abhängigkeiten in Modulen hinzu, die die SmartOpenCV -Bibliothek verwenden müssen
dependencies {
implementation('com.github.HuTianQi:SmartOpenCV:1.0.1') { // 版本号建议使用已release的最新版本
exclude module: 'openCVLibrary411' // 由于目前多模块依赖时jitpack打包存在bug,排除打包时依赖的该模块
}
}
Sie müssen das Preview XML im Projekt verwenden, um die JavaCameraView / JavaCamera2View von Smartopencv zu ersetzen und die CameraPreview / Camera2Preview von OpenCV zu verwenden. Es ist so einfach, dass Sie nichts anderes tun müssen.
< 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 > Wenn Sie vorhaben, die von Smartopencv bereitgestellte Schnittstelle zu verwenden, um die vorschauenden Parameter und Konfigurationen flexibel zu steuern, rufen Sie SmartOpenCV.getInstance().init() um das zuvor erhaltene Vorschreiberobjekt zu übergeben.
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 ());LIZENZ
