<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Blog%3A%E5%9C%A8Android_%E4%B8%8A%E4%BD%BF%E7%94%A8_OpenCV</id>
	<title>Blog:在Android 上使用 OpenCV - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Blog%3A%E5%9C%A8Android_%E4%B8%8A%E4%BD%BF%E7%94%A8_OpenCV"/>
	<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Blog:%E5%9C%A8Android_%E4%B8%8A%E4%BD%BF%E7%94%A8_OpenCV&amp;action=history"/>
	<updated>2026-06-03T00:53:19Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.riguz.com/index.php?title=Blog:%E5%9C%A8Android_%E4%B8%8A%E4%BD%BF%E7%94%A8_OpenCV&amp;diff=2649&amp;oldid=prev</id>
		<title>imported&gt;Riguz：​如题，本文将记录如何在安卓上调用OpenCV。</title>
		<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Blog:%E5%9C%A8Android_%E4%B8%8A%E4%BD%BF%E7%94%A8_OpenCV&amp;diff=2649&amp;oldid=prev"/>
		<updated>2017-11-13T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;如题，本文将记录如何在安卓上调用OpenCV。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;如题，本文将记录如何在安卓上调用OpenCV。&lt;br /&gt;
&lt;br /&gt;
= 导入OpenCV动态库=&lt;br /&gt;
首先当然是下载OpenCV for Android了，然后使用Android Studio创建一个工程并勾选C++ support。&lt;br /&gt;
&lt;br /&gt;
然后，把OpenCV-android-sdk里面的native目录拷贝到工程中，例如app/opencv这个目录，需要修改以下文件：&lt;br /&gt;
&lt;br /&gt;
* app/build.gradle&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
android {&lt;br /&gt;
....&lt;br /&gt;
sourceSets {&lt;br /&gt;
        main {&lt;br /&gt;
            jniLibs.srcDirs = [&amp;#039;opencv/libs&amp;#039;]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
这样做的目的是为了打包的时候能自动将opencv/libs/{arch}/libopencv_java3.so这个文件打包到我们的apk中。&lt;br /&gt;
&lt;br /&gt;
* app/CMakeList.txt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
set(opencv &amp;quot;${CMAKE_SOURCE_DIR}/opencv&amp;quot;)&lt;br /&gt;
include_directories(${opencv}/jni/include)&lt;br /&gt;
add_library(libopencv_java3 SHARED IMPORTED )&lt;br /&gt;
set_target_properties(libopencv_java3 PROPERTIES&lt;br /&gt;
                      IMPORTED_LOCATION &amp;quot;${opencv}/libs/${ANDROID_ABI}/libopencv_java3.so&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
target_link_libraries( # Specifies the target library.&lt;br /&gt;
                       native-lib&lt;br /&gt;
                       libopencv_java3&lt;br /&gt;
                       ${log-lib} )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
这里把opencv作为动态库链接到工程中，并添加了包含目录，否则在编译cpp的时候会找不到opencv的头文件。&lt;br /&gt;
&lt;br /&gt;
= 导入OpenCV Jaba Module=&lt;br /&gt;
&lt;br /&gt;
把opencv sdk下面的java目录作为一个module导入到工程中，并设置app依赖此module，这样就可以在工程中使用opencv提供的java接口了。我们来做一个相机：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
这里首先实现CvCameraViewListener2接口，来实现相机的处理。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    private CameraBridgeViewBase cameraView;&lt;br /&gt;
&lt;br /&gt;
    private BaseLoaderCallback loaderCallback = new BaseLoaderCallback(this) {&lt;br /&gt;
        @Override&lt;br /&gt;
        public void onManagerConnected(int status) {&lt;br /&gt;
            switch (status) {&lt;br /&gt;
                case LoaderCallbackInterface.SUCCESS:&lt;br /&gt;
                    cameraView.enableView();&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    super.onManagerConnected(status);&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        this.requestPermissions();&lt;br /&gt;
&lt;br /&gt;
        this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);&lt;br /&gt;
        setContentView(R.layout.activity_main);&lt;br /&gt;
        this.cameraView = (CameraBridgeViewBase) this.findViewById(R.id.cameraView);&lt;br /&gt;
        this.cameraView.setVisibility(SurfaceView.VISIBLE);&lt;br /&gt;
        this.cameraView.setCvCameraViewListener(this);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
在create的时候，我们申请权限，然后设置相机view的监听为自身。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCameraViewStarted(int width, int height) {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onCameraViewStopped() {&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
相机启动停止我们不需要做别的操作。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onResume() {&lt;br /&gt;
        super.onResume();&lt;br /&gt;
        if (!OpenCVLoader.initDebug())&lt;br /&gt;
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, this.loaderCallback);&lt;br /&gt;
        else&lt;br /&gt;
            this.loaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
相机继续的时候，我们重新加载OpenCV库。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onPause() {&lt;br /&gt;
        super.onPause();&lt;br /&gt;
        if (this.cameraView != null)&lt;br /&gt;
            this.cameraView.disableView();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onDestroy() {&lt;br /&gt;
        super.onDestroy();&lt;br /&gt;
        if (this.cameraView != null)&lt;br /&gt;
            this.cameraView.disableView();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
暂停和销毁的时候，我们把相机禁用掉。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    @Override&lt;br /&gt;
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {&lt;br /&gt;
        Mat frame = inputFrame.rgba();&lt;br /&gt;
        Core.rotate(frame, frame, Core.ROTATE_90_CLOCKWISE);&lt;br /&gt;
        return frame;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
这是关键的一步，处理相机的一帧。我们队图像进行了旋转，否则图像的坐标和我们的预期的是不一致的。注意在OpenCV3.2的时候，引入了便捷的rotate函数，如果用之前的方法，可能需要flip和reverse来实现了。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private void requestPermissions() {&lt;br /&gt;
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);&lt;br /&gt;
        if (permissionCheck == PackageManager.PERMISSION_GRANTED)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        ActivityCompat.requestPermissions(this,&lt;br /&gt;
                new String[]{Manifest.permission.CAMERA},&lt;br /&gt;
                0);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
最后是权限的动态申请。当然了，在AndroidManifest.xml中也需要进行设置，我们直接贴代码了：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;manifest xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;br /&gt;
    package=&amp;quot;com.riguz.okapia&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;uses-permission android:name=&amp;quot;android.permission.WRITE_EXTERNAL_STORAGE&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;uses-permission android:name=&amp;quot;android.permission.READ_EXTERNAL_STORAGE&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;uses-permission android:name=&amp;quot;android.permission.CAMERA&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;uses-feature android:name=&amp;quot;android.hardware.camera&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;uses-feature android:name=&amp;quot;android.hardware.camera.autofocus&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;uses-feature android:name=&amp;quot;android.hardware.camera.front&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;uses-feature android:name=&amp;quot;android.hardware.camera.front.autofocus&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;application&lt;br /&gt;
        android:allowBackup=&amp;quot;true&amp;quot;&lt;br /&gt;
        android:icon=&amp;quot;@mipmap/ic_launcher&amp;quot;&lt;br /&gt;
        android:label=&amp;quot;@string/app_name&amp;quot;&lt;br /&gt;
        android:roundIcon=&amp;quot;@mipmap/ic_launcher_round&amp;quot;&lt;br /&gt;
        android:supportsRtl=&amp;quot;true&amp;quot;&lt;br /&gt;
        android:theme=&amp;quot;@style/AppTheme&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;activity android:name=&amp;quot;.MainActivity&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;intent-filter&amp;gt;&lt;br /&gt;
                &amp;lt;action android:name=&amp;quot;android.intent.action.MAIN&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;category android:name=&amp;quot;android.intent.category.LAUNCHER&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/intent-filter&amp;gt;&lt;br /&gt;
        &amp;lt;/activity&amp;gt;&lt;br /&gt;
    &amp;lt;/application&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/manifest&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
参考：[http://blog.codeonion.com/2016/04/09/show-camera-on-android-app-using-opencv-for-android/ Use OpenCV to show camera on android App with correct orientation]&lt;/div&gt;</summary>
		<author><name>imported&gt;Riguz</name></author>
	</entry>
</feed>