Robotium ROBOTIUM 实现简单的图像识别。~

magicyang · 2014年12月30日 · 最后由 达峰的夏天 回复于 2017年06月04日 · 2081 次阅读

手机上的看到的图片是原图经过服务器的处理,有部分的裁剪,同时进行过等比例的缩放。进行手机图片和原图的比较。
思路:
1.通过 ROBOTIUM 获取 IMAGEVIEW 的 BITMAP。
2.将原图读入 BITMAP,根据服务器的裁剪规则,对原图进行裁剪。
3.根据原图裁剪过的比例,将 IMAGEVIEW 上获取到的图片进行上下或左右边框留白去除。
4.通过 RGB 加权的算法,进行图片识别。

每个人需求不同,这边提供一个思路供参考。这个不需要第三方的工具。~就是要自己写点算法,网上有现成的 RGB 算法,这里加入了缩放的比例权限。感觉效果还凑合~

PS:如果不进行 2,3 的裁剪操作,可以考虑 OPENCV 的 SIFT 和 SURF 特征点的算法,具体怎么判断图片的一致性好像比较困难。
(太复杂,看了 1 天没看明白)
论坛内大神有提供 PIL 和 OPENCV FOR PYTHON(JAVA) 的使用方法,可以借鉴。

共收到 8 条回复 时间 点赞

//RGB 算法

private float orgcompare(Bitmap bitmap1, Bitmap bitmap2) {
        // TODO 自动生成的方法存根
        int [] data1=new int[256];
        int [] data2=new int[256];
        for (int i=0;i<bitmap1.getWidth();i++){
            for (int j=0;j<bitmap1.getHeight();j++){
                int rgb=bitmap1.getPixel(i, j);
                int r =(rgb >> 16) & 0xFF;
                int g = (rgb >> 8) & 0xFF; 
                int b = (rgb) & 0xFF;
                data1[(r+g+b)/3]++;
            }
        }
            for (int i=0;i<bitmap2.getWidth();i++){
                for (int j=0;j<bitmap2.getHeight();j++){
                    int rgb=bitmap2.getPixel(i, j);
                    int r =(rgb >> 16) & 0xFF;
                    int g = (rgb >> 8) & 0xFF; 
                    int b = (rgb) & 0xFF;
                    data2[(r+g+b)/3]++;
                }
            }
         float zip=((float)bitmap1.getWidth()*(float)bitmap1.getHeight()/(float)bitmap2.getWidth()/(float)bitmap2.getHeight());
         Log.v("mainActivity","图像压缩比:"+String.valueOf(zip));
         for (int i=0;i<256;i++){
             data1[i]=(int)((float)data1[i]/zip);

         }
           float result = 0F;
                for(int i = 0;i<256;i++){
                    int abs = Math.abs(data1[i]-data2[i]);
                    int max = Math.max(data1[i],data2[i]);
                    result += (1-((float)abs/(max==0?1:max)));
                }
                return (result/256)*100;
    }
//正中按比例去边框
private boolean comparebigpic(Bitmap bitmap1, Bitmap bitmap2,int i) {
        int startx=0;
        int starty=0;
        int height=0;
        int width=0;
        float slope1=(float)bitmap1.getHeight()/(float)bitmap1.getWidth();
        float slope2=(float)bitmap2.getHeight()/(float)bitmap2.getWidth();
        if (slope1>slope2){
            startx=(int)((float)bitmap2.getWidth()*(0.5-slope2/slope1/2));
            width=(int)((float)bitmap2.getWidth()*slope2/slope1);
            starty=0;
            height=bitmap2.getHeight();
        }
        else 
        {
            startx=0;
            width=bitmap2.getWidth();
            starty=(int)((float)bitmap2.getHeight()*(0.5-slope1/slope2/2));
            height=(int)((float)bitmap2.getHeight()*slope1/slope2);
        }
        Log.v("mainActivity","斜度:"+String.valueOf(slope1)+","+String.valueOf(slope2));
        Log.v("mainActivity","坐标:"+String.valueOf(startx)+","+String.valueOf(starty)+","+String.valueOf(width)+","+String.valueOf(height));
        Bitmap newbitmap2=Bitmap.createBitmap(bitmap2, startx, starty, width, height, null, false);
        compressbitmap(localdir+String.valueOf(i+1)+"newbigpic.jpeg",newbitmap2);

    return comparepic(bitmap1,newbitmap2,i);
}

#2 楼 @yangchengtest 记得添加下 markdown。。。

private boolean comparebigpic(Bitmap bitmap1, Bitmap bitmap2,int i) {
        int startx=0;

没用过 MARKDOWN 测试一下。

#4 楼 @yangchengtest 帮你改了下。。。```java 这样。。

@monkey,大神谢了。。。这东西目前还没有概念。下次注意~

magicyang 专栏文章:[该话题已被删除] 中提及了此贴 03月28日 13:48
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册