自动裁剪矩形

时间:2015-01-06 09:26:19

标签: c# image bitmap crop

我想自动裁剪我从平板电脑相机拍摄的图像。实际上我想拍摄身份证的照片并需要自动公告,我使用的是黑色背景,但有时它太釉,而且还有反射,当时它没有正确裁剪。任何人都可以用c#代码帮助我裁剪图像(注意:我使用手机摄像头拍摄身份证的图像,大部分背景都是黑色的,有时会是其他一些东西)。

下面我提到了我的代码:

private void ProcessImage(Bitmap bitmap)
    {
        // lock image
        BitmapData bitmapData = bitmap.LockBits(
            new Rectangle(0, 0, bitmap.Width, bitmap.Height),
            ImageLockMode.ReadWrite, bitmap.PixelFormat);

        // step 1 - turn background to black
        ColorFiltering colorFilter = new ColorFiltering();

        colorFilter.Red = new IntRange(0, 64);
        colorFilter.Green = new IntRange(0, 64);
        colorFilter.Blue = new IntRange(0, 64);
        colorFilter.FillOutsideRange = false;

        colorFilter.ApplyInPlace(bitmapData);

        // step 2 - locating objects
        BlobCounter blobCounter = new BlobCounter();

        blobCounter.FilterBlobs = true;
        blobCounter.MinHeight = 5;
        blobCounter.MinWidth = 5;

        blobCounter.ProcessImage(bitmapData);
        Blob[] blobs = blobCounter.GetObjectsInformation();
        bitmap.UnlockBits(bitmapData);

        // step 3 - check objects' type and highlight
        SimpleShapeChecker shapeChecker = new SimpleShapeChecker();

        Graphics g = Graphics.FromImage(bitmap);
        Pen yellowPen = new Pen(Color.Yellow, 2); // circles
        Pen redPen = new Pen(Color.Red, 2);       // quadrilateral
        Pen brownPen = new Pen(Color.Brown, 2);   // quadrilateral with known sub-type
        Pen greenPen = new Pen(Color.Green, 2);   // known triangle
        Pen bluePen = new Pen(Color.Blue, 2);     // triangle

        for (int i = 0, n = blobs.Length; i < n; i++)
        {
            List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]);

            DoublePoint center;
            double radius;


            List<IntPoint> corners;

            // is triangle or quadrilateral
            if (shapeChecker.IsConvexPolygon(edgePoints, out corners))
            {
                // get sub-type
                PolygonSubType subType = shapeChecker.CheckPolygonSubType(corners);


                Pen pen;

                if (subType == PolygonSubType.Rectangle)
                {
                    pen = (corners.Count == 4) ? redPen : bluePen;
                }
                else
                {
                    pen = (corners.Count == 4) ? brownPen : greenPen;
                }

                //g.DrawPolygon( pen, ToPointsArray( corners ) );

                if (pen.Color.Name == "Red")
                {
                    int intdummy = 0;
                    g.DrawRectangle(pen, corners[0].X, corners[0].Y, 1150, 750);

                    //Code for corpping///////
                    pictureBox2.Image = bitmap;
                    pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
                    Bitmap croppedBitmap = new Bitmap("E:\\xxx\\Vicas Tablet\\WinImager\\cropimage\\cropimage\\Testing Images\\Image1.jpg");

                     //croppedBitmap = croppedBitmap.Clone(new Rectangle(corners[0].X, corners[0].Y,1150,750),System.Drawing.Imaging.PixelFormat.DontCare);

                    croppedBitmap = croppedBitmap.Clone(
                       new Rectangle(corners[0].X, corners[0].Y, ((int)corners[1].X - (int)corners[0].X), ((int)corners[2].Y - (int)corners[1].Y)), System.Drawing.Imaging.PixelFormat.DontCare);

                    pictureBox2.Image = croppedBitmap;
                    ////End code for cropping///////////
                }
            }

0 个答案:

没有答案