コード例 #1
0
        /// <summary>
        /// Manejo del evento que provocado por el controlador cuando comienza
        /// a tratar una nueva imagen.
        /// </summary>
        /// <param name="sender">El objeto que provoca el evento.</param>
        /// <param name="arg">El argumento del evento.</param>
        private void OnControllerBitmapProcessedByDatabase(object sender,
                                                           BitmapProcessedArgs arg)
        {
            Gtk.Application.Invoke(sender, arg,
                                   delegate(object resender, EventArgs a)
            {
                if (treeview.NodeSelection.SelectedNodes.Length > 0)
                {
                    // Si hay un simbolo seleccionado,
                    // nos traemos sus imagenes procesadas.
                    SegmentedNode node =
                        (SegmentedNode)(treeview.NodeSelection.SelectedNode);


                    ImageArea imageAreaProcessed = new ImageArea();
                    imageAreaProcessed.Image     =
                        node.MathTextBitmap.LastProcessedImage.CreatePixbuf();
                    imageAreaProcessed.ImageMode = ImageAreaMode.Zoom;


                    processedImageNB.AppendPage(imageAreaProcessed,
                                                new Label(String.Format("BD {0}",
                                                                        processedImageNB.NPages + 1)));

                    processedImageNB.Page = processedImageNB.NPages - 1;

                    // Solo mostramos los tabs si hay mas de una imagen procesada
                    processedImageNB.ShowTabs =
                        node.MathTextBitmap.ProcessedImages.Count > 1;
                }
            });
        }
コード例 #2
0
        private void OnTreeviewButtonPress(object sender,
                                           ButtonPressEventArgs args)
        {
            // Nos quedamos unicamente con los clicks derechos
            if (recognizementFinished &&
                args.Event.Button == 3)
            {
                TreePath path = new TreePath();
                // Obtenemos el treepath con las coordenadas del cursor.
                treeview.GetPathAtPos(System.Convert.ToInt16(args.Event.X),
                                      System.Convert.ToInt16(args.Event.Y),
                                      out path);

                if (path != null)
                {
                    // We try only if a node was found.
                    SegmentedNode node =
                        (SegmentedNode)(treeview.NodeStore.GetNode(path));

                    selectedNode = node;

                    segmentedNodeMenu.Popup();
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// Establece la imagen inicial para segmentar y reconocer sus
        /// caracteres.
        /// </summary>
        /// <param name="image">
        /// La imagen inicial.
        /// </param>
        private void SetInitialImage(string filename)
        {
            imageOriginal           = new Pixbuf(filename);
            imageAreaOriginal.Image = imageOriginal;
            store.Clear();

            // Generamos el MaxtTextBitmap inical, y lo añadimos como
            // un nodo al arbol.
            MathTextBitmap mtb  = new MathTextBitmap(imageOriginal);
            SegmentedNode  node =
                new SegmentedNode(System.IO.Path.GetFileNameWithoutExtension(filename),
                                  mtb,
                                  treeview);

            store.AddNode(node);

            rootNode = node;

            controller.StartNode = node;

            Log("¡Archivo de imagen «{0}» cargado correctamente!", filename);

            alignNextButtons.Sensitive = true;
            segmentBtn.Sensitive       = true;
            gotoTokenizerBtn.Sensitive = false;
            buttonsNB.Page             = 0;
        }
コード例 #4
0
        /// <summary>
        /// <c>SymbolLabelEditorDialog</c>'s constructor method.
        /// </summary>
        /// <param name="parent">
        /// The new dialog's parent window.
        /// </param>
        /// <param name="node">
        /// The node which label we want to edit.
        /// </param>
        public SymbolLabelEditorDialog(Window parent, SegmentedNode node)
        {
            XML gxml = new XML("mathtextrecognizer.glade",
                               "symbolLabelEditorDialog");

            gxml.Autoconnect(this);

            symbolLabelEditorDialog.TransientFor = parent;

            InitializeWidgets(node);


            symbolLabelEditorDialog.ShowAll();
        }
コード例 #5
0
        private void OnUnassistedProcessBtnClicked(object sender, EventArgs args)
        {
            // We try to free memory.
            GC.Collect();
            segmentationStore.Clear();


            MainRecognizerWindow.ProcessItemsSensitive = true;
            unassistedControlHBB.Sensitive             = false;
            unassistedTaskNameLabel.Text = "Segmentación y OCR";

            unassistedGlobalProgressBar.Fraction = 0;

            // We create the image to be recognized.

            Bitmap bitmap = handwritingArea.Bitmap;

            FloatBitmap floatBitmap =
                new FloatBitmap(bitmap.Width, bitmap.Height);

            for (int i = 0; i < bitmap.Width; i++)
            {
                for (int j = 0; j < bitmap.Height; j++)
                {
                    floatBitmap[i, j] = bitmap.GetPixel(i, j).GetBrightness();
                }
            }

            // The original image is set.
            originalImage = floatBitmap.CreatePixbuf();

            MathTextBitmap mtb = new MathTextBitmap(originalImage);

            SegmentedNode node = new SegmentedNode("Raíz",
                                                   mtb,
                                                   null);

            segmentationStore.AddNode(node);

            ocrController.StartNode      = node;
            ocrController.SearchDatabase = false;
            ocrController.Databases      =
                Config.RecognizerConfig.Instance.Databases;
            ocrController.Next(ControllerStepMode.UntilEnd);
        }
コード例 #6
0
        /// <summary>
        /// Retrieves the leaf nodes of a given node.
        /// </summary>
        /// <param name="node">
        /// The node to check;
        /// </param>
        /// <returns>
        /// A list with the leafs.
        /// </returns>
        private List <SegmentedNode> GetLeafs(SegmentedNode node)
        {
            List <SegmentedNode> leafs = new List <SegmentedNode>();

            if (node.ChildCount == 0)
            {
                leafs.Add(node);
            }
            else
            {
                for (int i = 0; i < node.ChildCount; i++)
                {
                    leafs.AddRange(GetLeafs((SegmentedNode)node[i]));
                }
            }

            return(leafs);
        }
コード例 #7
0
        /// <summary>
        /// Manejo del evento provocado cuando se hace click en un nodo de la
        /// vista de árbol.
        /// </summary>
        /// <param name="sender">El objeto que provoco el evento.</param>
        /// <param name="arg">Los argumentos del evento.</param>
        private void OnTreeviewSelectionChanged(object sender, EventArgs arg)
        {
            // Si hemos acabado el proceso y hemos seleccionado algo.
            if (treeview.Selection.CountSelectedRows() > 0)
            {
                SegmentedNode node =
                    (SegmentedNode)(treeview.NodeSelection.SelectedNode);

                imageAreaNode.Image = node.MathTextBitmap.Pixbuf;

                // Vaciamos el notebook
                while (processedImageNB.NPages > 0)
                {
                    processedImageNB.RemovePage(0);
                }

                if (recognizementFinished)
                {
                    // Añadimos las imagenes procesasdas al notebook

                    // Solo mostramos los tabs si hay mas de una imagen procesada
                    processedImageNB.ShowTabs =
                        node.MathTextBitmap.ProcessedImages.Count > 1;

                    // Si hemos terminado podemos hacer esto sin peligro.
                    foreach (Pixbuf p in node.MathTextBitmap.ProcessedPixbufs)
                    {
                        ImageArea imageAreaProcessed = new ImageArea();
                        imageAreaProcessed.Image     = p;
                        imageAreaProcessed.ImageMode = ImageAreaMode.Zoom;


                        processedImageNB.AppendPage(imageAreaProcessed,
                                                    new Label(String.Format("BD {0}",
                                                                            processedImageNB.NPages + 1)));
                    }
                }

                MarkImage(node.MathTextBitmap);
            }
        }
コード例 #8
0
        /// <summary>
        /// Initializes the dialogs' widgets.
        /// </summary>
        /// <param name="node">
        /// A <see cref="SegmentedNode"/>
        /// </param>
        private void InitializeWidgets(SegmentedNode node)
        {
            imageNameLabel.Text = String.Format(imageNameLabel.Text, node.Name);

            labelEditor = new SymbolLabelEditorWidget();
            if (node.Symbols.Count == 0)
            {
                labelEditor.Label = node.Label;
            }
            else
            {
                // If we have various posibilities, we add radio buttons.
                RadioButton group = new RadioButton("group");
                foreach (MathSymbol symbol in node.Symbols)
                {
                    RadioButton rb      = new RadioButton(group, symbol.Text);
                    Alignment   rbAlign = new Alignment(0, 0.5f, 0, 0);
                    rbAlign.Add(rb);
                    symbolEditorPlaceholder.Add(rbAlign);

                    rb.Clicked += new EventHandler(OnLabelOptionClicked);
                }

                Alignment rbOtherAlign = new Alignment(0, 0.5f, 0, 0);
                otherLabelRB          = new RadioButton(group, "Otra:");
                otherLabelRB.Clicked += new EventHandler(OnLabelOptionClicked);

                rbOtherAlign.Add(otherLabelRB);
                symbolEditorPlaceholder.Add(rbOtherAlign);
                labelEditor.Sensitive = false;
            }

            symbolEditorPlaceholder.Add(labelEditor);

            nodeImage           = new ImageArea();
            nodeImage.Image     = node.MathTextBitmap.Pixbuf;
            nodeImage.ImageMode = ImageAreaMode.Zoom;

            imagePlaceholder.Add(nodeImage);
        }
コード例 #9
0
        /// <summary>
        /// Handles the click on the "go to tokenizer" button.
        /// </summary>
        /// <param name="sender">
        /// A <see cref="System.Object"/>
        /// </param>
        /// <param name="arg">
        /// A <see cref="EventArgs"/>
        /// </param>
        private void OnGoToTokenizerBtnClicked(object sender, EventArgs arg)
        {
            // We have to check the leaf nodes for problems.

            SegmentedNode analizedNode = rootNode;
            List <string> errors       = CheckErrors();

            if (errors.Count == 0)
            {
                MainRecognizerWindow.CreateTokenizingWidget();
                NextStage();
            }
            else
            {
                string errorss = String.Join("\n", errors.ToArray());
                OkDialog.Show(this.MainRecognizerWindow.Window,
                              MessageType.Info,
                              "Para continuar a la siguente fase de procesado,"
                              + "debes solucionar los siguentes problemas:\n\n{0}",
                              errorss);
            }
        }
コード例 #10
0
        /// <summary>
        /// Sets the image to be processed.
        /// </summary>
        /// <param name="image">
        /// The initial image's path.
        /// </param>
        private void SetInitialImage(string filename)
        {
            segmentationStore.Clear();

            Gdk.Pixbuf imageOriginal = new Gdk.Pixbuf(filename);
            originalImageArea.Image = imageOriginal;


            // Generamos el MaxtTextBitmap inicial, y lo añadimos como
            // un nodo al arbol.
            MathTextBitmap mtb  = new MathTextBitmap(imageOriginal);
            SegmentedNode  node =
                new SegmentedNode(System.IO.Path.GetFileNameWithoutExtension(filename),
                                  mtb,
                                  null);

            segmentationStore.AddNode(node);

            ocrController.StartNode = node;

            Log("¡Archivo de imagen «{0}» cargado correctamente!", filename);

            unassistedProcessBtn.Sensitive = true;
        }
コード例 #11
0
        /// <summary>
        /// Con este metodo cramos un arbol de imagenes, de forma recursiva.
        /// Primero intentamos reconocer la imagen como un caracter, si no es
        /// posible, la intentamos segmentar. Si ninguno de estos procesos es
        /// posible, la imagen nopudo ser reconocida.
        /// </summary>
        /// <param name="node">
        /// El nodo donde esta la imagen sobre la que trabajaremos.
        /// </param>
        private void RecognizerTreeBuild(SegmentedNode node)
        {
            // Seleccionamos el nodo.

            NodeBeingProcessedInvoker(node);
            SuspendByNode();

            node.Select();

            while (node.ChildCount > 0)
            {
                node.RemoveChild((SegmentedNode)node[0]);
            }

            MathTextBitmap bitmap = node.MathTextBitmap;

            MessageLogSentInvoker("=======================================");
            MessageLogSentInvoker("Tratando la subimagen «{0}»",
                                  node.Name);

            // Lanzamos el reconocedor de caracteres para cada una de
            // las bases de datos.
            List <MathSymbol> associatedSymbols = new List <MathSymbol>();

            if (searchDatabase)
            {
                foreach (MathTextDatabase database in databases)
                {
                    MessageLogSentInvoker("---------- «{0}» ------------",
                                          database.ShortDescription);


                    bitmap.ProcessImage(database.Processes);
                    BitmapProcessedByDatabaseInvoker(bitmap);

                    // Añadimos los caracteres reconocidos por la base de datos
                    foreach (MathSymbol symbol in database.Recognize(bitmap))
                    {
                        if (!associatedSymbols.Contains(symbol))
                        {
                            // Solo añadimos si no esta ya el simbolo.
                            associatedSymbols.Add(symbol);
                        }
                    }
                }
            }


            // We associate all symbols to the node, so we can postargate
            // the decission step.
            node.Symbols = associatedSymbols;

            //Si no hemos reconocido nada, pues intentaremos segmentar el caracter.
            if (associatedSymbols.Count == 0)
            {
                if (searchDatabase)
                {
                    MessageLogSentInvoker("La imagen no pudo ser reconocida como un "
                                          + "simbolo por la base de datos, se tratará de "
                                          + "segmentar");
                }
                else
                {
                    MessageLogSentInvoker("Se procede directamente a segmentar la imagen");
                    this.SearchDatabase = true;
                }

                List <MathTextBitmap> children = CreateChildren(bitmap);

                if (children.Count > 1)
                {
                    MessageLogSentInvoker("La imagen se ha segmentado correctamente");

                    //Si solo conseguimos un hijo, es la propia imagen, asi que nada

                    List <SegmentedNode> nodes = new List <SegmentedNode>();

                    foreach (MathTextBitmap child in children)
                    {
                        SegmentedNode childNode = new SegmentedNode(child, node.View);
                        node.AddSegmentedChild(childNode);
                        nodes.Add(childNode);
                    }

                    foreach (SegmentedNode childNode in nodes)
                    {
                        RecognizerTreeBuild(childNode);
                    }
                }
                else
                {
                    MessageLogSentInvoker("La imagen no pudo ser segmentada, el "
                                          + "símbolo queda sin reconocer");
                }
            }
            else
            {
                // We prepare the string.
                string text = "";
                foreach (MathSymbol s in associatedSymbols)
                {
                    text += String.Format("«{0}», ", s.Text);
                }

                text = text.TrimEnd(',', ' ');
                MessageLogSentInvoker("Símbolo reconocido por la base de datos como {0}.",
                                      text);
            }
        }