千家信息网

如何实现物体检测与跟踪

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"如何实现物体检测与跟踪"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果示例基本原理
千家信息网最后更新 2026年11月01日如何实现物体检测与跟踪

本篇内容介绍了"如何实现物体检测与跟踪"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

效果示例

基本原理和实现步骤

实现步骤

图片预处理:在图像预处理环节,通过编码、阈值及滤波、改善模式、离散模式运算等基本运算方式,在尽可能保留图像所有内容信息的基础上,整理突出图像特征,以达到最佳图像特征提取的状态。

图像特征提取:经过预处理的图像在特征提取环节,提取出价值高的特征,使高维特征空间拥有更好的分离性,更便于进行算法识别。图像特征提取一般细分成几个模块来进行:灰度值、亮度值、形状、纹理等视觉上的基本特征提取;基于像素点颜色的颜色特征提取;物体纹理及结构材质的纹理特征提取;基于轮廓和基于区域的形状特征提取;以及图像分割出的多个目标之间空间位置关系信息的空间特征提取。

特征选择:特征提取后,可根据具体物体识别情况进行特征选择。比如在特征种类繁多、物体种类多的情况下,通过特征选择找到各个特征适配的场合。

建模:特征选择之后,在建模环节建立特征集合,分辨异同点,提取相同点,主要建模对象是特征与特征之间的空间结构关系。

匹配:匹配环节是用模型去识别匹配新图像,识别图像属于哪类物体,条件符合可将物体与图像其他部分分离。

定位:物体识别后进行对目标物体的定位,即将识别到的物体坐标与实际物理空间坐标结合起来,之后可以进行对应的跟踪和模型叠加处理。

AR Engine提供的三大能力

华为AR Engine提供的三大能力分别是运动跟踪、环境跟踪、人体和人脸跟踪。

运动跟踪主要通过终端设备摄像头标识特征点,并跟踪这些特征点的移动变化,来不断跟踪终端设备位置和姿态。

环境跟踪可以识别平面,如地面、墙壁等,也可估测平面周围的光照强度。

人体和人脸跟踪让终端设备具备了对人的理解能力。通过定位人的手部位置和对特定手势的识别,可将虚拟物体或内容特效放置在人的手上;结合深度器件,还可精确还原手部的21个骨骼点的运动跟踪,做更为精细化的交互控制和特效叠加;当识别范围扩展到人的全身时,可利用识别到的23个人体关键位置,实时的检测人体的姿态,为体感和运动健康类的应用开发提供能力支撑。

开发准备

在AndroidManifest.xml中添加权限

打开main中的AndroidManifest.xml文件,在

开发步骤

配置MainActivity的显示效果

首先通过 MainActivity extends Activity implements GLSurfaceView.Renderer创建MainActivity,在MainActivity的layout文件中新建一个GLSurfaceView,用于显示摄像头拍摄的实时画面,提供给AREngine进行识别:

在MainActivity的onCreate阶段进行SurfaceView的配置:

private GLSurfaceView mSurfaceView;private static final int CONFIG_CHOOSER_RED_SIZE = 8;private static final int CONFIG_CHOOSER_GREEN_SIZE = 8;private static final int CONFIG_CHOOSER_BLUE_SIZE = 8;private static final int CONFIG_CHOOSER_ALPHA_SIZE = 8;private static final int CONFIG_CHOOSER_DEPTH_SIZE = 16;private static final int CONFIG_CHOOSER_STENCIL_SIZE = 0;private static final int OPENGLES_VERSION = 2;mSurfaceView = findViewById(R.id.surfaceview);mSurfaceView.setPreserveEGLContextOnPause(true);mSurfaceView.setEGLContextClientVersion(OPENGLES_VERSION);mSurfaceView.setEGLConfigChooser(CONFIG_CHOOSER_RED_SIZE, // Alpha used for plane blending.        CONFIG_CHOOSER_GREEN_SIZE,        CONFIG_CHOOSER_BLUE_SIZE,        CONFIG_CHOOSER_ALPHA_SIZE,        CONFIG_CHOOSER_DEPTH_SIZE,        CONFIG_CHOOSER_STENCIL_SIZE); // Alpha used for plane blending.mSurfaceView.setRenderer(this);mSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

加载一张框图文件,用于标记识别的位置,引导用户进行物体识别:

fitToScanView = findViewById(R.id.image_view_fit_to_scan);InputStream bitmapstream;try {    bitmapstream = getAssets().open("fit_to_scan.png");} catch (IllegalArgumentException | IOException e) {    Log.d(TAG, "open bitmap failed!");    return;}Bitmap bitmap = BitmapFactory.decodeStream(bitmapstream);fitToScanView.setImageBitmap(bitmap);

AREngine检测和配置权限申请

物体识别功能的使用需要设备支持AREngine,并且已经安装了AREngine的APK包,所以要对运行的设备进行判断,是否支持该功能

rivate boolean arEngineAbilityCheck() {    boolean isInstallArEngineApk = AREnginesApk.isAREngineApkReady(this);    if (!isInstallArEngineApk && isRemindInstall) {        Toast.makeText(this, "Please agree to install.", Toast.LENGTH_LONG).show();        finish();    }    Log.d(TAG, "Is Install AR Engine Apk: " + isInstallArEngineApk);    if (!isInstallArEngineApk) {        //Code of jumping to AppGallery to download the APK        isRemindInstall = true;    }    return AREnginesApk.isAREngineApkReady(this);}

AREngine检测完成之后,再进行相机权限的动态申请

private static final String[] PERMISSIONS_ARRAYS = new String[]{Manifest.permission.CAMERA};public static void requestPermission(final Activity activity) {    Log.d(TAG, "requestPermission >>");    for (String permission : PERMISSIONS_ARRAYS) {        if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {            permissionsList.add(permission);        }    }    ActivityCompat.requestPermissions(activity,            permissionsList.toArray(new String[permissionsList.size()]),            REQUEST_CODE_ASK_PERMISSIONS);    Log.d(TAG, "requestPermission <<");}

以上步骤完成之后,说明设备支持AREngine的物体识别功能,并且已经获得了相机的使用权限,接下来就可以创建ARSession,并进行识别数据库的配置

配置物体识别数据库

在进行物体识别之前,要将想识别的对象的图片添加到数据库中,使用的是ARAugmentedImageDatabase,创建一个boolean函数,进行数据库的图片添加,并给后续是否进行识别作判断:

private boolean setupAugmentedImageDatabase(ARWorldTrackingConfig config) {    ARAugmentedImageDatabase augmentedImageDatabase;    Optional augmentedImageBitmapOptional = loadAugmentedImageBitmap();    Bitmap augmentedImageBitmap = null;    if (augmentedImageBitmapOptional.isPresent()) {        augmentedImageBitmap = loadAugmentedImageBitmap().get();    } else {        return false;    }    if (augmentedImageBitmap == null) {        return false;    }    augmentedImageDatabase = new ARAugmentedImageDatabase(mSession);    augmentedImageDatabase.addImage("image_name", augmentedImageBitmap);    config.setAugmentedImageDatabase(augmentedImageDatabase);    String text = String.format(Locale.ROOT, "has set ImageNum: %d", augmentedImageDatabase.getNumImages());    messageSnackbarHelper.showMessage(this, text);    return true;}

所添加的识别图片源可以放置在Assets文件夹内,通过InputStream打开为Bitmap的格式

private Optional loadAugmentedImageBitmap() {    try (InputStream is = getAssets().open("cup.jpg")) {        return Optional.of(BitmapFactory.decodeStream(is));    } catch (IOException e) {        Log.e(TAG, "IO exception loading augmented image bitmap.", e);    }    return Optional.empty();}

配置识别后显示效果

在MainActivity的onDrawFrame中配置识别到物体之后的显示效果,在检测到要识别的物体后,用一个方框将识别的物体标识出来。

public void onDrawFrame(GL10 unused) {    Log.d(TAG, "onDrawFrame >>");    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);    if (mSession == null) {        Log.d(TAG, "onDrawFrame mSession is null");        return;    }    try {        ARFrame frame = mSession.update();        ARCamera camera = frame.getCamera();        if (camera.getTrackingState() == ARTrackable.TrackingState.PAUSED) {            return;        }        Log.d(TAG, "ARTrackable.TrackingState" + camera.getTrackingState());        drawAugmentedImages(frame, projmtx, viewmtxs, colorCorrectionRgbas);    } catch (Throwable t) {        Log.e(TAG, "Exception on the OpenGL thread", t);    }    Log.d(TAG, "onDrawFrame <<");}

判断是否识别到物体时,调用ARAugmentedImage的getTrackingStatus方法,如果是TRACKING的话,则为识别到了

switch (augmentedImage.getTrackingState()) {    case TRACKING:        augmentedImageRenderer.draw(viewmtxs, projmtx, augmentedImage, centerAnchor, colorCorrectionRgbas);        break;    default:        break;}

之后通过getCenterPose获取物体的中心位置信息,将边框添加到显示中

anchorPose = augmentedImage.getCenterPose();float scaleFactor = 1.0f;float[] modelMatrixs = new float[MODEL_MATRIX_SIZE];float[] tintColors = convertHexToColor(TINT_COLORS_HEXS[augmentedImage.getIndex() % TINT_COLORS_HEXS.length]);worldBoundaryPoses[0].toMatrix(modelMatrixs, 0);imageFrameUpperLeft.updateModelMatrix(modelMatrixs, scaleFactor);imageFrameUpperLeft.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColors);worldBoundaryPoses[1].toMatrix(modelMatrixs, 0);imageFrameUpperRight.updateModelMatrix(modelMatrixs, scaleFactor);imageFrameUpperRight.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColors);worldBoundaryPoses[2].toMatrix(modelMatrixs, 0);imageFrameLowerRight.updateModelMatrix(modelMatrixs, scaleFactor);imageFrameLowerRight.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColors);worldBoundaryPoses[3].toMatrix(modelMatrixs, 0);imageFrameLowerLeft.updateModelMatrix(modelMatrixs, scaleFactor);imageFrameLowerLeft.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColors);

"如何实现物体检测与跟踪"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

特征 物体 跟踪 图像 配置 检测 位置 权限 设备 空间 人体 内容 图片 效果 数据 数据库 文件 步骤 环节 能力 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司的优势 朗新科技与工业互联网 麻工互联网科技 互联网公司 科技公司 互联网科技英文 奇酷互联网科技 四川狮子座互联网科技 多迪互联网科技有限公司 互联网科技类展会 顺网科技2021年互联网排名 汉立互联网科技有限公司联系电话 上海宁丞科技互联网 崇明区互联网教育科技诚信经营 四川慕妮娅互联网科技有限公司 互联网公司高科技产品 广州千川互联网科技有限公司 城市宝互联网科技有限公司 珠海东科互联网科技有限公司 云南互联网科技学费 如何强化互联网金融科技 喔噻互联网科技有限公司 中正互联网科技招聘 成都仁贤领冠互联网科技有限公司 河南猎农互联网科技有限公司 中国航天科技大学国际工业互联网 互联网科技研发水平 济南小医互联网科技有限公司招聘 国产互联网科技公司 科技互联网专业工作会议发言稿 互联网高科技绘画
0