本人第一次写博客,欢迎各位大神前来批评指正。
话不多说,首先,分析一下从手机端获取到的图片
这张图是初始状态,各个色调比较分明。小人的颜色最容易辨认,且几乎不和其他任何板块或背景色冲突。其中小人的位置在屏幕的40%以下64%以上(图上是在左边,但是也有可能在右边,所以不能排除横坐标的一些点),它的颜色区间为RGB(40,40,70)-RGB(65,65,105)颜区间还是比较大的,为了包含所有的小人像素颜色,该区间被稍微放大过。
接下来的重点是找出小人的底部中心,我们放大小人的底部,如图:
因为小人底部是圆形,所以在放大后底部的像素呈直线排列。红色点是我们需要的位置,这个位置可以这样获得
通过底部的直线的左端点和右端点的横坐标算出中心中心来找出小人的x坐标位置。我们可以从64%屏幕往上(减小扫描区域,加快运算),从左往右遍历所有的像素点,那么第一个颜色在小人的颜色区间的像素点,必定是下面红色线的左端点,记录下该点(x1,y1)。为了找出右端点,继续向右扫描,当第一次扫描到的点为非小人颜色区间的点时,就说明小人最下面的像素点已经扫完了,那么右端点就是当前扫描的点(x,y1)的前一个像素点(x-1,y1)同时记录下该点。通过左端点和右端点就能很快计算出小人的底部的横坐标(x1+x-1)/2;那么小人的中心横坐标如何获得?
python版本中找出的中点越在小人底部向上20个像素的位置,但是如果手机分辨率变化,可能就会引起较大的误差。从上面的图片可以看出,小人底座最宽的区域(红色长线的部分)就是小人底座的直径,小人底座中心的y坐标就是它的直径的左端点。
很显然,在底座半圆像素的图片上,直径左端点的x坐标是最小的。为了减少扫描的点的个数,我们已经找到了底部直线的左端点,只要顺着它向上想左找符合小人颜色的点,直到找到最左侧的点(x最小的点)就结束,那么,该点的y坐标yn