先看一下效果:(还有改进的余地)
我的方法是笨方法,也比较刻板。
1,首先想到,把屏幕打印下来。c#提供了这样一个函数:
Bitmap bmp = new Bitmap(640, 480, PixelFormat.Format32bppArgb);
// 创建一个画布
Graphics g = Graphics.FromImage(bmp);
Point hello = new Point(0, 300);
g.CopyFromScreen(hello, Point.Empty, new Size(640, 480));
// 释放画布资源
g.Dispose();
2,上面代码什么意思呢?就是屏幕上取一幅640*480的bmp图像。
我们观察上图,黄色字方框大概在距离顶部300个像素的地方,即y=300,另外x在最左端=0.
执行代码,并显示,就是上图有半部分,要注意的是:我们这些代码在桌面运行时,不能遮挡网页(0,300)这个位置640*480的区域。
3,显示640*480图像的代码为:
timer1.Start();//显然,我们创建这个timer循环,为了实时捕捉网页视频。
显然,我们第一步得到的bmp,可以直接给picturebox。即:
private void timer1_Tick(object sender, EventArgs e)
{pictureBox1.Image = bmp;}//我们已经得到想要的图像
4,处理黄色字,首先黄色字外有一个覆盖带(显然是个矩形带),看上去,也应该消掉。
5,我们观察,发现在640*480这个截取的图像中,覆盖带y=205左右,x显然不是0,因为黑边很宽,大概在100左右,我们假定就是100,好这个矩形带的(top,left)有了,要消掉他,还得知道(botom,right),为了方便我们right取640.经过测试,发现bottom也是一个定值。
6,处理这个矩形框带还差一个条件,就是框内外的颜色差值。这个好办:
如上图,我们用阴影部分的灰度平均值减去框外灰度平均值,就可以得到这个颜色差。
7,矩形框带+颜色差,就消掉了矩形框带。
8,想办法除却换色的字,容易,但干掉后怎么填充呢?这是个麻烦事!
我使用每一个字周边来填充,如下图:
每个字的每一笔画,如箭头开始位置,都用上下两块颜色值合并来填充。
好所有事情搞完,就是了。
rgb转黄色的色调,在35到85之间。
代码还比较麻烦,不是很满意。而且这黄色的字位置会变化,矩形框带也跟着变。
想到的另一个办法是:
megauging中形状匹配已经实现了,抄过来就好了。
即黄色的字框入roi,学习,然后实时匹配这些字,即使黄色的字位置会变化,矩形框带也跟着变也不影响!
关键是,字扣掉后填充还得下功夫!颜色差相对容易些!
突然想到形态学腐蚀!