STF-minitouch的使用

我们经常会遇到这样子的情况,需要演示一些手机上的一些界面的时候。不能够把手机上的影像投影到电脑上,同时在电脑上操作手机。也可能是我了解的比较少吧。

最近在论坛上看到了 [STF 框架之 minitouch 工具] (https://testerhome.com/topics/4400) 其实里面已经介绍的很详细了,只是使用C#的来实现的。对于c#确实不太熟悉,所以就拿了 minicap_java DoctorQ使用java基于minicap实现的一个GUI展示Android手机屏幕的一个工具来继续完善它,使它能够支持一些鼠标点击操作。

介绍


minitouch提供了一个socket接口用来出来在Android设备上的多点触摸事件以及手势。它能够支持api 10以上的设备且不需要通过root. 但是根据不同的cpu的ABI需要使用不同的minitouch。

使用


  1. 首先我们需要找出你的设备所支持的ABI

    ABI=$(adb shell getprop ro.product.cpu.abi | tr -d '\r')

    注意:如果你有多台设备连接的情况下并且你没有设置$ANDROID_SERIAL的话,你需要去指定设备 -s <serial>

  2. 推送对应的文件到设备上。

    adb push libs/$ABI/minitouch /data/local/tmp/

    注意如果你的SDK<16的情况下,你需要使用minitouch-nopie

    当然你还需要更改下minitouch的执行权限。

    chmod 777 /data/local/tmp/minitouch

    并且通过下面的命令来判断是否已经操作成功了。

    adb shell /data/local/tmp/minitouch -h
  3. 下来我们可以直接通过adb shell /data/local/tmp/minitouch 来执行,这个时候设备就开始监听了。

  4. 这个时候除非出现错误的消息或者说程序退出,我们需要进行端口转发 通过如下命令:

    adb forward tcp:1111 localabstract:minitouch
  5. 现在我们就需要去连接对应的端口,获取数据了。
    提示文档里面给的是通过nc localhost 1111,但是我们肯定不是这样子的,我们需要自己去创建一个socket来进行连接。获取socket对应的数据。

socket命令


d <contact> <x> <y> <pressure>

例如:d 0 10 10 50

压力值50 在点 10,10 使用一个触点按下。

m <contact> <x> <y> <pressure>

例如: m 0 10 10 50
压力值为50在 10,10滑动。

u <contact>

例如:u 0
手势抬起

实现


这里我们只说明鼠标的一些事件的实现。

mp.addMouseListener(new MouseListener() {
    @Override
      public void mouseClicked(MouseEvent e) {

      }

      @Override
      public void mousePressed(MouseEvent e) {

          System.out.println("i press"+e.getX()+","+e.getY());
          Point point = pointConvert(e.getPoint());
          if (outputStream != null) {
              String command = String.format("d 0 %s %s 50\n", (int)point.getX(), (int)point.getY());
              executeTouch(command);
          }
      }

      @Override
      public void mouseReleased(MouseEvent e) {
          System.out.println("i release");
          if (outputStream != null) {
              String command =  "u 0\n";
              executeTouch(command);
          }
      }

      @Override
      public void mouseEntered(MouseEvent e) {

      }

      @Override
      public void mouseExited(MouseEvent e) {

      }
    });


    mp.addMouseMotionListener(new MouseMotionListener() {
      @Override
      public void mouseDragged(MouseEvent e) {
          System.out.println(e.getPoint().getX()+","+e.getPoint().getY());
          Point point = pointConvert(e.getPoint());
          if (outputStream != null) {
              String command = String.format("m 0 %s %s 50\n", (int)point.getX(), (int)point.getY());
              executeTouch(command);
          }
      }

      @Override
      public void mouseMoved(MouseEvent e) {

      }
});

private Point pointConvert(Point point)
    {
        Point realpoint = new Point((int)((point.getX()*1.0 / width) * banner.getMaxX()) , (int)((point.getY()*1.0 /height) * banner.getMaxY()) );
        return realpoint;
    }

    private void executeTouch(String command) {
        if (outputStream != null) {
            try {
                System.out.println("command" + command);
                outputStream.write(command.getBytes());
                outputStream.flush();
                String endCommand = "c\n";
                outputStream.write(endCommand.getBytes());
                outputStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

minicapDemo具体可参考代码。

参考文档

STF 框架之 minicap 工具
STF 框架之 minitouch 工具

感想

上面的项目基本上都没改什么,只是简单的加了几句代码而已。还是要感谢几个大神。

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: SCE最小方法确定β值的STF-CS(Segmentation-based Thresholding Function with Clustering-based Support)是一种基于聚类的分割阈值选择算法,其主要思想是将图像分成多个子区域,然后使用聚类方法选择适当的阈值以进行二值化。 首先,将图像分割成多个子区域,并计算每个子区域的SCE(Spatial Contrast Energy)值。根据SCE值,确定每个子区域中像素的亮度区间,将像素分成若干个类别。 然后,为每个像素分类建立一个直方图,将每个像素在其所在的亮度区间内进行统计。将每个像素的直方图与其相邻像素的直方图进行比较,计算两个直方图之间的相似性得分。最终,根据相似性得分,将像素分成多个聚类。 最后,选择最佳的阈值来二值化图像。首先,计算所有聚类的个数,然后取相似性得分最高的聚类的中心点位置作为阈值。将整个图像中的所有像素与此阈值进行比较,得到一个二值化图像。 SCE最小方法确定β值的STF-CS方法将图像分成多个子区域,并使用聚类方法选择最佳阈值以实现自适应阈值选择。它可以有效地处理图像中的噪声和灰度变化,并产生清晰的二值化图像。 ### 回答2: 在SCE方法中,我们需要确定参数β的值,以完成信号的稀疏表示。一般来说,β值越小,选择的稀疏信号就越少,信号的噪声容忍度也越高。反之,β值越大,选择的稀疏信号就越多,信号的噪声容忍度也越低。 在确定β的值时,常用的方法是STF-CS(Smoothed Thresholding Function - Compressed Sensing)。STF-CS方法主要是基于信号的偏移量对β值进行调整的。首先,我们需要计算出原始数据和估计数据之间的残差值。然后,使用一个平滑的阈值函数对残差进行加权,得到新的残差值。根据新的残差值,我们可以确定一个适当的β值。 具体来说,STF-CS方法使用以下步骤确定β值: 1. 估计稀疏信号和残差值。 2. 计算残差的均方根误差(RMSE)并对其加权,得到一个平滑的误差函数(Smoothed Error Function)。 3. 在误差函数最小的位置确定β值。 4. 根据确定的β值重新计算稀疏信号和残差值。 5. 重复步骤2-4,直到稀疏信号和残差值收敛。 STF-CS方法是一种基于估计误差进行自适应调整的方法,可以在不同信噪比条件下确定适当的β值。但是,该方法需要进行多次迭代计算,计算复杂度较高。因此,在实际应用中,需要根据具体情况选择合适的方法,在计算效率和稀疏度之间进行权衡。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值