杨振宁大学物理1214
色带矩形带来很大麻烦!
今天想到一个方法,整个色带矩形拉通,做个通铺处理,不计算,代码做最小化,最稳定追求。
因为黄色字稳定,我们找到他的中心,而这个色带矩形和这个中心的关系及其稳定。
timer中最后整理的代码:
Bitmap glob_curBitmap = bmp;
Rectangle rc = new Rectangle(0, 0, glob_curBitmap.Width, glob_curBitmap.Height);
System.Drawing.Imaging.BitmapData bmpdata = glob_curBitmap.LockBits(rc,
System.Drawing.Imaging.ImageLockMode.ReadWrite,
glob_curBitmap.PixelFormat);
IntPtr imageptr = bmpdata.Scan0;
int ww = glob_curBitmap.Width;
int hh = glob_curBitmap.Height;
int bytes = 0;
bytes = ww * hh * 4;//此处针对的是32位位图
byte [] rgbValues = new byte[bytes];
// pictureBox1.Image = bmp2;
// byte[]
glob_buffer8 = new byte[ww * hh];
rgbbufercopyB = new byte[ww * hh];
rgbbufercopyG = new byte[ww * hh];
rgbbufercopyR = new byte[ww * hh];
System.Runtime.InteropServices.Marshal.Copy(imageptr, rgbValues, 0, bytes);
glob_curBitmap.UnlockBits(bmpdata);
for (int ii = 0; ii < hh; ii++)
{
for (int j =0; j < ww; j++)
{
int n = ii * ww + j;
rgbbufercopyR[n] = rgbValues[4 * n + 2] ;
rgbbufercopyG[n] = rgbValues[4 * n + 1] ;
rgbbufercopyB[n] = rgbValues[4 * n] ;
glob_buffer8[n] = (byte)(0.3 * rgbValues[n * 4 + 2] + 0.6* rgbValues[n * 4 + 1] + 0.1 * rgbValues[n * 4]);
}
}
//使用新方法,原版改进,不必匹配,利用黄色稳定性202412131248
int junzhix = 0;
int junzhiy = 0;
int 计数 = 0;
for (int i = 240; i < 480; i++)//我们认为黄色字在图像下半部
{
byte fugair = 0; byte fugaig = 0; byte fugaib = 0;
byte fugai = 0;
for (int j = 0; j < 640; j++)
{
int n = i * ww + j;
float hue = 0;
RGB2HSLTest(rgbValues[4 * n + 2], rgbValues[4 * n + 1], rgbValues[4 * n], ref hue);
if (hue > 35 && hue < 85)//,黄色范围给的比较宽泛
{//黄色
//新增,寻找黄色字50-63外接矩形202412130850
if (hue > 50 && hue < 63)//黄色收窄
{
junzhiy += i;
junzhix += j;
计数++;
}
rgbValues[4 * n + 2] = (byte)(rgbValues[4 * n + 2 - 4 * ww] / 2 + fugair / 2);
rgbValues[4 * n + 1] = (byte)(rgbValues[4 * n + 1 - 4 * ww] / 2 + fugaig / 2);
rgbValues[4 * n] = (byte)(rgbValues[4 * n - 4 * ww] / 2 + fugaib / 2);
}
else
{
rgbbufercopyR[n] = fugair = rgbValues[4 * n + 2];
rgbbufercopyG[n] = fugaig = rgbValues[4 * n + 1];
rgbbufercopyB[n] = fugaib = rgbValues[4 * n];
}
}
}
黄色中心 = new Point(junzhix / 计数, junzhiy / 计数);
textBox15.Text = 黄色中心.X.ToString();
textBox16.Text = 黄色中心.Y.ToString();
//消除色带矩形
for (int i = 0; i < 640; i++)
for (int j = 黄色中心.Y - 58; j < 黄色中心.Y + 60; j++)//58+60=118=色带矩形高
{
int temp = j * 640 + i;//原方法
rgbValues[temp * 4] = (byte)(rgbValues[temp * 4] + 50 > 255 ? 255 : rgbValues[temp * 4] + 50);
rgbValues[temp * 4 + 1] = (byte)(rgbValues[temp * 4 + 1] + 50 > 255 ? 255 : rgbValues[temp * 4 + 1] + 50);
rgbValues[temp * 4 + 2] = (byte)(rgbValues[temp * 4 + 2] + 50 > 255 ? 255 : rgbValues[temp * 4 + 2] + 50);
}
showrgbbuffer2pict(rgbValues, ww, hh, pictureBox1);
ok,一种方法走到底,持续的改进使得现在这个版本感觉比机器视觉匹配版本好!
所有都做完了,想一下能不能就在原来的网页上实现相同功能,把我们验证后的程序界面隐去呢?
可以试一试,绝对可以!
我的电脑屏幕是1366*768的,其他电脑分辨率没试过,你也可以去试一试,如果有问题,可以做相应修改,一定能行!