android opencv 函数,在Android 上使用 OpenCV

如题,本文将记录如何在安卓上调用OpenCV。

1. 导入OpenCV动态库

首先当然是下载OpenCV for Android了,然后使用Android Studio创建一个工程并勾选C++ support。

然后,把OpenCV-android-sdk里面的native目录拷贝到工程中,例如app/opencv这个目录,需要修改以下文档:app/build.gradleandroid {

....

sourceSets {

main {

jniLibs.srcDirs = ['opencv/libs']

}

}

}

这样做的目的是为了打包的时候能自动将opencv/libs/{arch}/libopencv_java3.so这个文档打包到我们的apk中。app/CMakeList.txtset(opencv "${CMAKE_SOURCE_DIR}/opencv")

include_directories(${opencv}/jni/include)

add_library(libopencv_java3 SHARED IMPORTED )

set_target_properties(libopencv_java3 PROPERTIES

IMPORTED_LOCATION "${opencv}/libs/${ANDROID_ABI}/libopencv_java3.so")

target_link_libraries( # Specifies the target library.

native-lib

libopencv_java3

${log-lib} )

这里把opencv作为动态库链接到工程中,并添加了包含目录,否则在编译cpp的时候会找不到opencv的头文档。

2. 导入OpenCV Jaba Module

把opencv sdk下面的java目录作为一个module导入到工程中,并设置app依赖此module,这样就可以在工程中使用opencv提供的java接口了。我们来做一个相机:

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2

这里首先实现CvCameraViewListener2接口,来实现相机的处理。

private CameraBridgeViewBase cameraView;

private BaseLoaderCallback loaderCallback = new BaseLoaderCallback(this) {

@Override

public void onManagerConnected(int status) {

switch (status) {

case LoaderCallbackInterface.SUCCESS:

cameraView.enableView();

break;

default:

super.onManagerConnected(status);

break;

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.requestPermissions();

this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

setContentView(R.layout.activity_main);

this.cameraView = (CameraBridgeViewBase) this.findViewById(R.id.cameraView);

this.cameraView.setVisibility(SurfaceView.VISIBLE);

this.cameraView.setCvCameraViewListener(this);

}

在create的时候,我们申请权限,然后设置相机view的监听为自身。

@Override

public void onCameraViewStarted(int width, int height) {

}

@Override

public void onCameraViewStopped() {

}

相机启动停止我们不需要做别的操作。

@Override

protected void onResume() {

super.onResume();

if (!OpenCVLoader.initDebug())

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, this.loaderCallback);

else

this.loaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);

}

相机继续的时候,我们重新加载OpenCV库。

@Override

public void onPause() {

super.onPause();

if (this.cameraView != null)

this.cameraView.disableView();

}

@Override

public void onDestroy() {

super.onDestroy();

if (this.cameraView != null)

this.cameraView.disableView();

}

暂停和销毁的时候,我们把相机禁用掉。

@Override

public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

Mat frame = inputFrame.rgba();

Core.rotate(frame, frame, Core.ROTATE_90_CLOCKWISE);

return frame;

}

这是关键的一步,处理相机的一帧。我们队图像进行了旋转,否则图像的坐标和我们的预期的是不一致的。注意在OpenCV3.2的时候,引入了便捷的rotate函数,如果用之前的方法,可能需要flip和reverse来实现了。

private void requestPermissions() {

int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);

if (permissionCheck == PackageManager.PERMISSION_GRANTED)

return;

ActivityCompat.requestPermissions(this,

new String[]{Manifest.permission.CAMERA},

0);

}

最后是权限的动态申请。当然了,在AndroidManifest.xml中也需要进行设置,我们直接贴代码了:

package="com.riguz.okapia">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

android:theme="@style/AppTheme">

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值