Uniapp 调用 原生安卓方法 使用cv 实现图片人脸识别 返回人脸位置和人脸数量

这篇具有很好参考价值的文章主要介绍了Uniapp 调用 原生安卓方法 使用cv 实现图片人脸识别 返回人脸位置和人脸数量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果:
uniapp + opencv,没事学前端,uni-app,android,webpack,javauniapp + opencv,没事学前端,uni-app,android,webpack,java

安卓方法代码

package com.piya;

import static com.taobao.weex.WXEnvironment.getApplication;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.objdetect.CascadeClassifier;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;

public class FaceDetectionHelper extends UniModule {

    private static final String TAG = "FaceDetectionHelper";

    // 异步检测
    @UniJSMethod(uiThread = true)
    public void testAsyncFunc(JSONObject options, final UniJSCallback callback) {
        // 加载OpenCV库
        if (!OpenCVLoader.initDebug()) {
            Log.e(TAG, "OpenCV initialization failed");
            if (callback != null) {
                JSONObject errorData = new JSONObject();
                errorData.put("error", "OpenCV initialization failed");
                callback.invoke(errorData);
            }
            return;
        }

        // 加载人脸检测器模型
        CascadeClassifier cascadeClassifier = loadCascadeClassifier();

        if (cascadeClassifier == null) {
            Log.e(TAG, "Cascade classifier loading failed");
            if (callback != null) {
                JSONObject errorData = new JSONObject();
                errorData.put("error", "Cascade classifier loading failed");
                callback.invoke(errorData);
            }
            return;
        }

        // 获取图片URL
        String imageUrl = options.getString("imgUrl");

        // 下载并处理图片
        new AsyncTask<String, Void, Bitmap>() {
            @Override
            protected Bitmap doInBackground(String... params) {
                try {
                    URL url = new URL(params[0]);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setDoInput(true);
                    connection.connect();
                    InputStream input = connection.getInputStream();
                    return BitmapFactory.decodeStream(input);
                } catch (Exception e) {
                    Log.e(TAG, "Error downloading image: " + e.getMessage());
                    return null;
                }
            }

            @Override
            protected void onPostExecute(Bitmap bitmap) {
                if (bitmap != null) {
                    // 在图像上执行人脸检测
                    JSONObject resultData = detectFaces(bitmap, cascadeClassifier);

                    // 调用回调函数返回检测结果
                    if (callback != null) {
                        callback.invoke(resultData);
                    }
                } else {
                    Log.e(TAG, "Failed to download image");
                    if (callback != null) {
                        JSONObject errorData = new JSONObject();
                        errorData.put("error", "Failed to download image");
                        callback.invoke(errorData);
                    }
                }
            }
        }.execute(imageUrl);
    }

    // 加载人脸检测器模型
    private CascadeClassifier loadCascadeClassifier() {
        try {
            InputStream is = getApplication().getApplicationContext().getAssets().open("haarcascade_frontalface_alt.xml");
            File cascadeFile = new File(getApplication().getApplicationContext().getCacheDir(), "haarcascade_frontalface_alt.xml");
            FileOutputStream os = new FileOutputStream(cascadeFile);
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = is.read(buffer)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            is.close();
            os.close();

            CascadeClassifier cascadeClassifier = new CascadeClassifier(cascadeFile.getAbsolutePath());
            if (cascadeClassifier.empty()) {
                return null;
            }

            return cascadeClassifier;
        } catch (Exception e) {
            Log.e(TAG, "Error loading cascade classifier: " + e.getMessage());
            return null;
        }
    }

    // 在图像上执行人脸检测
    private JSONObject detectFaces(Bitmap bitmap, CascadeClassifier cascadeClassifier) {
        Mat mat = new Mat();
        MatOfRect faces = new MatOfRect();

        // 将Bitmap转换为OpenCV的Mat对象
        org.opencv.android.Utils.bitmapToMat(bitmap, mat);

        // 执行人脸检测
        cascadeClassifier.detectMultiScale(mat, faces);

        // 构建JSON对象来保存检测结果
        JSONObject resultData = new JSONObject();
        JSONArray facesArray = new JSONArray();
        resultData.put("数量", faces.toArray().length);
        Rect[] rectsArray = faces.toArray();
        for (Rect rect : rectsArray) {
            JSONObject faceData = new JSONObject();
            faceData.put("height", rect.height);
            faceData.put("x", rect.x);
            faceData.put("width", rect.width);
            faceData.put("y", rect.y);
            facesArray.add(faceData);
        }
        resultData.put("位置",facesArray);

        JSONObject res = new JSONObject();
        res.put("code","success");
        res.put("data",resultData);
        return res;
    }
}

uniapp代码文章来源地址https://www.toymoban.com/news/detail-854114.html

<template>
	<div style="text-align: center;">
		<view v-for="(i,index) in imgUrls" style="margin-bottom: 20px;">
			<image :src="i.url" style="height: 250px;width: 60%;"></image>
			<button type="primary" @click="testAsyncFunc(i.url, index)" style="width: 50%;margin-top: 20px;">人脸检测异步</button>
			<view style="text-align: center;" v-if="i.data != null">
				{{i.data}}
			</view>
		</view>
		<!-- <button type="primary" @click="testSyncFunc" style="width: 50%;margin-top: 20px;">人脸检测同步</button> -->
	</div>
</template>

<script>
	// 获取 module 
	var testModule = uni.requireNativePlugin("FaceDetectionHelper")
	const modal = uni.requireNativePlugin('modal');
	export default {
		data(){
			return{
				imgUrls: [
					{
						url: "https://img0.baidu.com/it/u=3389607,2584865022&fm=253&fmt=auto&app=138&f=PNG?w=449&h=645",
						data: null,
					},
					{
						url: "https://img1.baidu.com/it/u=1751886178,1535140781&fm=253&fmt=auto&app=138&f=JPEG?w=297&h=384",
						data: null,
					},
					{
						url: "https://img0.baidu.com/it/u=1112951416,2217244278&fm=253&fmt=auto&app=138&f=JPEG?w=600&h=304",
						data: null,
					},
					{
						url: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Ffe639b21-0cde-4fdf-9818-b2442c3e023b%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1710902258&t=4028f29e7697388d94c3f72470cd5ef7",
						data: null,
					},
					{
						url: "https://img0.baidu.com/it/u=2353660487,2578268887&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=666",
						data: null,
					},
					{
						url: "https://img1.baidu.com/it/u=1241956916,3681734452&fm=253&fmt=auto&app=120&f=JPEG?w=400&h=560",
						data: null,
					},
					{
						url: "https://n.sinaimg.cn/sinacn/w640h727/20180131/4c66-fyrcsrv9928989.jpg",
						data: null,
					},
					{
						url: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fc28a348f-6030-489e-bf16-3ba2995c80c0%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1710902571&t=95286d160dd05f21702a5f85c800edee",
						data: null,
					},
					{
						url: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2F74d7df5d-8dfb-4a89-a12e-d433c4cc2473%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1710902571&t=7bf3f3944d14cc613582d80fa637698c",
						data: null,
					},
					{
						url: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fci.xiaohongshu.com%2Fc27943ba-fa83-42c9-b9e3-c901c532a750%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fci.xiaohongshu.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1710902570&t=36ffeb79e4f5ce047356519495025ea8",
						data: null,
					},
					{
						url: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2F177c50eb-ff1e-41ba-a4b5-cdbd06dd5bfd%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1710902595&t=d0ed2efcaef4ff1a56c68c35d196588f",
						data: null,
					},
					{
						url: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2F4d8d1eb8-f89a-42b8-b6ae-6375678e5b63%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1710902595&t=7bdd025d948698ef65117355e137d038",
						data: null,
					},
					{
						url: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2F6baf9aef-1a72-46f1-b976-cebb6861b43c%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1710902595&t=b8867d83df6208f34784d330b333d814",
						data: null,
					},
					{
						url: "https://img-user-qn.hudongba.com/upload/_oss/uePasteUpload/201809/1116/1536656165657.jpg",
						data: null,
					},
					{
						url: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fc27fa638-a145-418e-95a8-61c397c104fe%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1710902632&t=f481b4f348fab8e15465efe30911b058",
						data: null,
					},
					{
						url: "https://img1.baidu.com/it/u=2631529228,2871676583&fm=253&fmt=auto&app=138&f=PNG?w=400&h=558",
						data: null,
					},
					{
						url: "https://img1.baidu.com/it/u=1740647370,3843349101&fm=253&fmt=auto&app=138&f=JPEG?w=499&h=333",
						data: null,
					},
				]
			}
		},
		methods: {
			testAsyncFunc(imgUrl, index) {
				// 调用异步方法
				testModule.testAsyncFunc({
						'imgUrl': imgUrl
					},
					(ret) => {
						this.imgUrls[index].data = JSON.stringify(ret)
						modal.toast({
							message: ret,
							duration: 1.5
						});
					})
			},
			// testSyncFunc() {
			// 	// 调用同步方法
			// 	var ret = testModule.testSyncFunc({
			// 		'imgUrl': this.imgUrl
			// 	})
			// 	modal.toast({
			// 		message: ret,
			// 		duration: 1.5
			// 	});
			// }
		}
	}
</script>

到了这里,关于Uniapp 调用 原生安卓方法 使用cv 实现图片人脸识别 返回人脸位置和人脸数量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp实现条码扫描 可开闪光灯,原生H5调用,不需要任何sdk。

    使用QuaggaJs这个库。调用摄像头使用的 navigator.mediaDevices.getUserMedia 这个H5的api。通过 video 和 canvas 把摄像头获取到的数据展现到页面上,同时调用监听Quagga解析。 获取设备摄像头权限,用于后续开启摄像头。 创建video元素显示摄像头画面,和canvas元素用于QuaggaJS进行图像处理和解

    2024年02月06日
    浏览(52)
  • uniapp 微信小程序 实现 将base64图片保存相册和转发分享微信好友功能记录 直接cv就能用!!!!

    一、base64图片保存相册功能 提示api:that.$refs.uToast.show用的是uview2.0的toast,可以根据具体引入的ui库去更换; 二、转发分享base64图片给微信好友功能  该功能在微信开发者工具中调试的时候会一直报错,真机是没问题的,可能是编译器的bug。 其实整个wx.showShareImageMenu会拉起保

    2024年02月11日
    浏览(66)
  • unity教程||Unity调用安卓方法实现安装apk文件

    记录下,个人之前做一个项目的时候碰到一个需求,安卓端的app中需要做冷更新,这里简单解释下冷更新,其实就是拿当前的app的版本号比对服务器上的版本号,如果服务器上有新版本,就下载新版本的apk,然后安装替换掉整个app,就是冷更新。但是具体实现的时候碰到个问

    2024年02月07日
    浏览(44)
  • uniapp - 安卓|苹果App软件实现调用百度人脸识别接口服务及人脸活体认证功能,uniapp苹果ios、安卓Android手机app平台,人脸认证、活体检测、身份证与人脸验证(示例代码,一键复制

    在uniapp手机App开发中(安卓Android|苹果ios系统),利用百度人脸识别api接口对接uniapp APP进行人脸识别、人脸检测、活体验证、人脸对比、人脸搜索、身份证信息是否与人脸匹配,支持离线SDK集成、离线无网络正常使用功能、自定义人脸识别框附近的页面样式和大小等。 提供详

    2024年04月11日
    浏览(61)
  • Uniapp安卓原生插件开发Demo

    当HBuilderX中提供的能力无法满足App功能需求,需要通过使用Andorid/iOS原生开发实现时,可使用App离线SDK开发原生插件来扩展原生能力。这里举两个例子来说明具体的流程。 官网文档地址: https://nativesupport.dcloud.net.cn/NativePlugin/README JAVA: jdk1.8 Android Studio: 下载地址Android Stud

    2024年02月12日
    浏览(46)
  • 安卓WebView(H5)调用原生相机及相册

    在开始叙述正文之前笔者先声明一下应用场景:例如在网页上的即时通讯需要能拍照或者从图库选择图片来进行上传,此场景下就可以用到这篇文章的内容 正文 首先,如果你已经把相机以及访问文件夹的权限都加上了并且WebView的基础操作都做完了,就差上传图片了的话那就参

    2024年02月11日
    浏览(43)
  • 在uniapp中配置和使用原生小程序组件的方法

    在uniapp中配置和使用原生小程序组件的方法 如下图:

    2024年02月10日
    浏览(35)
  • 帝国CMS会员头像图片随机调用的实现方法

    前些时检测服务器发现安全狗扫出了网站图片附件中有提示后门的图片,检查发现是用户上传的头像图片。不知道是不是误报,但确实有这个风险,想想只能删掉用户上传图片头像的功能,改为默认随机设置的方法。 分享一段精准像素自用的一段随机设置会员头像的代码,非

    2024年02月03日
    浏览(46)
  • 原生微信小程序/uniapp使用空格占位符无效解决方法

    最近碰到一个需求,在一个 text 文本中的前后添加 空格占位符 ,总所周知,我并不会前端,于是我查看了原生微信小程序以及uniapp官方文档,得到了以下答案: 原生微信小程序官方文档 uniapp官方文档 从文档可以知道我们可以用 nbsp; , ensp; , emsp; 等等作为占位符实现空格效果

    2024年02月03日
    浏览(88)
  • uniapp 原生安卓开发插件(module),以及android环境本地调试(一)

    由于uniapp 框架的局限先,有很多功能不能如原生android开发使用顺畅,因此,需要使用插件进行辅助,再由uniapp引入插件,使得功能完善。废话不多说,直接上教程!觉得有用的麻烦点个赞吧! uniapp 项目(也就是你自己的项目) 下载 安装JDK (java的JDK)jdk1.8 下载 安装 andr

    2024年02月06日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包