Dienstag, 2. Juni 2015

MVTEC - HALCON - Text ins Bild schreiben

Wer kennt es?
www.halcon.com

Gut die meisten benutzen vermutlich OpenCV:
http://opencv.org/

Es gibt einen Wikipediaeintrag, daher erspare ich mir Erklärungen:
Wikipedia - Halcon


Mir gefallen die Möglichkeiten es Testens und dem schnellen Nachsehen von Zwischenergebnissen und der Entwicklungsumgebung von Halcon, genannt "HDevelop".

Die schnelle Einarbeitung und die ausgereiften Funktionen, die wenig Grund zum Debugging liefern, können die hohen Anschaffungskosten mitunter leicht amortisieren. Besonders bei Prototypen oder kleineren Stückzahlen.
- Soll jetzt aber keine Verkaufsveranstalltung werden.

Ich wollte beim Arbeiten mit Halcon gerne berechnete Werte ins Bild schreiben, um Auswertungen beim Abspeichern der Bilder gleich sichtbar zu haben. Halcon bietet aber keine Möglichkeit Texte oder Zahlen DIREKT ins Bild zu malen. Über den Umweg der Polygon-Erzeugung und "Paint-Region"-Funktion habe ich nun zumindest die Möglichkeit Zahlen direkt ins Bild zu schreiben:


Der Code im C#-Style:

        /// <summary>
        /// Paint a number into a halcon image.
        /// </summary>
        /// <param name="img">the image</param>
        /// <param name="number">the number</param>
        /// <param name="row">row position to start painting</param>
        /// <param name="col">column position to start painting</param>
        /// <param name="grey">grey value of digits</param>
        /// <param name="pixDis">pixel distance between drawing points (=size of digits)</param>
        public void paintNumberIntoHImg(ref HObject img, int number, HTuple row, HTuple col, int grey, int pixDis = 10)
        {
            int[] digits = GetIntArray(number);
            int startRow = (int)row.D;
            int startCol = ((int) col.D);

            int i = 0;
            foreach (int digit in digits)
            {
                HObject Tmp;
                HObject Region = getHObjectFromDigit(digit, startRow, (int) (startCol + (pixDis*(i*1.5))), pixDis);
                HOperatorSet.PaintRegion(Region, img, out Tmp, grey, "margin");
                i++;
                Region.Dispose();
                img.Dispose();
                img = Tmp;
            }
        }


        private int[] GetIntArray(int num)
        {
            List<int> listOfInts = new List<int>();
            while(num > 0)
            {
                listOfInts.Add(num % 10);
                num = num / 10;
            }
            listOfInts.Reverse();
            return listOfInts.ToArray();
        }


        private HObject getHObjectFromDigit(int _digit, int startRow, int startCol, int pixDis)
        {
            int[] segments;

            switch (_digit)
            {
                case 0:
                    segments = new[] { 1, 2, 3, 4, 5, 6 };
                    break;
                case 1:
                    segments = new[] {2, 3};
                    break;
                case 2:
                    segments = new[] {1, 2, 17, 15, 14};
                    break;
                case 3:
                    segments = new[] {1, 2, 7, 17, 3, 4};
                    break;
                case 4:
                    segments = new[] {2,7,6,16,17,3};
                    break;
                case 5:
                    segments = new[] {1, 16, 17, 3, 4};
                    break;
                case 6:
                    segments = new[] {7,3,4,5,6};
                    break;
                case 7:
                    segments = new[] {1, 2, 3};
                    break;
                case 8:
                    // digit 8 need two regions!!
                    segments = new[] { 1, 2, 17, 6 };
                    HObject Region1 = gen7SegDisplayRegion(segments, startRow, startCol, pixDis);
                    segments = new[] { 7, 3, 4, 5};
                    HObject Region2 = gen7SegDisplayRegion(segments, startRow, startCol, pixDis);
                    HObject Result;
                    HOperatorSet.ConcatObj(Region1, Region2, out Result);
                    Region1.Dispose();
                    Region2.Dispose();
                    return Result;
                    break;
                case 9:
                    segments = new[] {1,2,7,6,1,2,3,4};
                    break;

                default:
                    segments = new[] {7};
                    break;
            }
            return gen7SegDisplayRegion(segments, startRow, startCol, pixDis);
        }

       

        private HObject gen7SegDisplayRegion(int[] _segments, int startRow, int startCol, int pixDis)
        {
            HTuple row = new HTuple();
            HTuple col = new HTuple();
            HObject Region;
            foreach (int segment in _segments)
            {
                generate7tuple(segment, ref row, ref col, startRow, startCol, pixDis);
            }
            HOperatorSet.GenRegionPolygon(out Region, row, col);
            return Region;
        }







       

        private void generate7tuple(int _segment, ref HTuple row, ref HTuple column, int startRow, int startColumn, int pixDis)
        {
            switch (_segment)
            {
                case 1:
                    column.Append(startColumn);row.Append(startRow);
                    column.Append(startColumn+pixDis);row.Append(startRow);
                    break;
                case 2:
                    column.Append(startColumn+pixDis); row.Append(startRow);
                    column.Append(startColumn+pixDis); row.Append(startRow+pixDis);
                    break;
                case 3:
                    column.Append(startColumn+pixDis); row.Append(startRow+pixDis);
                    column.Append(startColumn+pixDis); row.Append(startRow+(pixDis*2));
                    break;
                case 4:
                    column.Append(startColumn+pixDis); row.Append(startRow+(pixDis*2));
                    column.Append(startColumn); row.Append(startRow+(pixDis*2));
                    break;
                case 5:
                    column.Append(startColumn); row.Append(startRow+(pixDis*2));
                    column.Append(startColumn); row.Append(startRow+pixDis);
                    break;
                case 6:
                    column.Append(startColumn); row.Append(startRow+pixDis);
                    column.Append(startColumn); row.Append(startRow);
                    break;
                case 7:
                    column.Append(startColumn+pixDis); row.Append(startRow+pixDis);
                    column.Append(startColumn); row.Append(startRow+pixDis);
                    break;
                case 13:    // 3 backward
                    column.Append(startColumn); row.Append(startRow + pixDis);
                    column.Append(startColumn + pixDis); row.Append(startRow + pixDis);
                    break;
                case 14:    // 4 backward
                    column.Append(startColumn); row.Append(startRow + (pixDis * 2));
                    column.Append(startColumn + pixDis); row.Append(startRow + (pixDis * 2));
                    break;
                case 15:    // 5 backward
                    column.Append(startColumn); row.Append(startRow + pixDis);
                    column.Append(startColumn); row.Append(startRow + (pixDis * 2));
                    break;
                case 16:    // 6 backward
                    column.Append(startColumn); row.Append(startRow);
                    column.Append(startColumn); row.Append(startRow + pixDis);
                    break;
                case 17:    // 7 backward
                    column.Append(startColumn); row.Append(startRow+pixDis);
                    column.Append(startColumn+pixDis); row.Append(startRow+pixDis);
                    break;
            }
        }

Keine Kommentare:

Kommentar veröffentlichen