跨平台之用VisualStudio开发APK嵌入OpenCV(三)

2024-05-26 21:36

本文主要是介绍跨平台之用VisualStudio开发APK嵌入OpenCV(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇将包含以下内容:

1.使用 Visual Studio 2019 开发一个 Android 的 App

2.导入前篇 C++ 编译好的 so 动态库

3.一些入门必须的其它设置

作为入门,我们直接使用真机进行调试,一方面运行速度远高于模拟器,另一方面模拟器使用的 CPU 跟开发主机是一样的 x86,而前篇 C++ 编译的 .so 动态库是 ARM RISC CPU,所以……

作为公益技术博客,我暂时没有开启打赏,不过如果有很多小朋友疯狂点赞,威逼利诱可以追加一篇相关的杂七杂八的设置和基础知识解说

开始吧

新建一个项目,过滤“C#”,“所有平台”,“移动”,选择“移动应用(Xamarin Forms)”

如果从 Android Studio 转过来,或者打算转向 Android Studio 可以选择上图第二项

应用名写 Transformer(不是变形金刚)

为了简单起见,直接选择空白应用,理论上 Xamarin 可以让代码在安卓、苹果、Windows 上运行(至少他们是这么吹的),你可以全部勾选,对于本例我们实际只用 Android

点击创建,实际会生成 4 个项目,分别是 Android,iOS,Windows 的应用项目,还有一个公用的 DLL 核心,前面3个项目是特定平台的应用,但实际的界面和业务逻辑(功能)在 DLL 项目

现在开始折腾UI界面,双击打开 Transformer 项目的 MainPage.xaml 文件,直接在自动生成的控件后面加一个按钮,直接使用自动生成 Click 事件

关于 MVVM 设计模式以及 xaml 语法什么的,以后得空随缘更新吧

再添加一个 Image 用于显示透视裁切的效果,设定 Name 为 image1

展开 MainPage.xaml 树,双击打开 MainPage.xaml.cs 代码文件

声明一个接口,编写 Click 事件代码

虽然我一贯反对复制粘贴,不过时代这种东西……


private async void Button_Clicked(object sender, EventArgs e)
{var status = await Xamarin.Essentials.Permissions.CheckStatusAsync<Xamarin.Essentials.Permissions.StorageRead>();if (status != Xamarin.Essentials.PermissionStatus.Granted){status = await Xamarin.Essentials.Permissions.RequestAsync<Xamarin.Essentials.Permissions.StorageRead>();}if (status == Xamarin.Essentials.PermissionStatus.Granted){status = await Xamarin.Essentials.Permissions.RequestAsync<Xamarin.Essentials.Permissions.StorageWrite>();}if (status == Xamarin.Essentials.PermissionStatus.Granted){IStorage storage = DependencyService.Get<IStorage>();var file = storage.Demo();this.image1.Source = ImageSource.FromFile(file);}
}

双击打开 Transformer.Android 项目的 MainActivity.cs 文件

在 Android 项目下实现上面所说的接口,iOS 也另外实现,Windows 同理,但是都可以通过公用的 DLL 项目调用,这就是接口的本质

可以复制粘贴的代码

public class StorageService : Transformer.IStorage
{[System.Runtime.InteropServices.DllImport("libPerspectiveTransformer.so")]public static extern void TransformFile(string src, IntPtr src_xys, string dst, IntPtr dst_size);public string Demo(){var downloads = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);string root = downloads.AbsolutePath;var src = System.IO.Path.Combine(root, "card.jpg");var dst = System.IO.Path.Combine(root, "card_trans.jpg");TransformFile(src, IntPtr.Zero, dst, IntPtr.Zero);return dst;}
}

一行也算哎

Xamarin.Forms.DependencyService.Register<Transformer.IStorage, StorageService>();

至于这些代码都是什么意思,以后得空随缘更新吧

你可以网上搜,当然如果你求助 AI 国内的大模型跟 ChatGPT 是没法比的,经常给出错误的回答,不过也可以给出一些启发什么的(为什么这些人那么有钱,不让我拿去搞呢)

接下来是关键,引入前面 C++ 编译的 so 动态库

添加一个文件夹

再添加一个 armeabi-v7a 下一级文件夹

关于这个具体是什么意思,你可以网上搜,但是不要问女朋友

你可以简单理解为针对不同的 CPU 类型,暂时不支持 x86、x64(AMD64,x86_64)、ARM64 以及古老的 armeabi 即 64 位最新的手机兼容运行,老旧的手机不能运行,然后双系统平板和电脑端模拟器不能运行(2011年以后大部分的安卓手机和平板都可以运行)

然后,导入 so 动态库文件

选择上一篇 C++ 编译好的 so 文件

属性设置:复制到输出目录=始终复制;生成操作=AndroidNativeLibrary

这一步非常关键,即便你跑去国外查,也很难查得到

很多人是打包成Nuget的方式再引入的,坦白说欧美的教育是重启发、轻知识,1+1=2导师都要你自己去思考,而不直接给你答案

然后我们就可以编译、在手机上调试了

首先,把 Transformer.Android 设为启动项目

项目右键属性,修改以下名称(也可以保持默认

然后是权限,勾选外部存储读写权限

权限是必须的,在 Android 5.0 (Lollipop,棒棒糖) 以后是动态获取权限(为什么是棒棒糖?)

关于权限,安卓包的结构,异步,各种杂七杂八的,以后得空随缘更新吧

反正示例的代码已经包含有最精简的基本操作

使用 USB 连接手机,本次调试用的是较旧的二手小米 Redmi 6A 手机,小米手机开启开发者模式需要登陆,注册是免费的,关于手机怎么开启开发者模式,你可以网上搜,大把多

将 USB 连接方式设置为“传输文件”,把示例的图片card.jpg复制到手机的这个文件夹

如果不想翻前一篇,图片是这样的(来源于网络),你可以用自己的图片,不过要自己修改坐标点

工具栏直接点 启动

在手机上点我们设计的“透视裁切”按钮,会弹出请求权限,同意后就显示转正效果

大功告成!

这篇关于跨平台之用VisualStudio开发APK嵌入OpenCV(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005651

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte