首页 新闻 会员 周边 捐助

C# 图片获取轮廓并截取下并保存

0
悬赏园豆:10 [已解决问题] 解决于 2017-01-22 14:57

我用高清相机拍一张图片,里面有一张快递单,

怎么把其余的去掉,就把快递单识别并截取出来?

居~的主页 居~ | 初学一级 | 园豆:28
提问于:2016-12-14 15:43
< >
分享
最佳答案
0

这个跟验证码识别有共通之处。

1、如果每张快递单拍照坐标都是一样的,那直接量一下截取就行。(你这情况可能性不大)

2、如果快递单边框与背景颜色有较大区别,比如快递单是白色,你放黑色,黄色等桌子上拍,这样你可以根据颜色诧异,循环找到4个点坐标,然后根据4个点截取一个四边形

 

收获园豆:10
孤零落叶寒 | 小虾三级 |园豆:606 | 2016-12-15 11:25

如何区分颜色并且找到四个角的点?事根据像素分析来嘛?

居~ | 园豆:28 (初学一级) | 2016-12-23 15:11

@久久小垠: 对啊,根据像素的rgb来区分。当然你拍照要有技巧,要把颜色区分大一点。

孤零落叶寒 | 园豆:606 (小虾三级) | 2016-12-23 21:26

@孤零落叶寒:rgb值用什么存起来好一点呢?这个多的像素,一个一个循环吗

居~ | 园豆:28 (初学一级) | 2016-12-23 23:01

@久久小垠: 每个颜色都有一个区间范围。具体你怎么存这个看你怎么设计,如果颜色相差很大,比如黑吧,直接r+g+b根据值判断就行。这个只是适用于部分,并非全部试用。或者你提供一些图片出来

孤零落叶寒 | 园豆:606 (小虾三级) | 2016-12-24 01:07

@孤零落叶寒:   比如这样的

居~ | 园豆:28 (初学一级) | 2016-12-24 11:54

@久久小垠: 

 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;
            }
        }

我这么做法就是取左上角快递单的位置,取右下角快递单位置,然后根据这两个位置取一个矩形。如

但发现照片拍出来是一个四边形,并非矩形。或者你可以把隔一段距离把快递单边界坐标找出来,然后根据路径截取,效果相对好一点。

孤零落叶寒 | 园豆:606 (小虾三级) | 2016-12-24 20:49

@孤零落叶寒: 多谢大神,万分感谢。  我按你的方法试试看。

居~ | 园豆:28 (初学一级) | 2016-12-27 11:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册