网站建设推广优化话术,wordpress 高德地图,专做坏消息的网站,公众号开发用什么语言android 开发人员#xff0c;可能熟悉使用activities, fragments, intents以及最重要的一系列开源依赖库。但是#xff0c;注入需要本机功能的依赖关系(如计算机视觉框架)并不像在 gradle 文件中直接添加实现语句那样简单#xff01;今天#xff0c;将专注于使用 OpenCV 库… android 开发人员可能熟悉使用activities, fragments, intents以及最重要的一系列开源依赖库。但是注入需要本机功能的依赖关系(如计算机视觉框架)并不像在 gradle 文件中直接添加实现语句那样简单今天将专注于使用 OpenCV 库将其作为依赖项注入到你的 android 应用程序中。那么我们将从这次讨论中得到什么我们将能够创建一个 android 应用程序并执行所需的步骤来集成 OpenCV。此外我们将完成一个基于SIFT技术的图像特征检测算法。这将是你考虑构建自己的 SDK 的良好起点。什么是SIFTSIFT 代表尺度不变傅立叶变换Scale Invariant Fourier Transform。检测器用于查找图像上的兴趣点。它使我们能够识别图像中的局部特征。SIFT 的优势在于即使我们大幅缩放图像它也能正常工作因为它将图像数据转换为尺度不变坐标。SIFT 使用“关键点”来表示图像中缩放和旋转不变的局部特征。这是我们将其用于各种应用程序如图像匹配、对象检测、场景检测等的基准。为了识别关键点该算法为你完成第 1 步形成尺度空间——这一步确保特征与尺度无关。第 2 步关键点定位——这一步有助于识别合适的特征/关键点。第 3 步方向对齐——这一步确保关键点是旋转后不变的。第 4 步关键点描述符——这是为每个关键点创建描述符的最后一步。从这里我们可以使用关键点和描述符来进行特征匹配。现在让我们设置android项目打开Android Studio-New Project-Empty Activity从以下链接下载 OpenCV 4.5.1https://sourceforge.net/projects/opencvlibrary/files/4.5.1/opencv-4.5.1-android-sdk.zip/download提取文件夹然后将 java 文件夹重命名为 OpenCVLibrary451然后使用 File-New-Import Module 并选择文件夹单击完成。然后你必须看到该库已添加到你的项目中。点击 File-Project Structure-Dependencies 并选择 app.单击添加依赖项然后选择 OpenCVLibrary451确保选中JDK 11如果没有请转到 gradle 设置并将目标版本更改为1.8。我们只需要再添加 JNI 库以便调用 SIFT OpenCV 本机函数。将以下内容粘贴到应用程序的构建 gradle 文件中。android下defaultConfig下面sourceSets{main {jniLibs.srcDirs [libs]}}然后将几个文件复制粘贴到你在开始时提取的 opencv 文件夹 [from /OpenCV-android-sdk/sdk/native/libs] 下。转到项目的 app 文件夹创建一个名为 libs 的文件夹并粘贴文件。同样在应用程序的主文件夹中创建一个名为 cpp 的文件夹然后粘贴 /OpenCV-android-sdk/sdk/libcxx_helper 中的文件。你之前提取的那个。在 android 下 app 的 build gradle 文件中粘贴以下内容externalNativeBuild {cmake {path file(src/main/cpp/CMakeLists.txt)version 3.18.1}
}同步 grade 文件。如果一切顺利你将看到应用程序的构建。要测试应用程序请将 bmp 粘贴到可绘制对象中。我在这里使用了 used test.bmp。收集 bmp 文件后将以下内容粘贴到 resources-layout-activity_main.xml?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityTextViewandroid:idid/sample_textandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textHello OpenCV Android!!!app:layout_constraintBottom_toBottomOfparentapp:layout_constraintLeft_toLeftOfparentapp:layout_constraintRight_toRightOfparentapp:layout_constraintTop_toTopOfparent /ImageViewandroid:idid/imageViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintBottom_toTopOfid/sample_textapp:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.498app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentapp:layout_constraintVertical_bias0.641app:srcCompatdrawable/ic_launcher_background //androidx.constraintlayout.widget.ConstraintLayout然后将以下代码粘贴到 ActivityMain.kt 中package com.augray.siftandroidimport android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Bundle
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import org.opencv.android.Utils
import org.opencv.core.Mat
import org.opencv.core.MatOfKeyPoint
import org.opencv.features2d.Features2d
import org.opencv.features2d.SIFT
import org.opencv.imgproc.Imgprocclass MainActivity : AppCompatActivity() {companion object {// Used to load the native-lib library on application startup.init {System.loadLibrary(native-lib)System.loadLibrary(opencv_java4)}}private var imageView: ImageView? null// make bitmap from image resourceprivate var inputImage: Bitmap? nullprivate val sift SIFT.create()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)inputImage BitmapFactory.decodeResource(resources, R.drawable.test)imageView findViewByIdView(R.id.imageView) as ImageViewdetectAndDrawKeypoints()}fun detectAndDrawKeypoints() {val rgba Mat()Utils.bitmapToMat(inputImage, rgba)val keyPoints MatOfKeyPoint()Imgproc.cvtColor(rgba, rgba, Imgproc.COLOR_RGBA2GRAY)sift.detect(rgba, keyPoints)Features2d.drawKeypoints(rgba, keyPoints, rgba)Utils.matToBitmap(rgba, inputImage)imageView!!.setImageBitmap(inputImage)}}让我们看一下上面的一些代码以便更好地理解System.loadLibrary(native-lib)
System.loadLibrary(opencv_java4)当 cmake 为我们构建所有类并准备就绪时我们仍然没有 SIFT 模块很遗憾它移到了新版本 OpenCV 中的其他库中。函数 detectAndDrawKeypoints() 获取位图并将其转换为图像数组矩阵/多维数组并使用 SIFT 模块检测关键点。如果图像具有良好的对比度、细节和较少重复的图案检测将产生尽可能多的关键点。构建并运行应用程序我们刚刚检测到图像中的特征。我们现在可以扩展它来拍摄另一张图像获取它的关键点并最终匹配它们以获得相似性。你可以在下面的存储库中找到代码https://github.com/sriyan983/SIFTAndroid.git☆ END ☆如果看到这里说明你喜欢这篇文章请转发、点赞。微信搜索「uncle_pn」欢迎添加小编微信「 woshicver」每日朋友圈更新一篇高质量博文。↓扫描二维码添加小编↓