主要内容

使用定制代码增强颜色替换

这个例子展示了如何使用FromAppblock从Simul金宝appink®支金宝app持包为Android™设备接收数据,并在Android应用程序中添加触摸界面。这个例子演示了使用Simulink自定义生成Android项目的工作流金宝appAndroid工作室

简介

颜色检测算法识别图像中匹配指定颜色或颜色范围的像素。原始图像中检测到的像素被来自不同图像的像素所取代。这个过程被称为颜色替换或色度键。

该模型在内部使用与颜色检测而且颜色替换的例子。

在本例中,您将从Android设备屏幕上选定的位置选择检测的参考颜色。您将配置模型并通过更新代码来开发此用户界面,以从视频帧中获得触摸位置和相应的像素信息。

这个例子显示:

  • 如何配置Simulink模型以从应用程金宝app序接收数据。

  • 一个将生成的Android应用程序导入Android Studio的例子。

  • 如何在应用程序中添加用于开发高级功能的自定义代码。

先决条件

所需的硬件

  • Android设备,配置使用androidhwsetup

  • USB电缆连接设备到主机

任务1 -建立Simulink金宝app模型并导入生成的项目

在这个任务中,您将构建一个预先配置的模型。您将在Android Studio中导入生成的项目以进行进一步开发。

1.打开用触摸替换颜色模型。

2.将模板图像加载到矩阵中RGB_background在MATLAB命令窗口中执行以下命令:

RGB_background = imread(“image_640_480.jpg”);

3.在模型中,双击FromApp块。注意字段方法名称pickColorFromDeviceScreen.在接下来的任务中,您将实现此方法。

4.将已配置的Android设备连接到主机。如果您之前没有配置您的设备,请运行androidhwsetup从MATLAB命令提示符。

5.建模在工具条的选项卡上,选择模型设置

6.选择硬件实现窗格,并设置硬件板Android设备

7.硬件选项卡中的Simuli金宝appnk模型模式部分中,选择在船上跑然后点击构建、部署和启动

8.找到生成的Android项目文件夹androidcolorreplacementcustom_ert_rtw在当前工作目录中。

9.在Android Studio中,从androidcolorreplacementcustom子文件夹。详细步骤请参见将项目导入谷歌Android Studio

任务2 -运行基础应用程序

在这个任务中,你将修改生成的应用程序代码,以运行一个简单的颜色替换检测固定颜色的情况。

1.在你的Android项目中,打开androidcolorreplacementcustom.java文件位于androidcolorreplacementcustom > SRC >主> Java > com >示例> androidcolorreplacementcustom

2.在androidcolorreplacementcustom类中,添加以下实现pickColorFromDeviceScreen方法。的输出返回固定颜色的RGB组件FromApp块在Simulink模型。金宝app注意,方法声明可以添加到类中的任何地方,只要它不与其他声明重叠。

公共int []pickColorFromDeviceScreen (){int []rgb_send = {211,27,10};/* R, G, B的颜色组成红色*/返回rgb_send;/ /参考颜色检测

3.在Android Studio IDE中,单击运行按钮,在设备上构建已更新的应用程序。

4.在“选择设备”窗格中,选择已连接的设备。按OK在选定的设备上部署和运行应用程序。

5.颜色替换相机应用程序出现,检测场景中的红色。

任务3 -更新代码使用触摸位置

在此任务中,您将更新应用程序中的代码以获得屏幕触摸位置并在该位置选择参考颜色。您将添加额外的代码来计算视频帧上的像素位置,并获取用于检测的颜色组件。您将运行更新后的应用程序,使用触摸界面查看结果。

1.在androidcolorreplacementcustom.java文件的顶部部分,在其他导入声明之后添加以下代码行。

进口android.view.MotionEvent;进口android.view.Window;进口android.util.DisplayMetrics;进口android.graphics.Rect;进口android.view.View

2.androidcolorreplacementcustom在类体开头的类实现中,添加以下代码在其他成员变量声明之后声明成员变量。

intx-1;//X的坐标感动了位置inty-1;//Y坐标感动了位置int[]rgb_sendint [3];//存储RGB参考颜色最后的感动了位置DisplayMetrics指标

3.的末尾添加以下代码registerCamera方法见androidcolorreplacementcustom类,以获取触摸位置值到x, y成员变量中。

mCameraView。setOnTouchListener(new View. ontouchlistener () {public boolean onTouch(View v, MotionEvent事件){x = ((int) event. getx ());y = ((int) event.getY());返回错误;}});

4.在同一个类中,添加以下方法来查找应用程序布局中的视图偏移量。这些偏移量将用于建立图像中触摸位置和像素位置之间的对应关系。

/**获取高度状态酒吧布局设备。* /公共intgetStatusBarHeight ()矩形r矩形();窗口wgetWindow ();w.getDecorView () .getWindowVisibleDisplayFrame (r);返回r.top;} /**获取高度标题酒吧应用程序标题的名字* /公共intgetTitleBarHeight ()intviewTopgetWindow () .findViewById (Window.ID_ANDROID_CONTENT) .getTop ();返回viewTop - getStatusBarHeight());}

5.替换现有的onCameraFrame方法,具有以下实现

公共onCameraFrame (CvCameraViewFrame inputFrame)mCameraBufInput = inputFrame.rgba();metrics = new DisplayMetrics();.getDefaultDisplay getWindowManager () () .getMetrics(指标);如果(x != -1 && y != -1){//表示最近触摸的位置//如果真的,触摸检测到如果((y < metrics. hightpixels) && (x < metrics.widthPixels)) {int h_off, rel_h;Int w_off, rel_w;/**计算偏移量和缩放参数应用程序窗口原始视频框架* /h_off = getTitleBarHeight() + getStatusBarHeight();Rel_h = (metrics。hightpixels - h_off);rel_w = ((mCameraBufInput.width() * rel_h) / mCameraBufInput.height());W_off =(度量。widthPixels - rel_w) / 2; /** Calculating correspondence触摸位置*到像素坐标视频框架* /int诗句((y - h_off) * mCameraBufInput.height())/ rel_h;intposX((x - w_off) * mCameraBufInput.width())/ rel_w;/* get the像素信息计算抵消图像* /[] rgbmCameraBufInput。get(posY, posX)如果(rgb != null) {rgb_send[0] = (int)rgb[0];Rgb_send [1] = (int)rgb[1];Rgb_send [2] = (int)rgb[2];}} x = -1;/*重置x,y下一个触摸事件* /Y = -1;}返回mCameraBufOutput;}

6.取代pickColorFromDeviceScreen方法,以返回所选参考颜色的RGB组件作为的输出FromApp块在Simulink模型。金宝app

公共int []pickColorFromDeviceScreen (){/*视频帧的参考颜色*/返回rgb_send;}

7.在Android Studio IDE中,单击运行按钮,在设备上构建已更新的应用程序。

8.在“选择设备”窗格中,选择已连接的设备。按OK在选定的设备上部署和运行应用程序。

9.一旦更新的应用程序出现在设备上,触摸屏幕图像上的不同区域,观察颜色的替换。

下面的屏幕显示了将橙色墙壁替换为背景图像。

下面的屏幕显示了白色与背景图像的替换。

其他可以尝试的事情

  • 控件中接收参考颜色数据金宝appFromApp块。使用ToAppblock从Simul金宝appink支金宝app持包for Android®设备接收数据进行定制。在应用程序中,实现一个方法并添加自定义代码以在日志中打印接收到的数据。