杨振宁大学物理视频中黄色的字去掉(稳固简洁版本,四) ...

打印 上一主题 下一主题

主题 875|帖子 875|积分 2625

杨振宁大学物理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的,其他电脑分辨率没试过,你也可以去试一试,如果有问题,可以做相应修改,肯定能行!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表