Example #1
0
        private void AnswerKeyMaker_Load(object sender, EventArgs e)
        {
            Application.DoEvents();
            SheetSelector ssf = new SheetSelector(XMLFileName);

            ssf.StartPosition = FormStartPosition.CenterParent;
            ssf.ShowDialog(this);
            if (ssf.Selected == "")
            {
                Close();
            }
            else
            {
                for (int i = 1; i < 1000; i++)
                {
                    if (i.ToString() != ((OMREnums.OMRSheet)i).ToString())
                    {
                        try
                        {
                            OMRSheetReader.GetSheetPropertyLocation(XMLFileName, (OMREnums.OMRSheet)i, OMREnums.OMRProperty.SheetSize);
                            if (((OMREnums.OMRSheet)i).ToString() == ssf.Selected)
                            {
                                workingSheet = (OMREnums.OMRSheet)i;
                            }
                        }
                        catch { }
                    }
                }
                populate();
            }
        }
Example #2
0
        public void action(string teacher, string student, string imagePath)
        {
            /// Get scan image and resize it
            scannedImage = System.Drawing.Image.FromFile(imagePath);
            scannedImage = (System.Drawing.Image)ImageUtilities.ResizeImage((Bitmap)scannedImage, 2100, 2100 * scannedImage.Height / scannedImage.Width);
            Bitmap        unf    = new Bitmap(scannedImage);
            OpticalReader reader = new OpticalReader();

            scannedImage = (System.Drawing.Image)reader.ExtractOMRSheet(unf, "sheets.xml", OMREnums.OMRSheet.A550);

            /// Get user selected options
            Rectangle[] Blocks = new Rectangle[]
            {
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock1),
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock2),
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock3),
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock4)
            };

            List <Bitmap[]> bmps = new List <Bitmap[]>();

            for (int i = 0; i < 4; i++)
            {
                bmps.Add(SliceOMarkBlock(scannedImage, Blocks[i], 10));
            }

            string ans = "";

            foreach (Bitmap[] blk in bmps)
            {
                foreach (Bitmap line in blk)
                {
                    ans += rateSlice(line, 5) + ",";
                }
            }
            Console.WriteLine(ans);

            /// Get exam ID
            OpticalReader rr     = new OpticalReader();
            int           examId = Convert.ToInt32(rr.getRegNumOfSheet(scannedImage, OMREnums.OMRSheet.A550, "sheets.xml", false).ToString());

            Console.WriteLine(examId);
            Console.Read();

            /// Return to Java application
            string jarPath = "E-Marker.jar";
            string argumentsFortheJarFile = "\"" + teacher + "\" \"" + student + "\" " + examId + " " + ans;

            System.Diagnostics.Process clientProcess = new Process();
            clientProcess.StartInfo.FileName  = "java";
            clientProcess.StartInfo.Arguments = @"-jar " + jarPath + " " + argumentsFortheJarFile;
            clientProcess.Start();
            clientProcess.WaitForExit();
        }
Example #3
0
        private void radButton1_Click(object sender, EventArgs e)
        {
            panel1.Invalidate(); Application.DoEvents();
            Rectangle[] Blocks = new Rectangle[]
            {
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock1),
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock2),
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock3),
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock4)
            };

            List <Bitmap[]> bmps = new List <Bitmap[]>();

            for (int i = 0; i < 4; i++)
            {
                bmps.Add(rr.SliceOMarkBlock(panel1.BackgroundImage, Blocks[i], 10));
            }

            DataSet dsMarks = DB_Connect.ExecuteQuery("SELECT a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40 FROM mcq_marking_scheme_tab WHERE marking_scheme_id = '" + markingSchemeId + "';");

            int[] ans_arr;
            ans_arr = new int[40];
            string img_path = txtFileName.Text.ToString();

            int cnt    = 0;
            int result = 0;

            foreach (Bitmap[] blk in bmps)
            {
                foreach (Bitmap line in blk)
                {
                    ans_arr[cnt] = rr.rateSlice(line, 5);


                    if (ans_arr[cnt] == int.Parse(dsMarks.Tables[0].Rows[0][cnt].ToString()))
                    {
                        result++;
                    }


                    cnt++;
                }
            }


            DB_Connect.InsertQuery("INSERT INTO mcq_answers_tab(candidate_id,exam_id,answersheet_path,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,total_mark) VALUES('" + candidateId + "','" + examId + "','" + img_path + "', " + ans_arr[0] + ", " + ans_arr[1] + ", " + ans_arr[2] + ", " + ans_arr[3] + "," + ans_arr[4] + "," + ans_arr[5] + "," + ans_arr[6] + "," + ans_arr[7] + "," + ans_arr[8] + "," + ans_arr[9] + "," + ans_arr[10] + "," + ans_arr[11] + "," + ans_arr[12] + "," + ans_arr[13] + "," + ans_arr[14] + "," + ans_arr[15] + "," + ans_arr[16] + "," + ans_arr[17] + "," + ans_arr[18] + "," + ans_arr[19] + "," + ans_arr[20] + ", " + ans_arr[21] + "," + ans_arr[22] + "," + ans_arr[23] + "," + ans_arr[24] + "," + ans_arr[25] + "," + ans_arr[26] + "," + ans_arr[27] + "," + ans_arr[28] + "," + ans_arr[29] + "," + ans_arr[30] + "," + ans_arr[31] + "," + ans_arr[32] + "," + ans_arr[33] + "," + ans_arr[34] + "," + ans_arr[35] + "," + ans_arr[36] + "," + ans_arr[37] + "," + ans_arr[38] + "," + ans_arr[39] + "," + result + ");");



            lblResult.Text = result.ToString();
        }
Example #4
0
 private void button2_Click(object sender, EventArgs e)
 {
     if (listBox1.Items.Count < OMRSheetReader.GetSheetPropertyInt(
             XMLFileName,
             workingSheet,
             OMREnums.OMRProperty.NumOfBlocks) * (OMRSheetReader.GetSheetPropertyBool(XMLFileName, workingSheet, OMREnums.OMRProperty.TensBlock) ? 10 : 20))
     {
         listBox1.Items.Add("Q# " + (listBox1.Items.Count + 1));
         answerkey.Add(1);
         listBox1.SelectedIndex = listBox1.Items.Count - 1;
     }
     else
     {
         MessageBox.Show(workingSheet.ToString() + " does not support more than " + listBox1.Items.Count + " answers");
     }
 }
Example #5
0
 public SheetSelector(string xmlFile)
 {
     InitializeComponent();
     for (int i = 1; i < 1000; i++)
     {
         if (i.ToString() != ((OMREnums.OMRSheet)i).ToString())
         {
             try
             {
                 OMRSheetReader.GetSheetPropertyLocation(xmlFile, (OMREnums.OMRSheet)i, OMREnums.OMRProperty.SheetSize);
                 listBox1.Items.Add(((OMREnums.OMRSheet)i).ToString());
             }
             catch { }
         }
     }
 }
Example #6
0
        private void button7_Click(object sender, EventArgs e)
        {
            //ContrastCorrection cc = new ContrastCorrection();
            //panel1.BackgroundImage = cc.Apply((Bitmap)panel1.BackgroundImage);
            panel1.Invalidate(); Application.DoEvents();
            showTimeStamp("Slicing Started");
            Rectangle[] Blocks = new Rectangle[]
            {
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock1),
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock2),
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock3),
                OMRSheetReader.GetSheetPropertyLocation("sheets", OMREnums.OMRSheet.A550, OMREnums.OMRProperty.tensBlock4)
            };

            List <Bitmap[]> bmps = new List <Bitmap[]>();

            for (int i = 0; i < 4; i++)
            {
                bmps.Add(SliceOMarkBlock(panel1.BackgroundImage, Blocks[i], 10));
            }
            showTimeStamp("Slicing ended");

            string ans = "";

            foreach (Bitmap[] blk in bmps)
            {
                foreach (Bitmap line in blk)
                {
                    ans += rateSlice(line, 5) + ",";
                }
                ans += "\r\n";
            }

            panel1.Invalidate();
            Application.DoEvents();
            MessageBox.Show(ans);
        }
Example #7
0
        private Bitmap ExtractPaperFromFlattened(Bitmap bitmap, Bitmap basicImage, int minBlobWidHei, int fillint, int contint, string OMRSheets)
        {
            BitmapData bitmapData = bitmap.LockBits(
                new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                ImageLockMode.ReadWrite, bitmap.PixelFormat);

            // lock image

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

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

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

            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

            Rectangle[] rects  = blobCounter.GetObjectsRectangles();
            Blob[]      blobs2 = blobCounter.GetObjects(bitmap, false);


            System.Drawing.Image compImg   = System.Drawing.Image.FromFile("lc.jpg");
            UnmanagedImage       compUMImg = UnmanagedImage.FromManagedImage((Bitmap)compImg);

            List <IntPoint> quad = new List <IntPoint>();

            try
            {
                //g.DrawRectangles(yellowPen, rects);
                foreach (Blob blob in blobs2)
                {
                    if (
                        ((double)blob.Area) / ((double)bitmap.Width * bitmap.Height) > 0.0001 &&
                        ((double)blob.Area) / ((double)bitmap.Width * bitmap.Height) < 0.005 &&
                        blob.Rectangle.X < (bitmap.Width) / 4)
                    {
                        if ((double)blob.Rectangle.Width / blob.Rectangle.Height < 1.4 &&
                            (double)blob.Rectangle.Width / blob.Rectangle.Height > .6)
                        {
                            compUMImg = UnmanagedImage.FromManagedImage(ImageUtilities.ResizeImage(compImg, blob.Rectangle.Width, blob.Rectangle.Height));
                            if (isSame(blob.Image, compUMImg))
                            {
                                g.DrawRectangle(yellowPen, blob.Rectangle);
                                quad.Add(new IntPoint((int)blob.CenterOfGravity.X, (int)blob.CenterOfGravity.Y));
                            }
                        }
                    }
                }
            }
            catch (ArgumentException) { MessageBox.Show("No Blobs"); }
            try
            {
                if (quad[0].Y > quad[1].Y)
                {
                    IntPoint tp = quad[0];
                    quad[0] = quad[1];
                    quad[1] = tp;
                }
            }
            catch
            {
            }
            compImg   = System.Drawing.Image.FromFile("rc.jpg");
            compUMImg = UnmanagedImage.FromManagedImage((Bitmap)compImg);
            try
            {
                //g.DrawRectangles(yellowPen, rects);
                foreach (Blob blob in blobs2)
                {
                    if (
                        ((double)blob.Area) / ((double)bitmap.Width * bitmap.Height) > 0.0001 &&
                        ((double)blob.Area) / ((double)bitmap.Width * bitmap.Height) < 0.004 &&
                        blob.Rectangle.X > (bitmap.Width * 3) / 4)
                    {
                        if ((double)blob.Rectangle.Width / blob.Rectangle.Height < 1.4 &&
                            (double)blob.Rectangle.Width / blob.Rectangle.Height > .6)
                        {
                            compUMImg = UnmanagedImage.FromManagedImage(ImageUtilities.ResizeImage(compImg, blob.Rectangle.Width, blob.Rectangle.Height));
                            if (isSame(blob.Image, compUMImg))
                            {
                                g.DrawRectangle(yellowPen, blob.Rectangle);
                                quad.Add(new IntPoint((int)blob.CenterOfGravity.X, (int)blob.CenterOfGravity.Y));
                            }
                        }
                    }
                }
            }
            catch (ArgumentException) { MessageBox.Show("No Blobs"); }
            try
            {
                if (quad[2].Y < quad[3].Y)
                {
                    IntPoint tp = quad[2];
                    quad[2] = quad[3];
                    quad[3] = tp;
                }
            }
            catch
            {
            }
            yellowPen.Dispose();
            redPen.Dispose();
            greenPen.Dispose();
            bluePen.Dispose();
            brownPen.Dispose();
            g.Dispose();

            //// put new image to clipboard
            //Clipboard.SetDataObject(bitmap);
            // and to picture box
            if (quad.Count == 4)
            {
                if (((double)quad[1].Y - (double)quad[0].Y) / ((double)quad[2].Y - (double)quad[3].Y) < .75 ||
                    ((double)quad[1].Y - (double)quad[0].Y) / ((double)quad[2].Y - (double)quad[3].Y) > 1.25)
                {
                    quad.Clear();
                }
                else if (quad[0].X > bitmap.Width / 2 || quad[1].X > bitmap.Width / 2 || quad[2].X < bitmap.Width / 2 || quad[3].X < bitmap.Width / 2)
                {
                    quad.Clear();
                }
            }
            if (quad.Count != 4)
            {
                if (contint <= 60)
                {
                    if (contint >= 0)
                    {
                        contint += 5;
                        contint *= -1;
                        return(ExtractOMRSheet(basicImage, fillint, contint, OMRSheets));
                    }
                    else
                    {
                        contint *= -1;
                        contint += 10;
                        return(ExtractOMRSheet(basicImage, fillint, contint, OMRSheets));
                    }
                }
                else
                {
                    MessageBox.Show("Extraction Failed.");
                    return(basicImage);
                }
            }
            else
            {
                IntPoint tp2 = quad[3];
                quad[3] = quad[1];
                quad[1] = tp2;
                QuadrilateralTransformation wrap = new QuadrilateralTransformation(quad);
                wrap.UseInterpolation = false;
                Rectangle sr = OMRSheetReader.GetSheetPropertyLocation(OMRSheets, OMREnums.OMRSheet.A550, OMREnums.OMRProperty.SheetSize);
                wrap.AutomaticSizeCalculaton = false;
                wrap.NewWidth  = sr.Width;
                wrap.NewHeight = sr.Height;
                wrap.Apply(basicImage).Save("LastImg.jpg", ImageFormat.Jpeg);
                System.Drawing.Image imgl = (System.Drawing.Image)wrap.Apply(basicImage);
                Graphics             gg   = Graphics.FromImage(imgl);
                Pen pr = new Pen(Brushes.Red, 2);

                //gg.DrawRectangle(pr, MyXML.OMRSheetReader.GetSheetProperty(OMRSheets, MyXML.OMREnums.OMRSheet.A550, MyXML.OMREnums.OMRProperty.tensBlock1));
                //gg.DrawRectangle(pr, MyXML.OMRSheetReader.GetSheetProperty(OMRSheets, MyXML.OMREnums.OMRSheet.A550, MyXML.OMREnums.OMRProperty.tensBlock2));
                //gg.DrawRectangle(pr, MyXML.OMRSheetReader.GetSheetProperty(OMRSheets, MyXML.OMREnums.OMRSheet.A550, MyXML.OMREnums.OMRProperty.tensBlock3));
                //gg.DrawRectangle(pr, MyXML.OMRSheetReader.GetSheetProperty(OMRSheets, MyXML.OMREnums.OMRSheet.A550, MyXML.OMREnums.OMRProperty.tensBlock4));

                pr.Dispose();
                gg.Dispose();
                return((Bitmap)imgl);
            }
        }