public void GatherData()
        {
            // Initize Image Processors
            for (int i = 0; i < maxProcessors; i++)
            {
                Thread processor = new Thread(ImageProcessorWorker)
                {
                    IsBackground = true
                };
                processor.Start();
                ImageProcessors.Add(processor);
            }
            Logger.Debug("Added {ImageProcessors.Count} workers", ImageProcessors.Count);

            Scraper.RestartEngines();

            // Scan Main character Name
            string mainCharacterName = CharacterScraper.ScanMainCharacterName();

            Scraper.AssignTravelerName(mainCharacterName);

            if (Properties.Settings.Default.ScanWeapons)
            {
                Logger.Info("Scanning weapons...");
                // Get Weapons
                Navigation.InventoryScreen();
                Navigation.SelectWeaponInventory();
                try
                {
                    WeaponScraper.ScanWeapons();
                }
                catch (FormatException ex) { UserInterface.AddError(ex.Message); }
                catch (ThreadAbortException) { }
                catch (Exception ex)
                {
                    UserInterface.AddError(ex.Message + "\n" + ex.StackTrace);
                }
                Navigation.MainMenuScreen();
                Logger.Info("Done scanning weapons");
            }

            if (Properties.Settings.Default.ScanArtifacts)
            {
                Logger.Info("Scanning artifacts...");

                // Get Artifacts
                Navigation.InventoryScreen();
                Navigation.SelectArtifactInventory();
                try
                {
                    ArtifactScraper.ScanArtifacts();
                }
                catch (FormatException ex) { UserInterface.AddError(ex.Message); }
                catch (ThreadAbortException) { }
                catch (Exception ex)
                {
                    UserInterface.AddError(ex.Message + "\n" + ex.StackTrace);
                }
                Navigation.MainMenuScreen();
                Logger.Info("Done scanning artifacts");
            }

            workerQueue.Enqueue(new OCRImageCollection(null, "END", 0));

            if (Properties.Settings.Default.ScanCharacters)
            {
                Logger.Info("Scanning characters...");
                // Get characters
                Navigation.CharacterScreen();
                var c = new List <Character>();
                try
                {
                    CharacterScraper.ScanCharacters(ref c);
                }
                catch (ThreadAbortException) { }
                catch (Exception ex)
                {
                    UserInterface.AddError(ex.Message + "\n" + ex.StackTrace);
                }
                Characters = c;
                Navigation.MainMenuScreen();
                Logger.Info("Done scanning characters");
            }

            // Wait for Image Processors to finish
            AwaitProcessors();

            if (Properties.Settings.Default.ScanCharacters)
            {
                // Assign Artifacts to Characters
                if (Properties.Settings.Default.ScanArtifacts)
                {
                    AssignArtifacts();
                }
                if (Properties.Settings.Default.ScanWeapons)
                {
                    AssignWeapons();
                }
            }

            // Scan Character Development Items
            if (Properties.Settings.Default.ScanCharDevItems)
            {
                Logger.Info("Scanning character development materials...");
                // Get Materials
                Navigation.InventoryScreen();
                Navigation.SelectCharacterDevelopmentInventory();
                HashSet <Material> devItems = new HashSet <Material>();
                try
                {
                    MaterialScraper.Scan_Materials(InventorySection.CharacterDevelopmentItems, ref Materials);
                }
                catch (FormatException ex) { UserInterface.AddError(ex.Message); }
                catch (ThreadAbortException) { }
                catch (Exception ex)
                {
                    UserInterface.AddError(ex.Message + "\n" + ex.StackTrace);
                }
                Navigation.MainMenuScreen();
                Logger.Info("Done scanning character development materials");
            }

            // Scan Materials
            if (Properties.Settings.Default.ScanMaterials)
            {
                Logger.Info("Scanning materials...");
                // Get Materials
                Navigation.InventoryScreen();
                Navigation.SelectMaterialInventory();
                HashSet <Material> materials = new HashSet <Material>();
                try
                {
                    MaterialScraper.Scan_Materials(InventorySection.Materials, ref Materials);
                }
                catch (FormatException ex) { UserInterface.AddError(ex.Message); }
                catch (ThreadAbortException) { }
                catch (Exception ex)
                {
                    UserInterface.AddError(ex.Message + "\n" + ex.StackTrace);
                }
                Navigation.MainMenuScreen();
                Logger.Info("Done scanning materials");
            }

            Inventory.AddMaterials(ref Materials);
        }