void device_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) { Bitmap shoot = eventArgs.Frame.Clone() as Bitmap; try { frameCounter++; if (frameCounter > 10) { invoices = invoiceProcess.GetInvoiceCollection(shoot); frameCounter = 0; } if (invoices != null && invoices.Count > 0) { using (Graphics graph = Graphics.FromImage(shoot)) { foreach (Invoice invoice in invoices) { graph.DrawPolygon(pen, invoice.Corners); //Draw a polygon around card PointF point = invoiceProcess.GetStringPoint(invoice.Corners); //Find Top left corner point.Y += 10; graph.DrawString(invoice.Code == null ? "" : invoice.Code, font, Brushes.Lime, point); //Write string on card } } } //Draw Rectangle around cards and write card strings on card } catch (Exception ex) { File.AppendAllText("e:\\error.txt", ex.Message); throw; } pb_Cinema.Image = ResizeShoot(shoot); }
public InvoiceCollection GetInvoiceCollection(Bitmap source) { InvoiceCollection collection = new InvoiceCollection(); //Collection that will hold cards Bitmap temp = source.Clone() as Bitmap; //Clone image to keep original image FiltersSequence seq = new FiltersSequence(); seq.Add(Grayscale.CommonAlgorithms.BT709); //First add grayScaling filter seq.Add(new OtsuThreshold()); //Then add binarization(thresholding) filter temp = seq.Apply(source); // Apply filters on source image //Extract blobs from image whose size width and height larger than 150 BlobCounter extractor = new BlobCounter(); extractor.FilterBlobs = true; extractor.MinWidth = extractor.MinHeight = InvoiceHeight - 50; extractor.MaxWidth = extractor.MaxHeight = InvoiceWidth + 50; extractor.ProcessImage(temp);//去掉不符合宽高的色块 //Will be used transform(extract) cards on source image QuadrilateralTransformation quadTransformer = new QuadrilateralTransformation(); //Will be used resize(scaling) cards ResizeBilinear resizer = new ResizeBilinear(InvoiceWidth, InvoiceHeight); foreach (Blob blob in extractor.GetObjectsInformation()) { //Get Edge points of card List <IntPoint> edgePoints = extractor.GetBlobsEdgePoints(blob); //Calculate/Find corners of card on source image from edge points List <IntPoint> corners = PointsCloud.FindQuadrilateralCorners(edgePoints); quadTransformer.SourceQuadrilateral = corners; //Set corners for transforming card quadTransformer.AutomaticSizeCalculaton = true; //提取图像 Bitmap invocieImg = quadTransformer.Apply(source); //Extract(transform) card image if (invocieImg.Width < invocieImg.Height) //If card is positioned horizontally { invocieImg.RotateFlip(RotateFlipType.Rotate90FlipNone); //Rotate } invocieImg = resizer.Apply(invocieImg); //归一化图像 // File.AppendAllText("e:\\info.txt", "aaaaaaaaaaaaaaa"); // File.AppendAllText("e:\\info.txt",invocieImg.FrameDimensionsList.ToString()); //invocieImg.Save("e:\\" + Guid.NewGuid() + ".jpg"); // Thread.Sleep(1000); Invoice invoice = new Invoice(invocieImg, corners.ToArray()); //Create invoice Object Bitmap target = invoice.GetTarget(); //try //{ // // target.Save("e:\\imgt\\" + Guid.NewGuid() + "taar.jpg"); //} //catch (Exception ex) //{ // File.AppendAllText("E:\\error2.txt", ex.Message + "**********"+ex.Source); // throw; //} try { invoice.Code = ImageProcess.GetYZMCode(target, "zimo.txt", 4, 20, 30, 2, false, 4); collection.Add(invoice); //Add card to collection } catch (Exception ex) { File.AppendAllText("E:\\error2.txt", ex.Message + "**********" + ex.Source + "---" + DateTime.Now); throw; } } return(collection); }