
인공 지능의 빠른 개발과 터미널 장비의 하드웨어 수준의 지속적인 개선으로 인해 터미널 장비에서 지능형 시스템을 직접 실행할 수 있습니다. 동시에 클라우드 인텔리전스에서 신뢰할 수없는 네트워크 전송의 위험을 줄여서 최종 정보에 점점 더 많은 관심을 기울입니다. 최종-사이드 인텔리전스의 더 성숙한 영역은 NLP와 CV입니다. CV 분야에서 OpenCV는 오픈 소스 및 강력한 크로스 플랫폼 컴퓨터 비전 라이브러리이며 이미지 처리 및 이미지 인식에 널리 사용되었습니다. 그러나 공식 Android 플랫폼 OpenCV SDK는 이미지 미리보기에 많은 결함이 있습니다.
SmartOpenCV는 Android 측에서 OpenCV의 향상된 라이브러리로 OpenCV SDK 소스 코드를 수정하고 JavaCameraView SDK에서 디 쿠플 할 필요가 없습니다. XML Zhonglin OpenCV의 JavaCamera2View 공식 OpenCV SDK의 원래 기능과 SmartOpencv의 향상된 기능을 가지고 있습니다.
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 );
} 사용하기 쉬운 : 프로젝트에서 OpenCV의 공식 SDK를 사용한 경우 SmartOpenCV를 소개 한 후 XML 파일의 JavaCameraView / JavaCamera2View CamerPreview / Camera2Preview of SmartOpenCV로 바꾸면 공식 SDK를 사용하면됩니다. .
기능 향상 :
보다 친숙한 API 인터페이스 제공 : 공식 OpenCV 인터페이스를 상속하는 동안 SmartOpenCV는 카메라 캐롤라이징을 통해 많은 복잡한 작업을 구성하여보다 친숙한 유창한 API 인터페이스를 제공하여 개발자가보다 유연하게 제어 및 관련 매개 변수 및 구성을 표시 할 수 있도록합니다.
공식 SDK에 직접 의존하지 마십시오 . SmartOpenCV를 사용한 후 향후 종속 OPENCV를 업그레이드하려면 OpenCV의 종속성을 새 버전으로 업데이트하면 코드를 변경할 필요가 없습니다.
| 수평 스크린 | 수직 스크린 | |
|---|---|---|
| Opencv | 너비와 높이가 모두 일치하도록 설정 되더라도 전체 화면은 전체 화면이 될 수 없으며 검은 가장자리가 있습니다. ![]() | 검은 가장자리가 있으며 기본적으로 수직 화면이 지원되지 않습니다. ![]() |
| 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,排除打包时依赖的该模块
}
}
SmartOpenCV의 CameraPreview / Camera2Preview JavaCameraView 교체하려면 프로젝트 JavaCamera2View 미리보기 XML을 사용해야합니다.
< 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 ());특허
