使用 OpenCV for Android 进行图像特征检测

android 开发人员,可能熟悉使用activities, fragments, intents以及最重要的一系列开源依赖库。但是,注入需要本机功能的依赖关系(如计算机视觉框架)并不像在 gradle 文件中直接添加实现语句那样简单!
今天,将专注于使用 OpenCV 库,将其作为依赖项注入到你的 android 应用程序中。
那么,我们将从这次讨论中得到什么?我们将能够创建一个 android 应用程序并执行所需的步骤来集成 OpenCV。
此外,我们将完成一个基于SIFT技术的图像特征检测算法。这将是你考虑构建自己的 SDK 的良好起点。
什么是SIFT?
SIFT 代表尺度不变傅立叶变换(Scale Invariant Fourier Transform)。检测器用于查找图像上的兴趣点。它使我们能够识别图像中的局部特征。
SIFT 的优势在于,即使我们大幅缩放图像,它也能正常工作,因为它将图像数据转换为尺度不变坐标。SIFT 使用“关键点”来表示图像中缩放和旋转不变的局部特征。这是我们将其用于各种应用程序(如图像匹配、对象检测、场景检测等)的基准。
为了识别关键点,该算法为你完成:
第 1 步:形成尺度空间——这一步确保特征与尺度无关。
第 2 步:关键点定位——这一步有助于识别合适的特征/关键点。
第 3 步:方向对齐——这一步确保关键点是旋转后不变的。
第 4 步:关键点描述符——这是为每个关键点创建描述符的最后一步。
从这里,我们可以使用关键点和描述符来进行特征匹配。
现在让我们设置android项目,
打开Android Studio->New Project->Empty Activity

从以下链接下载 OpenCV 4.5.1,
https://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 version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/sample_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello OpenCV Android!!!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintBottom_toTopOf="@+id/sample_text"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.498"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.641"app:srcCompat="@drawable/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 = findViewById<View>(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」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓

相关文章:
使用 OpenCV for Android 进行图像特征检测
android 开发人员,可能熟悉使用activities, fragments, intents以及最重要的一系列开源依赖库。但是,注入需要本机功能的依赖关系(如计算机视觉框架)并不像在 gradle 文件中直接添加实现语句那样简单!今天,将专注于使用 OpenCV 库…...
chatGPT笔记
文章目录 一、GPT之技术演进时间线二、chatGPT中的语言模型instructGPT跟传统语言LM模型最大不同点是什么?三、instructGPT跟GPT-3的网络结构是否一样四、GPT和BERT有啥区别五、chatGPT的训练过程是怎样的?六、GPT3在算数方面的能力七、GPT相比于bert的优点是什么八、元学习(…...
这么好的政策和创新基地,年轻人有梦想你就来
周末有空去参观了下一个朋友办的公司。位置和环境真不错,且租金低的离谱,半年租金才2000元,且提供4个工位。这个创新基地真不赖啊,国家鼓励创新创业,助力年轻人实现梦想。场地有办公区,休息区应有尽有&…...
【Kubernetes】【十九】安全认证
第九章 安全认证 本章节主要介绍Kubernetes的安全认证机制。 访问控制概述 Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。 客户端 在Kubernetes集群…...
Apache Flink 实时计算在美的多业务场景下的应用与实践
摘要:本文整理自美的集团实时数据负责人、资深数据架构师董奇,在 Flink Forward Asia 2022 主会场的分享。本篇内容主要分为四个部分: 实时生态系统在美的的发展和建设现状 核心传统业务场景 Flink 实时数字化转型实践 新兴业务场景 Flink …...
27 pandas 数据透视
文章目录pivot_table 函数1、index需要聚合的列名,默认情况下聚合所有数据值的列2、values在结果透视的行上进行分组的列名或其它分组键【就是透视表里显示的列】3、columns在结果透视表的列上进行分组的列名或其它分组键4、Aggfunc聚合函数或函数列表(默…...
1.2 学习环境准备
文章目录1.MariaDB简介2.MariaDB服务端和客户端安装1.MariaDB简介 因为MariaDB作为MySQL的延申,其包含MySQL所有的有点,并且其包含了更丰富的特性。比如微秒的支持、线程池、子查询优化、组提交、进度报告等; 所以我们接下来将已MariaDB作为…...
Http1.0协议常识
组织:中国互动出版网(http://www.china-pub.com/)RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)E-mail:ouyangchina-pub.com译者:黄晓东(黄晓东 xd…...
“终于懂了” 系列:组件化框架 ARouter 完全解析(三)AGP/Transform/ASM—动态代码注入
ARouter系列文章: “终于懂了” 系列:组件化框架 ARouter 完全解析(一)原理全解 “终于懂了” 系列:组件化框架 ARouter 完全解析(二)APT—帮助类生成 “终于懂了” 系列:组件化框架…...
传闻腾讯引进Quest 2?我觉得可行性很低
根据36kr最新消息称,腾讯XR团队解散后,确定不碰XR硬件领域,但并未完全放弃XR规划,将转变思路和玩法,业内消息称腾讯计划引进Meta旗下Quest 2 VR一体机。消息称,该计划在2022年11月份XR部门负责人沈黎走后便…...
【数据集】CMIP6气候模式数据下载
1 CMIP6简介 目前,国际耦合模式比较计划(Coupled Model Intercomparison Project, CMIP) 已经发展到第六阶段(CMIP6)。CMIP6模式采用了较以往更加合理的参数化方案,综合考虑了大气中温室气体排放、气溶胶浓度及社会经济、科学技术发展及政府规划等多方面的综合影响,将提…...
华为OD机试 - 最长的元音字符串 | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...
浅谈c++引用
浅谈c 在这里开设 <<浅谈C>> 系列专题,针对C重点内容展开探讨与观察底层,同时也是一个面试专栏,所选知识大多为面试常见问题.前期较为基础,难度会逐渐上升哦~ 本专栏采用经典的哲学三段论编写:是什么|为什么|怎么做 力图精简,高效. 第一章: 浅谈C函数重载 传送门…...
2023什么是分销商城?怎么搭建分销商城
当实体机构都接连探索线上营销模式的时候,分销也随着社交电商的兴起应运而生。 大家好,我是你们熟悉而又陌生的好朋友梦龙,一个创业期的年轻人 它借助裂变效率高的属性,建立更多用户触点,更好的提升企业运营的势能&am…...
408数据结构考点总结
文章目录第一章 绪论考点 1:时间复杂度与空间复杂度时间复杂度空间复杂度第二章 线性表考点 2:顺序表考点 3:单链表第三章 栈和队列考点 4:栈和队列的基本性质考点5:循环队列考点6:双端队列输出受限的双端队…...
虹科分享 | 网络流量监控 | 你的数据能告诉你什么:解读网络可见性的4种数据类型
要了解网络性能问题的原因,可见性是关键。而这四种数据类型(流、数据包、SNMP和API)都在增强网络可见性方面发挥着重要作用。 流 流是通过网络发送的数据的摘要。流类型不同,可以包括NetFlow, sFlow, jFlow和IPFIX。不同的流类型…...
SpringBoot日志框架使用详解
几种常见的日志级别由低到高分为:TRACE < DEBUG < INFO < WARN < ERROR < FATAL 。如何理解这个日志级别呢?很简单,如果项目中的日志级别设置为INFO ,那么比它更低级别的日志信息 就看不到了,即是TRACE…...
剑指offer-消失的数字、数组中出现的次数
消失的数字 解法一:求和相减 假设nums为[0,1,2,4],消失的数字为3,完整的数组应该是[0,1,2,3,4],则sum101247,sum20123410,我们很容易发现 sum2-sum1 01234 - 0124 3,即为消失的数字。因此,我们可以采用先…...
axios请求配置baseURL选项
在src同级目录创建 (1).env.delelopment : 开发模式时调用 (2).env.production :生产模式时调用 (3).env.testing : 测试模式时调用 # 页面标题 VITE_APP_TITLE 若依管理系统# 生产环境配…...
风储VSG-基于虚拟同步发电机的风储并网系统MATLAB仿真
MATLAB2021b版本仿真模型:风力发电机模块、储能控制模块、功率计算模块、VSG控制模块、电压电流双环控制模块。永磁同步风机输出功率、储能系统输出功率以及逆变器输出功率曲线。直流母线电压波动曲线。逆变器输出电压、电流曲线。完整模型见博主资源!&a…...
DeepSeek架构深度解析:从原理到实践的完整指南
一、引言 2025年1月,DeepSeek-R1的发布在全球AI领域引发巨大震动——一个开源模型以远低于主流闭源模型的训练成本,实现了与之相匹敌的推理性能,直接导致英伟达股价单日下跌17%。在随后的时间里,DeepSeek团队持续迭代,…...
Zotero PDF Preview:在文献库中无缝预览PDF的终极指南
Zotero PDF Preview:在文献库中无缝预览PDF的终极指南 【免费下载链接】zotero-pdf-preview Preview Zotero attachments in the library view. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-pdf-preview 在学术研究和文献管理工作中,频繁…...
暗黑3一键宏终极指南:D3keyHelper让你的刷图效率翻倍
暗黑3一键宏终极指南:D3keyHelper让你的刷图效率翻倍 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑3中重复的技能按键感到疲…...
快马AI助力:十分钟用开yun技术栈搭建微服务电商原型
最近尝试用开yun技术栈快速搭建微服务电商原型,发现结合InsCode(快马)平台的AI辅助功能,整个过程比想象中顺畅很多。记录下这个十分钟搭建原型的实践过程,特别适合需要快速验证想法的场景。 技术选型思路 开yun技术栈作为云原生领域的热门选…...
Unity零基础入门指南:借助快马AI生成你的第一个可交互3D场景
Unity零基础入门指南:借助快马AI生成你的第一个可交互3D场景 作为一个刚接触Unity的新手,我完全理解那种面对空白项目时的迷茫感。好在最近发现了InsCode(快马)平台,它让我这个编程小白也能快速创建出像模像样的3D交互场景。下面我就分享一下…...
利用快马平台快速生成ffmpeg视频裁剪与滤镜添加原型
最近在做一个短视频处理的小工具,需要快速验证ffmpeg的视频裁剪和滤镜功能。传统方式要自己搭建环境、查文档、写代码,整个过程特别耗时。后来发现用InsCode(快马)平台可以省去这些麻烦,直接输入需求就能生成可运行的原型代码,特别…...
javaweb大学生校园跑腿服务系统的设计与实现沙箱支付
目录同行可拿货,招校园代理 ,本人源头供货商沙箱支付功能概述核心功能模块技术实现要点测试注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 沙箱支付功能概述 在JavaWeb校园跑…...
解锁专利数据价值:Google Patents Public Data全流程应用指南
解锁专利数据价值:Google Patents Public Data全流程应用指南 【免费下载链接】patents-public-data Patent analysis using the Google Patents Public Datasets on BigQuery 项目地址: https://gitcode.com/gh_mirrors/pa/patents-public-data 企业如何突破…...
Flux Sea Studio 海景摄影生成工具:AIGC内容创作革命——海景摄影从拍摄到生成的范式转变
Flux Sea Studio 海景摄影生成工具:AIGC内容创作革命——海景摄影从拍摄到生成的范式转变 想象一下,你脑海中浮现出一幅画面:史前时代的海洋,巨大的沧龙在泛着磷光的海浪中游弋;或者,一颗遥远星球的海岸线…...
【车辆】插电式混合动力汽车(PHEV)动力系统进行建模与设计MATLAB 代码,含发动机、电机、电池组等组件
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...
