这个跟验证码识别有共通之处。
1、如果每张快递单拍照坐标都是一样的,那直接量一下截取就行。(你这情况可能性不大)
2、如果快递单边框与背景颜色有较大区别,比如快递单是白色,你放黑色,黄色等桌子上拍,这样你可以根据颜色诧异,循环找到4个点坐标,然后根据4个点截取一个四边形
如何区分颜色并且找到四个角的点?事根据像素分析来嘛?
@久久小垠: 对啊,根据像素的rgb来区分。当然你拍照要有技巧,要把颜色区分大一点。
@孤零落叶寒:rgb值用什么存起来好一点呢?这个多的像素,一个一个循环吗
@久久小垠: 每个颜色都有一个区间范围。具体你怎么存这个看你怎么设计,如果颜色相差很大,比如黑吧,直接r+g+b根据值判断就行。这个只是适用于部分,并非全部试用。或者你提供一些图片出来
@孤零落叶寒: 比如这样的
@久久小垠:
private Bitmap GetResultImage(Image img) { try { using (Bitmap bmp=new Bitmap(img)) { Point p_min=new Point(0,0), p_max=new Point(0,0); int min = 0, max = 0; for (int x=0;x<bmp.Width;x++) { for (int y=0;y<bmp.Height;y++) { Color c = bmp.GetPixel(x, y); if (Convert.ToInt32(c.R) > 200 && Convert.ToInt32(c.G) > 200 && Convert.ToInt32(c.B) > 200) { if (min == 0 || max == 0) { p_min = new Point(x, y); p_max = new Point(x, y); min = x + y; max = x + y; } else { if (x + y < min) { min = x + y; p_min = new Point(x, y); } else if (x+y>max) { max = x + y; p_max = new Point(x,y); } } } } } Bitmap bmpResult = new Bitmap(bmp.Width, bmp.Height); TextureBrush brush = new TextureBrush(img); GraphicsPath path = new GraphicsPath(); path.AddPolygon(new[] { p_min, new Point(p_max.X,p_min.Y), p_max, new Point(p_min.X,p_max.Y) }); Graphics g = Graphics.FromImage(bmpResult); g.Clear(Color.Transparent); g.FillPath(brush, path); return bmpResult; } } catch { return null; } }
我这么做法就是取左上角快递单的位置,取右下角快递单位置,然后根据这两个位置取一个矩形。如
但发现照片拍出来是一个四边形,并非矩形。或者你可以把隔一段距离把快递单边界坐标找出来,然后根据路径截取,效果相对好一点。
@孤零落叶寒: 多谢大神,万分感谢。 我按你的方法试试看。