Περισσότερο

Αποθηκεύστε την εικόνα μέσα στο πλαίσιο οριοθέτησης μέσω προγραμματισμού


Θέλω να αποθηκεύσω μια εικόνα από το QGIS, αλλά η λειτουργία αποθήκευσης εικόνας φαίνεται περιορισμένη.

Είναι δυνατόν να χρησιμοποιήσετε τη γραμμή εντολών python για να αποθηκεύσετε μια εικόνα σε συγκεκριμένη κλίμακα μεγέθυνσης και να ορίσετε ένα πλαίσιο οριοθέτησης πάνω από την περιοχή που θέλω να εκτυπώσω;

Για παράδειγμα, θέλω να αποθηκεύσω μια εικόνα στην κλίμακα 1: 1000 000 σε συγκεκριμένες συντεταγμένες ως πλαίσιο οριοθέτησης.


Μπορείτε να δοκιμάσετε την τελευταία έκδοση ανάπτυξης QGis; Το QGis 3 θα διαθέτει μια πολύ βελτιωμένη λειτουργία "αποθήκευση ως εικόνα", η έκδοση δεν έχει κυκλοφορήσει ακόμη επίσημα, αλλά οι νυχτερινές κατασκευές είναι διαθέσιμες και φαίνεται αρκετά σταθερές. Παρουσίαση της νέας δυνατότητας: http://imhere-asia.com/blog/post/more-qgis-30-improvements-saving-map-canvas-as-image-pdf

Διαφορετικά, μπορείτε επίσης να χρησιμοποιήσετε το Συνθέτη: προσθέστε έναν μόνο χάρτη που παίρνει όλο το χώρο και, στη συνέχεια, μπορείτε να ορίσετε την κλίμακα και τις συντεταγμένες στις ιδιότητες του χάρτη. Η τεκμηρίωση είναι διαθέσιμη εδώ: https://docs.qgis.org/2.18/en/docs/user_manual/print_composer/overview_composer.html

Είμαι βέβαιος ότι είναι επίσης δυνατό στο Python, αλλά φαίνεται υπερβολικό για το usecase σας.


Exkoria, ξέρω ότι χρησιμοποιείτε το QGIS, αλλά σκέφτηκα ότι θα δημοσιεύσω αυτόν τον κωδικό από το ArcMAP σε περίπτωση που μπορείτε να λάβετε κάποια βοήθεια από αυτό. Μετακινεί σε κάθε λειτουργία σε ένα shapefile και εξάγει μια εικόνα και, στη συνέχεια, επαναλαμβάνει για όλες τις λειτουργίες στο shapefile που καθορίζετε. Όπως είπα, δεν είναι QGIS, αλλά μπορεί να βοηθήσει κάπως.

# Αυτό το σενάριο μετακινεί το ArcMap, μία φορά για κάθε λειτουργία στο Layer (πέρασε στην τιμή) # # Σημειώστε το time.sleep (1), αυτό συμπεριλήφθηκε επειδή χρειάστηκε να διακόψω για να επιτρέψω στο # χρόνο ArcBruTile να κατεβάσει εικόνες. Ανάλογα με τα χιλιόμετρα σας, # αυτό πιθανότατα πρέπει να προσαρμοστεί. # # 4/19/2012 # # http://nodedangles.wordpress.com # # εισαγωγή sys, arcpy, datetime inLayer = sys.argv [1] def printit (inMessage): print inMessage arcpy.AddMessage (inMessage) mxd = arcpy.mapping.MapDocument ("CURRENT") arcpy.MakeFeatureLayer_management (inLayer, "indexLayer") cur = arcpy.SearchCursor ("indexLayer") df = arcpy.mapping.ListDataFrames (mxd) [0] newExtent = df.extent iCount = 0 iTotal = (arcpy.GetCount_management ("indexLayer"). GetOutput (0)) για σειρά σε cur: thisPoly = row.getValue ("Shape") newExtent.XMin, newExtent.YMin = thisPoly.extent.XMin, thisPoly.extent .YMin newExtent.XMax, newExtent.YMax = thisPoly.extent.XMax, thisPoly.extent.YMax df.extent = newExtent iCount + = 1 arcpy.mapping.ExportToJPEG (mxd, r "C:  scratch  Images  Map_% s. jpg ">Κοινή χρήσηΒελτιώστε αυτήν την απάντησηαπάντησε 28 Αυγούστου 14 στις 13:50ΜπαρέτΜπαρέτ2,99314 ασημένια εμβλήματα29 χάλκινα εμβλήματα 

Πώς να μάθετε εάν ένα αρχείο PDF δεν περιέχει δεδομένα που είναι ορατά στο πλαίσιο οριοθέτησης; [κλειστό]

Θέλετε να βελτιώσετε αυτήν την ερώτηση; Ενημερώστε την ερώτηση, ώστε να είναι στο θέμα για το TeX - LaTeX Stack Exchange.

Ενσωματώνω μια μικρή περιοχή μιας μεγάλης ιστοσελίδας σε ένα έγγραφο που συντάσσεται με pdflatex (χρησιμοποιώντας includeegraphics). Μια raster εικόνα / στιγμιότυπο οθόνης παράγει αντικείμενα κατά τη μεγέθυνση, επομένως αποθηκεύω τη σελίδα ως PDF με το παράθυρο διαλόγου εκτύπωσης του προγράμματος περιήγησης και περικόπτω την ενότητα που χρειάζομαι.

Αυτό το εργαλείο αλλάζει το πλαίσιο οριοθέτησης και παράγει το επιθυμητό οπτικός εμφάνιση. Αλλά το αρχείο διατηρεί όλο το περιεχόμενο του πρωτοτύπου.

Υπάρχουν προσωπικές πληροφορίες που περιλαμβάνονται έξω από το πλαίσιο οριοθέτησης. Θα ήθελα να βεβαιωθώ ότι δεν βρίσκεται στο περικομμένο pdf (ονόματα χρήστη, χρονικές σφραγίδες, αναγνωριστικά κ.λπ.). Με δεδομένη μια σειρά απλού κειμένου ascii στο αρχικό έγγραφο, π.χ. το όνομα χρήστη μου, πώς μπορώ να βρω αν υπάρχει στο PDF. Μπορώ να περιμένω ότι το κείμενο ascii από τη σελίδα θα περιέχεται κυριολεκτικά ή θα κωδικοποιηθεί σε κάποια διανυσματική μορφή;

Αναφέρω ότι το αρχείο προέρχεται από ένα πρόγραμμα περιήγησης, επειδή διαισθητικά, τα προγράμματα περιήγησης ενδέχεται να κωδικοποιούν τα εκτυπωμένα PDF τους με προβλέψιμο τρόπο, ίσως είναι εύκολο να κλιπ περιοχές εάν χαρτογραφείται απευθείας στο DOM.


1 Απάντηση 1

Πρώτα απ 'όλα, σημειώστε ότι μπορείτε πάντα να χρησιμοποιήσετε Σημείο 2Δ. Διπλό για την αναπαράσταση σημείων σε ένα επίπεδο.

Στη συνέχεια, θα χωρίσω το πρόγραμμά σας σε δύο μεθόδους: η πρώτη για κλάδεμα σημείων που δεν βρίσκονται μέσα σε ένα καθορισμένο πλαίσιο οριοθέτησης και η δεύτερη για την ανάγνωση των σημείων από την τυπική είσοδο και την τοποθέτησή τους στην πρώτη.

Όσον αφορά τις συμβάσεις κωδικοποίησης, θα έχω μια κενή γραμμή πριν από το αν δήλωση. Επίσης, πρέπει να περιβάλλετε την κατάσταση ενός αν δήλωση με ένα ενιαίος χώρος. Έτσι, αντί


13 Απαντήσεις 13

Θα μπορούσατε να δημιουργήσετε πίνακες γραφικών για κάθε αντικείμενο. Ή απλώς προσαρμόστε το artboard ώστε να χωράει μόνο στο αντικείμενο που θέλετε να εξαγάγετε και, στη συνέχεια, επιλέξτε την επιλογή "clip to artboard" κατά την αποθήκευση / εξαγωγή.

Θα μπορούσες να κρύψεις τα πάντα όχι θέλω πρώτα να κάνω εξαγωγή:

  • Επιλογή όλων
  • Shift - κάντε κλικ στην τέχνη που θέλετε να εξαγάγετε
  • Επιλέξτε Αντικείμενο & gt Απόκρυψη από το μενού
  • Εξαγωγή (αφήνοντας "κλιπ στο artbaord" Ηνωμένα Έθνηεπιλεγμένο) Θα πρέπει να βλέπετε μόνο την τέχνη που δεν είναι κρυμμένη.
  • Επιλέξτε Object & gt Show All από το μενού.
  • Επαναλαμβάνω

Μπορείτε επίσης να χρησιμοποιήσετε την κρυφή συντόμευση "απόκρυψη άλλου". Επιλέξτε το αντικείμενο που θέλετε να αποθηκεύσετε / εξαγάγετε και μετά πατήστε Command-Option-Shift-3 (Mac) ή Ctrl-Alt-Shift-3 (Win). Αυτό θα κρύψει όλα όσα δεν είναι επιλεγμένα. Αποθήκευση / εξαγωγή και, στη συνέχεια, πατήστε Command-Option-3 (Mac) ή Ctrl-Alt-3 (Win) να δείξω τα πάντα ξανά. Επιλέξτε νέα αντικείμενα και επαναλάβετε.

Ή συχνά βρίσκω πιο γρήγορα την αντιγραφή σε νέο αρχείο.

  • Επιλέξτε το έργο τέχνης που θέλετε να εξαγάγετε
  • Επεξεργασία & αντιγραφή
  • Αρχείο & gt Νέο
  • Επεξεργασία & gt Επικόλληση
  • Εξαγωγή (αφήνοντας "κλιπ στο artbaord" Ηνωμένα Έθνητετραγωνισμένος)
  • Αρχείο & gt Κλείσιμο (μην αποθηκεύσετε - απλώς πατήστε το πλήκτρο d)
  • Επαναλαμβάνω

Κάνετε αυτό αρκετά συχνά και γίνεται πολύ γρήγορες διαδικασίες.

Απλώς ταιριάζω με το artboard στα αντικείμενα που θέλω:

  1. Επιλέξτε τα επιθυμητά αντικείμενα.
  2. Αντικείμενο - & gt Artboards - & gt Fit to Selected Art
  3. ctrl + alt + shift + s για να ανοίξετε το διάλογο Αποθήκευση για Web.
  4. ctrl + z για αναίρεση εφαρμογής.

Αυτό απαιτεί τόσο το Illustrator όσο και το Photoshop, αλλά είναι το αγαπημένο μου:

  1. Κάντε κλικ για να επιλέξετε το αντικείμενο / αντικείμενα στο Illustrator
  2. Κάντε ένα "Αρχείο> Αντιγραφή", Ctrl + C ή applekey-C για αντιγραφή
  3. Στο Photoshop, κάντε "Αρχείο> Νέο", Ctrl + N ή applekey-N και διατηρήστε τις προεπιλεγμένες επιλογές που σας παρέχει (εξαίρεση: ίσως θέλετε να αλλάξετε το φόντο σε διαφανές)
  4. Στο Photoshop, κάντε ένα "Αρχείο> Επικόλληση", ctrl + v ή applekey-V.

Τώρα θα έχετε μόνο το αντικείμενο / αντικείμενα από μόνο του (έχει ήδη περικοπεί!) Και μπορείτε να αποθηκεύσετε, να εξαγάγετε ή να εξαγάγετε για Web από εκεί. Δεν είμαι σίγουρος αν αυτό λειτουργεί σε όλες τις πλατφόρμες, αλλά σίγουρα λειτουργεί στο macbook μου.

Στο Illustrator CC 2015.3 (20), η Adobe πρόσθεσε τελικά ένα εργαλείο εξαγωγής στοιχείων παρόμοιο με το Sketch.

Τώρα μπορείτε να επιλέξετε οποιοδήποτε αντικείμενο, κάντε δεξί κλικ και "Εξαγωγή επιλογής". Εάν θέλετε να εξαγάγετε πολλές διαφορετικές επιλογές, μπορείτε να κάνετε κλικ στο "Συλλογή για εξαγωγή".

Στο τρόπο που εμφανίζεται, μπορείτε:

  • Δώστε σε κάθε στοιχείο ένα όνομα.
  • Επιλέξτε μια μορφή για κάθε στοιχείο png, jpg, svg και pdf που υποστηρίζονται.
  • Για μορφές ράστερ μπορείτε να δημιουργήσετε πολλαπλές κλιμακωτές εξόδους, π.χ. 2x για οθόνες αμφιβληστροειδούς. Κάθε εξαγόμενη κλίμακα έχει ένα διαμορφώσιμο επίθημα.

Αυτές οι διαμορφώσεις αποθηκεύονται, οπότε όταν επεξεργάζεστε τα αντικείμενα αργότερα, μπορείτε να εξαγάγετε τα πάντα εύκολα.

Εδώ είναι ένα απίστευτα απλό τέχνασμα που έμαθα πρόσφατα.

Άνοιγμα του αρχείου AI με το Photoshop (δεξί κλικ, Άνοιγμα με το Adobe Photoshop…)

Στο πλαίσιο διαλόγου επιλέξτε το κουμπί Εικόνες και εμφανίζονται όλες οι εικόνες στο έγγραφό σας. Επιλέξτε τις εικόνες που θέλετε να ανοίξετε και κάθε μία θα ανοίξει σε ξεχωριστό έγγραφο με την ενσωματωμένη ανάλυση.

Εάν εξάγετε SVG εδώ είναι ένας εξαιρετικά εύκολος τρόπος:

  1. Αντιγράψτε το σχήμα που θέλετε να εξαγάγετε στο πρόχειρο.
  2. Ανοίξτε το τερματικό
  3. Πληκτρολογήστε pbpaste & gt someFileName.svg

Το SVG σας θα είναι έτοιμο να μεταβεί σε όποιον κατάλογο θέλετε.

Δεν είναι η ιδανική λύση, αλλά αν βάλετε τα επιλεγμένα αντικείμενα σε ένα επίπεδο (είτε μετακινήστε τα είτε αντιγράψτε τα σε ένα νέο επίπεδο προσωρινά), απενεργοποιήστε τα υπόλοιπα στρώματα και εξαγάγετε.

Δεν είστε σίγουροι σε ποια μορφή εξάγετε, αλλά μια λύση είναι να απενεργοποιήσετε την ορατότητα των αντικειμένων που δεν θέλετε να εξαγάγετε στον πίνακα "Επίπεδα" και μετά να εξαγάγετε.

Ο ευκολότερος τρόπος που ξέρω είναι να επιλέξετε τα αντικείμενα που θέλετε να εξαγάγετε και να επιλέξετε στη συνέχεια το Artboard Tool από τη γραμμή εργαλείων. Χρησιμοποιήστε αυτό το εργαλείο για να κάνετε κλικ στα επιλεγμένα αντικείμενα ένα προς ένα (ίσως χρειαστεί να κάνετε διπλό κλικ σε αντικείμενα μετά το πρώτο) και θα δημιουργηθεί ένας νέος πίνακας γραφικών για κάθε αντικείμενο.

Στη συνέχεια, πρέπει απλώς να πατήσετε Cmd + E (mac) ή Ctrl + E (pc) για εξαγωγή και, στη συνέχεια, απλά επιλέξτε τη μορφή που θέλετε και βεβαιωθείτε ότι είναι επιλεγμένο το πλαίσιο ελέγχου "Use Artboards". Κάθε μεμονωμένη εικόνα θα εξαχθεί ως παρουσία του ονόματος αρχείου που πληκτρολογείτε σύμφωνα με τον αριθμό του artboard (π.χ. όνομα αρχείου-01, όνομα αρχείου-02 κ.λπ.). Απλώς λάβετε υπόψη ότι αυτό θα εξάγει τα πάντα στην περιοχή του artboard σε όλα τα επίπεδα, οπότε αν χρειάζεστε διαφανή BG, θα χρειαστεί να αποκρύψετε τυχόν στρώματα BG ή άλλα επίπεδα που δεν θέλετε να συμπεριλάβετε στην εξαγωγή.

Καλύτερη λύση: καταγράψτε την ενέργεια στις ενέργειες του πίνακα (προσθέστε το κλειδί για αυτήν την ενέργεια - για παράδειγμα F2):

  • επιλέξτε κάτι στο artboard (αντικείμενο, δύο αντικείμενα κλπ),
  • πατήστε Ctrl + C (αντιγραφή),
  • πατήστε Ctrl + N (δημιουργία νέου εγγράφου),
  • επιλέξτε Εισαγωγή στοιχείου μενού. από το μενού πίνακα ενεργειών (δεξιά γωνία στον πίνακα ενεργειών)
  • επιλέξτε αρχείο - & gt αποθήκευση για web
  • σταματήστε την καταγραφή ενεργειών

Από τώρα όταν πατάτε το F2, αποθηκεύετε αυτόματα για επιλεγμένο αντικείμενο ιστού :)

Ευκολότερο που έχω βρει - κάντε την επιλογή σας, το αρχείο, την εξαγωγή και, στη συνέχεια, επιλέξτε το πλαίσιο «επιλογή» για εξαγωγή μόνο των επιλεγμένων στοιχείων.

Έτσι το κάνω με αυτόν τον τρόπο: Αντιστοιχίστε ένα hotkey Ctrl-Alt-Shift-4 σε Objects Fit to Selected Art και ένα Ctrl-Shift-E στο File Export Με αυτόν τον τρόπο:

  1. Επιλέξτε αντικείμενο
  2. Πατήστε Ctrl-Alt-Shift-3 (για απόκρυψη όλων των άλλων)
  3. Πατήστε Ctrl-Alt-Shift-4 (για προσαρμογή στον πίνακα γραφικών)
  4. Πατήστε Ctrl-Shift-E (για εξαγωγή)

PS: μην ξεχάσετε να επιλέξετε το "Use artboards" στο παράθυρο διαλόγου εξαγωγής! Και πατήστε Ctrl-Z δύο φορές για αναίρεση προσωρινών αλλαγών.

Ο γρηγορότερος τρόπος είναι να χρησιμοποιήσετε τις φοβερές δυνατότητες εξαγωγής του Sketch.

Τρόπος 1: -Επιλέξτε την ομάδα στο Illustrator-Επικόλληση στο Σκίτσο (επαναλάβετε με όλες τις ομάδες που θέλετε να εξαγάγετε) -Επιλέξτε τις ομάδες στο Σκίτσο και κάντε κλικ στην επιλογή «εξαγωγή» - Εξαγωγή στην ανάλυση που θέλετε.

Τρόπος 2: -Επιλέξτε την ομάδα στο Illustrator-Επικόλληση στο Σκίτσο (επαναλάβετε με όλες τις ομάδες που θέλετε να εξαγάγετε) -Επιλέξτε τις ομάδες από την καρτέλα επιπέδων-Σύρετε και αποθέστε την επιφάνεια εργασίας ή το φάκελο.


Mdhntd

Ποιες περιπτώσεις μπορούν να λυθούν σήμερα από τους σύγχρονους επιλυτές (καθαρό LP);

Είναι πιθανό το Curiosity να μετρήσει το δικό του μεθάνιο ή να μην κάνει τη φασματομετρία;

Ποια είναι πιο αποτελεσματικά στην κατάσβεση πυρκαγιών: αεροπλάνα ή ελικόπτερα;

Τι προκάλεσε τις αναλαμπές στα βίντεο του Τσερνομπίλ;

Πότε θα κάνω την πρώτη μου αποθήκευση από το ξόρκι στο Web;

Τι σημαίνει τα ακρωνύμια 4 γραμμάτων σε ρωμαϊκά ονόματα όπως ο Τίτος Φλάβιος T. f. Τ. Ν. Sabinus;

Θα μπορούσατε να πουλήσετε τον εαυτό σας στη δουλεία στις ΗΠΑ;

Ήταν ο Wolfgang Unzicker η τελευταία Ερασιτεχνική GM;

Παράκαμψη με λάθος cvv χρεωστικής κάρτας και λήψη OTP

Πρέπει να προειδοποιήσω το αφεντικό μου ότι μπορεί να πάρω άδεια

Όρος για έναν χαρακτήρα που υπάρχει μόνο για να μιλήσετε

Στο National Velvet γιατί δεν χρησιμοποίησαν ένα διπλό κόλπο για την Elizabeth Taylor;

Ποιος πληρώνει για αυξημένα μέτρα ασφαλείας στις πτήσεις προς τις ΗΠΑ;

Βρείτε το πλησιέστερο όνομα χρώματος HTML

Πρέπει να είμαι νομίμως κατάλληλος για να εγκαταστήσω έναν έξυπνο θερμοστάτη Hive;

Υπάρχουν πλεονεκτήματα γραπτώς με το χέρι πάνω στην πληκτρολόγηση μιας ιστορίας;

Έχει μια αναφορά θέση αποθήκευσης;

Υπνηλία κουρασμένη έναντι σωματικά κουρασμένη

Πώς να ταξιδέψετε μεταξύ δύο στατικών κόσμων στο λιγότερο χρονικό διάστημα; (διαστολή χρόνου)

Δημιουργία πλαισίου οριοθέτησης στο ArcGIS API για JavaScript;

Μετατροπή γεωγραφικών συντεταγμένων σε ζώνη UTM 29N με Javascript Προσθήκη γραφικών από διαφορετικές χωρικές αναφορές χρησιμοποιώντας το ArcGIS API για JavaScript; Δημιουργήστε ένα τυχαίο πλαίσιο οριοθέτησης 100x100 m σε οποιαδήποτε προβολή σε καθαρό Python; Κλιπ χωρικό αντικείμενο σε πλαίσιο οριοθέτησης σε γραμμές RReading lines στο πλαίσιο Bounding απέτυχε Πώς να προσδιορίσετε το πλαίσιο οριοθέτησης της τρέχουσας qgis «έκταση καμβά χάρτη» από την κονσόλα python Καλύτερο πλαίσιο αντιστοίχισης χρησιμοποιώντας τη συλλογή Πώς να περιορίσετε τη μετακίνηση στο QGIS σε ένα δεδομένο βαθμό Κλειδί BoundingBox στο Geo API του Redis

Προσπαθώ να δημιουργήσω ένα πλαίσιο οριοθέτησης για τον χάρτη μου στο ArcGIS 3.28. Θέλω το κουτί οριοθέτησης να παραμείνει σε μια δεδομένη περιοχή με βάση τις συντεταγμένες που δίνονται. Βρήκα μια κλάση που ονομάζεται Extent στην αναφορά API που μπορεί να ορίσει ένα πλαίσιο οριοθέτησης, αλλά δεν φαίνεται να υπάρχει τρόπος για να εφαρμόσετε το πλαίσιο σύνδεσης. Αυτό έχω αυτήν τη στιγμή: "

Χρησιμοποιώντας αυτό, υπάρχει τρόπος να δημιουργήσετε ένα πλαίσιο οριοθέτησης ή είναι κάτι που μπορώ να προσθέσω σε αυτό για να το κάνει να λειτουργεί;

Προσπαθώ να δημιουργήσω ένα πλαίσιο οριοθέτησης για τον χάρτη μου στο ArcGIS 3.28. Θέλω το κουτί οριοθέτησης να παραμείνει σε μια δεδομένη περιοχή με βάση τις συντεταγμένες που δίνονται. Βρήκα μια κλάση που ονομάζεται Extent στην αναφορά API που μπορεί να ορίσει ένα πλαίσιο οριοθέτησης, αλλά δεν φαίνεται να υπάρχει τρόπος για να εφαρμόσετε το πλαίσιο σύνδεσης. Αυτό έχω αυτήν τη στιγμή: "

Χρησιμοποιώντας αυτό, υπάρχει τρόπος να δημιουργήσετε ένα πλαίσιο οριοθέτησης ή είναι κάτι που μπορώ να προσθέσω σε αυτό για να το κάνει να λειτουργεί;

Προσπαθώ να δημιουργήσω ένα πλαίσιο οριοθέτησης για τον χάρτη μου στο ArcGIS 3.28. Θέλω το κουτί οριοθέτησης να παραμείνει σε μια δεδομένη περιοχή με βάση τις συντεταγμένες που δίνονται. Βρήκα μια κλάση που ονομάζεται Extent στην αναφορά API που μπορεί να ορίσει ένα πλαίσιο οριοθέτησης, αλλά δεν φαίνεται να υπάρχει τρόπος για να εφαρμόσετε το πλαίσιο σύνδεσης. Αυτό έχω αυτήν τη στιγμή: "

Χρησιμοποιώντας αυτό, υπάρχει τρόπος να δημιουργήσετε ένα πλαίσιο οριοθέτησης ή είναι κάτι που μπορώ να προσθέσω σε αυτό για να το κάνει να λειτουργεί;

Προσπαθώ να δημιουργήσω ένα πλαίσιο οριοθέτησης για τον χάρτη μου στο ArcGIS 3.28. Θέλω το κουτί οριοθέτησης να παραμείνει σε μια δεδομένη περιοχή με βάση τις συντεταγμένες που δίνονται. Βρήκα μια κλάση που ονομάζεται Extent στην αναφορά API που μπορεί να ορίσει ένα πλαίσιο οριοθέτησης, αλλά δεν φαίνεται να υπάρχει τρόπος για να εφαρμόσετε το πλαίσιο σύνδεσης. Αυτό έχω αυτήν τη στιγμή: "

Χρησιμοποιώντας αυτό, υπάρχει τρόπος να δημιουργήσετε ένα πλαίσιο οριοθέτησης ή είναι κάτι που μπορώ να προσθέσω σε αυτό για να το κάνει να λειτουργεί;


Εάν ενδιαφέρεστε περισσότερο για την απόδοση από τον καθαρό κώδικα χρησιμοποιήστε το. Περιορίζει τον αριθμό των κλήσεων για την επιβράδυνση των προσβατών ιδιοτήτων αντικειμένων COM. Αυτός είναι ο κύριος λόγος για τον οποίο αυτή η λύση είναι ταχύτερη από την παραπάνω απλή μέθοδο:

Επεξεργασία: Η αρχική προσέγγιση του IAmNerd2000 αποτυγχάνει όταν η μορφοποίηση βρίσκεται εκτός του "RealUsedRange". Έτσι καταργήθηκε από αυτήν την ανάρτηση.

Επεξεργασία: Όπως επεσήμανε το MacroMarc, πολύ μεγάλα εύρη που χρησιμοποιούνται θα προκαλέσουν διακοπή του βέλτιστου κώδικα λόγω σφάλματος εξάντλησης μνήμης. Ως τρέχουσα εργασία, καταφεύγω στον κώδικα του VBasic2008 εάν παρουσιαστεί το σφάλμα. Έτσι, χειρότερα θα είναι τόσο αργό όσο ο κώδικας του VBasic2008, αλλά στην καλύτερη περίπτωση θα είναι 10 φορές πιο γρήγορος.

Επεξεργασία: Το RealUsedRange_VBasic2008_refac δεν λειτούργησε σε ορισμένες περιπτώσεις. Η λύση έχει πλέον αλλάξει για να το αντικατοπτρίζει.

Επεξεργασία: Αλλαγές με βάση την ανάρτηση του Tinman. Οι κύριες αλλαγές ήταν η κατάργηση παραπομπών παραλλαγών, χρησιμοποιώντας το CountLarge αντί του .Rows.Count = 1 και .Columns.Count = 1 και Value2 αντί της τιμής


OpenCV OCR και αναγνώριση κειμένου με Tesseract

Για να πραγματοποιήσουμε την αναγνώριση κειμένου OpenCV OCR, θα πρέπει πρώτα να εγκαταστήσουμε το Tesseract v4 το οποίο περιλαμβάνει ένα εξαιρετικά ακριβές μοντέλο βασισμένο στη βαθιά μάθηση για την αναγνώριση κειμένου.

Από εκεί, θα σας δείξω πώς να γράψετε ένα σενάριο Python που:

  1. Εκτελεί κείμενο ανίχνευση χρησιμοποιώντας ανιχνευτή κειμένου OpenCV & # 8217s EAST, έναν εξαιρετικά ακριβή ανιχνευτή κειμένου βαθιάς μάθησης που χρησιμοποιείται για την ανίχνευση κειμένου σε εικόνες φυσικής σκηνής.
  2. Μόλις έχουμε εντοπίστηκε τις περιοχές κειμένου με OpenCV, τότε θα το κάνουμε εξαγάγετε καθένα από τα ROI κειμένου και να τα περάσετε στο Tesseract, μας επιτρέπει να χτίσουμε έναν ολόκληρο αγωγό OpenCV OCR!

Τέλος, θα ολοκληρώσω το σημερινό σεμινάριο δείχνοντάς σας μερικά δείγματα αποτελεσμάτων εφαρμογής αναγνώρισης κειμένου με το OpenCV, καθώς και συζητώντας μερικούς από τους περιορισμούς και τα μειονεκτήματα της μεθόδου.

Ας προχωρήσουμε και ξεκινήστε με το OpenCV OCR!

Πώς να εγκαταστήσετε το Tesseract 4

Φιγούρα 1: Ο κινητήρας Tesseract OCR λειτουργεί από τη δεκαετία του 1980. Από το 2018, περιλαμβάνει πλέον ενσωματωμένη ικανότητα βαθιάς μάθησης που το καθιστά ένα ισχυρό εργαλείο OCR (απλώς λάβετε υπόψη ότι κανένα σύστημα OCR δεν είναι τέλειο). Η χρήση του Tesseract με τον ανιχνευτή EAST OpenCV & # 8217s αποτελεί έναν εξαιρετικό συνδυασμό.

Το Tesseract, ένας πολύ δημοφιλής κινητήρας OCR, αναπτύχθηκε αρχικά από τη Hewlett Packard στη δεκαετία του 1980 και στη συνέχεια ήταν ανοιχτού κώδικα το 2005. Η Google υιοθέτησε το έργο το 2006 και έκτοτε το χορηγεί.

Αν έχετε διαβάσει την προηγούμενη ανάρτησή μου στις Χρήση Tesseract OCR με Python, γνωρίζετε ότι το Tesseract μπορεί να λειτουργήσει πολύ καλά υπό ελεγχόμενες συνθήκες & # 8230

& # 8230 αλλά θα έχει πολύ κακή απόδοση, εάν υπάρχει σημαντικός όγκος θορύβου ή εάν η εικόνα σας δεν έχει προεπεξεργαστεί και καθαριστεί σωστά πριν από την εφαρμογή Tesseract.

Ακριβώς όπως η βαθιά μάθηση έχει επηρεάσει σχεδόν κάθε πτυχή όρασης υπολογιστή, το ίδιο ισχύει για την αναγνώριση χαρακτήρων και την αναγνώριση χειρογράφου.

Τα μοντέλα βαθιάς μάθησης έχουν καταφέρει να αποκτήσουν πρωτοφανή ακρίβεια αναγνώρισης κειμένου, πολύ πέρα ​​από τις παραδοσιακές προσεγγίσεις εξαγωγής χαρακτηριστικών και μηχανικής μάθησης.

Ήταν μόνο θέμα χρόνου μέχρι το Tesseract να ενσωματώσει ένα μοντέλο βαθιάς μάθησης για να ενισχύσει περαιτέρω την ακρίβεια OCR & # 8212 και στην πραγματικότητα, έχει έρθει η ώρα.

Η τελευταία έκδοση του Tesseract (v4) υποστηρίζει OCR βασισμένο σε βαθιά μάθηση που είναι σημαντικά πιο ακριβής.

Στο υπόλοιπο αυτής της ενότητας, θα μάθετε πώς να εγκαταστήσετε το Tesseract v4 στο μηχάνημά σας.

Αργότερα σε αυτήν την ανάρτηση ιστολογίου, θα μάθετε πώς να συνδυάζετε τον αλγόριθμο εντοπισμού κειμένου EAST του OpenCV με το Tesseract v4 σε ένα ένα σενάριο Python για αυτόματη εκτέλεση του OpenCV OCR.

Ας ξεκινήσουμε να διαμορφώνουμε το μηχάνημά σας!

Εγκαταστήστε το OpenCV

Για να εκτελέσετε σήμερα το σενάριο και θα χρειαστείτε εγκατεστημένο το OpenCV. Απαιτείται έκδοση 3.4.2 ή καλύτερη.

Για να εγκαταστήσετε το OpenCV στο σύστημά σας, απλώς ακολουθήστε έναν από τους οδηγούς εγκατάστασης του OpenCV, διασφαλίζοντας ότι κατεβάζετε τη σωστή / επιθυμητή έκδοση του OpenCV και του OpenCV-contrib στη διαδικασία.

Εγκαταστήστε το Tesseract 4 στο Ubuntu

Οι ακριβείς εντολές που χρησιμοποιούνται για την εγκατάσταση του Tesseract 4 στο Ubuntu θα διαφέρουν ανάλογα με το αν χρησιμοποιείτε το Ubuntu 18.04 ή το Ubuntu 17.04 και παλαιότερα.

Για να ελέγξετε την έκδοση του Ubuntu μπορείτε να χρησιμοποιήσετε την εντολή lsb_release:

Όπως μπορείτε να δείτε, τρέχω το Ubuntu 18.04 αλλά πρέπει να ελέγξετε την έκδοση του Ubuntu πριν συνεχίσετε.

Για χρήστες του Ubuntu 18.04, το Tesseract 4 είναι μέρος του κύριου αποθετηρίου apt-get, καθιστώντας εξαιρετικά εύκολη την εγκατάσταση του Tesseract μέσω της ακόλουθης εντολής:

Εάν χρησιμοποιείτε το Ubuntu 14, 16 ή 17, θα χρειαστείτε μερικές επιπλέον εντολές λόγω των απαιτήσεων εξάρτησης.

Τα καλά νέα είναι ότι ο Alexander Pozdnyakov δημιούργησε ένα Ubuntu PPA (Personal Package Archive) για το Tesseract, γεγονός που καθιστά εξαιρετικά εύκολη την εγκατάσταση του Tesseract 4 σε παλαιότερες εκδόσεις του Ubuntu.

Απλώς προσθέστε το αποθετήριο PPA alex-p / tesseract-ocr στο σύστημά σας, ενημερώστε τους ορισμούς του πακέτου σας και, στη συνέχεια, εγκαταστήστε το Tesseract:

Υποθέτοντας ότι δεν υπάρχουν σφάλματα, θα πρέπει τώρα να έχετε εγκαταστήσει το Tesseract 4 στο μηχάνημά σας.

Εγκαταστήστε το Tesseract 4 σε macOS

Η εγκατάσταση του Tesseract στο macOS είναι απλή υπό την προϋπόθεση ότι έχετε εγκατεστημένο στο σύστημά σας το Homebrew, τον «ανεπίσημο» διαχειριστή πακέτων του macOS.

Απλώς εκτελέστε την ακόλουθη εντολή και το Tesseract v4 θα εγκατασταθεί στο Mac σας:

Ενημέρωση 2020-07-21: Το Tesseract 5 (έκδοση άλφα) είναι διαθέσιμο. Προς το παρόν, σας συνιστούμε να κολλήσετε με το Tesseract 4. Εάν θέλετε το τελευταίο Tesseract (από αυτήν τη γραφή είναι 5.0.0-άλφα), βεβαιωθείτε ότι έχετε προσαρτήσει το διακόπτη --HEAD στο τέλος της εντολής.

Εάν έχετε ήδη εγκαταστήσει το Tesseract στο Mac σας (αν ακολουθήσατε τον προηγούμενο οδηγό εγκατάστασης Tesseract, για παράδειγμα), θα πρέπει πρώτα να αποσυνδέσετε την αρχική εγκατάσταση:

Και από εκεί μπορείτε να εκτελέσετε την εντολή install.

Επαληθεύστε την έκδοση Tesseract

Σχήμα 2: Στιγμιότυπο οθόνης του τερματικού συστήματος όπου έχω εισαγάγει την εντολή tesseract -v για να ζητήσω την έκδοση. Έχω επαληθεύσει ότι έχω εγκαταστήσει το Tesseract 4.

Μόλις εγκαταστήσετε το Tesseract στο μηχάνημά σας, θα πρέπει να εκτελέσετε την ακόλουθη εντολή για να επαληθεύσετε την έκδοση Tesseract:

Εφόσον βλέπετε το tesseract 4 κάπου στην έξοδο, γνωρίζετε ότι έχετε εγκαταστήσει την τελευταία έκδοση του Tesseract στο σύστημά σας.

Εγκαταστήστε τις συνδέσεις Tesseract + Python

Τώρα που έχουμε εγκαταστήσει το δυαδικό Tesseract, πρέπει τώρα να εγκαταστήσουμε τις συνδέσεις Tesseract + Python, ώστε τα σενάρια Python να μπορούν να επικοινωνούν με το Tesseract και να εκτελούν OCR σε εικόνες που επεξεργάζονται από το OpenCV.

Εάν χρησιμοποιείτε εικονικό περιβάλλον Python (το οποίο προτείνω ιδιαίτερα για να έχετε ξεχωριστά, ανεξάρτητα περιβάλλοντα Python), χρησιμοποιήστε την εντολή workon για πρόσβαση στο εικονικό σας περιβάλλον:

Σε αυτήν την περίπτωση, έχω πρόσβαση σε ένα εικονικό περιβάλλον Python που ονομάζεται cv (συντομογραφία "computer vision") & # 8212 μπορείτε να αντικαταστήσετε το cv με ό, τι έχετε ονομάσει το εικονικό σας περιβάλλον.

Από εκεί, θα χρησιμοποιήσουμε το pip για να εγκαταστήσουμε το Pillow, μια πιο φιλική προς το Python έκδοση του PIL, ακολουθούμενη από pytesseract και imutils:

Τώρα ανοίξτε ένα κέλυφος Python και επιβεβαιώστε ότι μπορείτε να εισαγάγετε τόσο το OpenCV όσο και το pytesseract:

Εάν δεν βλέπετε σφάλματα εισαγωγής, το μηχάνημά σας έχει πλέον ρυθμιστεί ώστε να εκτελεί αναγνώριση OCR και κειμένου με OpenCV

Ας προχωρήσουμε στην επόμενη ενότητα (παραλείποντας τις οδηγίες του Pi) όπου θα μάθουμε πώς να εφαρμόζουμε πραγματικά ένα σενάριο Python για την εκτέλεση του OpenCV OCR.

Εγκαταστήστε το Tesseract 4 και το υποστηρικτικό λογισμικό σε Raspberry Pi και Raspbian

Σημείωση: Μπορείτε να παραλείψετε αυτήν την ενότητα εάν δεν είστε σε Raspberry Pi.

Αναπόφευκτα, θα ερωτηθώ πώς να εγκαταστήσω το Tesseract 4 στο Rasberry Pi.

Οι ακόλουθες οδηγίες δεν είναι & # 8217t για λιποθυμία της καρδιάς & # 8212 μπορεί να αντιμετωπίσετε προβλήματα. Έχουν δοκιμαστεί, αλλά τα χιλιόμετρα μπορεί να διαφέρουν ανάλογα με το Raspberry Pi σας.

Αρχικά, απεγκαταστήστε τις συνδέσεις OpenCV από πακέτα τοποθεσιών συστήματος:

Εδώ χρησιμοποίησα την εντολή rm, αφού το αρχείο cv2.so στα πακέτα ιστότοπων είναι απλώς ένας sym-link. Εάν οι δεσμεύσεις cv2.so είναι δικές σας πραγματικός Συνδέσεις OpenCV τότε ίσως θελήσετε να μετακινήσετε το αρχείο από πακέτα τοποθεσιών για ασφαλή φύλαξη.

Τώρα εγκαταστήστε δύο πακέτα QT στο σύστημά σας:

Για οποιονδήποτε λόγο, το εκπαιδευμένο αρχείο δεδομένων αγγλικής γλώσσας έλειπε από την εγκατάσταση, οπότε χρειάστηκε να το κατεβάσω και να το μετακινήσω στον κατάλληλο κατάλογο:

Από εκεί, δημιουργήστε ένα νέο εικονικό περιβάλλον Python:

Και εγκαταστήστε τα απαραίτητα πακέτα:

Τελειώσατε! Απλώς λάβετε υπόψη ότι η εμπειρία σας μπορεί να διαφέρει.

Κατανόηση της αναγνώρισης κειμένου OpenCV OCR και Tesseract

Τώρα που έχουμε εγκαταστήσει επιτυχώς το OpenCV και το Tesseract στο σύστημά μας, πρέπει να εξετάσουμε εν συντομία τον αγωγό μας και τις σχετικές εντολές.

Αρχικά, θα εφαρμόσουμε τον ανιχνευτή κειμένου EAST του OpenCV για να εντοπίσουμε την παρουσία κειμένου σε μια εικόνα. Ο ανιχνευτής κειμένου EAST θα μας δώσει το πλαίσιο οριοθέτησης (x, ε)-συντεταγμένες ROI κειμένου.

Θα εξαγάγουμε καθένα από αυτά τα ROI και θα τα μεταφέρουμε στον αλγόριθμο αναγνώρισης κειμένου βαθιάς μάθησης LSTM του Tesseract v4.

Η έξοδος του LSTM θα μας δώσει τα πραγματικά μας αποτελέσματα OCR.

Τέλος, θα σχεδιάσουμε τα αποτελέσματα του OpenCV OCR στην εικόνα εξόδου μας.

Αλλά προτού φτάσουμε πραγματικά στο έργο μας, ας αναθεωρήσουμε εν συντομία την εντολή Tesseract (η οποία θα κληθεί κάτω από την κουκούλα από τη βιβλιοθήκη pytesseract).

Κατά την κλήση του δυαδικού tessarct πρέπει να παρέχουμε έναν αριθμό σημαιών. Οι τρεις πιο σημαντικές είναι -l, --oem, και --psm.

Η σημαία -l ελέγχει τη γλώσσα του κειμένου εισαγωγής. Θα χρησιμοποιήσουμε eng (αγγλικά) για αυτό το παράδειγμα, αλλά μπορείτε να δείτε όλες τις γλώσσες που υποστηρίζει το Tesseract εδώ.

Το όρισμα --oem, ή OCR Engine Mode, ελέγχει τον τύπο του αλγορίθμου που χρησιμοποιείται από την Tesseract.

Μπορείτε να δείτε τις διαθέσιμες λειτουργίες μηχανών OCR εκτελώντας την ακόλουθη εντολή:

Θα χρησιμοποιούμε το --oem 1 για να δείξουμε ότι θέλουμε να χρησιμοποιήσουμε μόνο τον κινητήρα βαθιάς μάθησης LSTM.

Η τελευταία σημαντική σημαία, --psm ελέγχει την αυτόματη λειτουργία τμηματοποίησης σελίδας που χρησιμοποιείται από την Tesseract:

Για ROI κειμένου OCR, έχω διαπιστώσει ότι οι λειτουργίες 6 και 7 λειτουργούν καλά, αλλά αν χρησιμοποιείτε OCR με μεγάλα τμήματα κειμένου, τότε ίσως θέλετε να δοκιμάσετε το 3, την προεπιλεγμένη λειτουργία.

Όποτε βρίσκεστε εσείς λανθασμένα αποτελέσματα OCR, συνιστώ ανεπιφύλακτα να προσαρμόσετε το --psm καθώς μπορεί να έχει δραματικές επιρροές στα αποτελέσματα OCR εξόδου σας.

Δομή έργου

Φροντίστε να τραβήξετε το φερμουάρ από το & # 8220 Λήψεις & # 8221 ενότητα της ανάρτησης ιστολογίου.

Από εκεί αποσυμπιέστε το αρχείο και μεταβείτε στον κατάλογο. Η εντολή δενδρύλλου μας επιτρέπει να δούμε τη δομή καταλόγου στο τερματικό μας:

Το έργο μας περιέχει έναν κατάλογο και δύο αξιοσημείωτα αρχεία:

  • images /: Ένας κατάλογος που περιέχει έξι δοκιμαστικές εικόνες που περιέχουν κείμενο σκηνής. Θα επιχειρήσουμε το OpenCV OCR με καθεμία από αυτές τις εικόνες.
  • frozen_east_text_detection.pb: Ο ανιχνευτής κειμένου EAST. Αυτό το CNN είναι προ-εκπαιδευμένο για ανίχνευση κειμένου και έτοιμο να ξεκινήσει. Δεν εκπαιδεύτηκα αυτό το μοντέλο & # 8212 παρέχεται με το OpenCV I & # 8217 και το συμπεριέλαβε επίσης στο & # 8220 Λήψεις & # 8221 για την ευκολία σας.
  • text_recognition.py: Το σενάριό μας για το OCR & # 8212 θα εξετάσουμε αυτό το σενάριο κάθε γραμμή. Το σενάριο χρησιμοποιεί τον ανιχνευτή κειμένου EAST για να βρει περιοχές κειμένου στην εικόνα και στη συνέχεια εκμεταλλεύεται το Tesseract v4 για αναγνώριση.

Υλοποίηση του αλγορίθμου OpenCV OCR

Είμαστε πλέον έτοιμοι να πραγματοποιήσουμε αναγνώριση κειμένου με το OpenCV!

Ανοίξτε το αρχείο text_recognition.py και εισαγάγετε τον ακόλουθο κώδικα:

Σήμερα το σενάριο OCR απαιτεί πέντε εισαγωγές, μία εκ των οποίων είναι ενσωματωμένη στο OpenCV.

Ειδικότερα, θα χρησιμοποιούμε pytesseract και OpenCV. Το πακέτο imutils μου θα χρησιμοποιηθεί για καταστολή χωρίς μέγιστο, καθώς η λειτουργία NMSBoxes OpenCV & # 8217 δεν φαίνεται να λειτουργεί με το API Python. Θα σημειώσω επίσης ότι το NumPy είναι μια εξάρτηση για το OpenCV.

Το πακέτο argparse περιλαμβάνεται με Python και χειρίζεται ορίσματα γραμμής εντολών & # 8212 δεν υπάρχει τίποτα για εγκατάσταση.

Τώρα που έχουν ληφθεί υπόψη οι εισαγωγές μας, ας εφαρμόσουμε τη συνάρτηση decode_predictions:

Η συνάρτηση decode_predictions ξεκινά στις Γραμμή 8 και εξηγείται λεπτομερώς μέσα στην ανάρτηση ανίχνευσης κειμένου EAST. Η λειτουργία:

  1. Χρησιμοποιεί έναν ανιχνευτή κειμένου με βάση τη μάθηση ανιχνεύουν (δεν αναγνωρίζονται) περιοχές κειμένου σε μια εικόνα.
  2. Ο ανιχνευτής κειμένου παράγει δύο πίνακες, μία που περιέχει το πιθανότητα μιας δεδομένης περιοχής που περιέχει κείμενο και μια άλλη που αντιστοιχίζει τη βαθμολογία σε ένα θέση κουτιού οριοθέτησης στην εικόνα εισαγωγής.

Όπως θα δούμε στον αγωγό OpenCV OCR, το μοντέλο ανιχνευτή κειμένου EAST θα παράγει δύο μεταβλητές:

  • βαθμολογίες: Πιθανότητες για περιοχές θετικών κειμένων.
  • γεωμετρία: Τα οριακά πλαίσια των περιοχών κειμένου.

& # 8230καμία από τις οποίες είναι μια παράμετρος στη συνάρτηση decode_predictions.

Η συνάρτηση επεξεργάζεται αυτά τα δεδομένα εισόδου, με αποτέλεσμα μια πλειάδα που περιέχει (1) τις θέσεις του πλαισίου οριοθέτησης του κειμένου και (2) την αντίστοιχη πιθανότητα της περιοχής που περιέχει κείμενο:

  • ορθές: Αυτή η τιμή βασίζεται στη γεωμετρία και είναι σε πιο συμπαγή μορφή, ώστε να μπορούμε να εφαρμόσουμε αργότερα NMS.
  • εμπιστοσύνη: Οι τιμές εμπιστοσύνης σε αυτήν τη λίστα αντιστοιχούν σε κάθε ορθογώνιο σε ορθογώνια.

Και οι δύο αυτές τιμές επιστρέφονται από τη συνάρτηση.

Σημείωση: Στην ιδανική περίπτωση, ένα περιστρεφόμενο πλαίσιο οριοθέτησης θα συμπεριλαμβανόταν σε ορθογώνια, αλλά δεν είναι ακριβώς απλό να εξαγάγετε ένα περιστρεφόμενο πλαίσιο οριοθέτησης για τη σημερινή απόδειξη της ιδέας. Αντ 'αυτού, υπολόγισα το οριζόντιο ορθογώνιο οριοθέτησης που λαμβάνει υπόψη τη γωνία. Η γωνία διατίθεται στις Γραμμή 41 αν θέλετε να εξαγάγετε ένα περιστρεφόμενο πλαίσιο οριοθέτησης μιας λέξης για να περάσετε στο Tesseract.

Για περισσότερες λεπτομέρειες σχετικά με το μπλοκ κώδικα παραπάνω, ανατρέξτε σε αυτήν την ανάρτηση ιστολογίου.

Από εκεί, ας αναλύσουμε τα επιχειρήματα της γραμμής εντολών:

Το σενάριό μας απαιτεί δύο ορίσματα γραμμής εντολών:

  • - εικόνα: Η διαδρομή προς την εικόνα εισαγωγής.
  • --east: Η διαδρομή προς τον προ-εκπαιδευμένο ανιχνευτή κειμένου EAST.

Προαιρετικά, ενδέχεται να παρέχονται τα ακόλουθα ορίσματα γραμμής εντολών:

  • - ελάχιστη εμπιστοσύνη: Η ελάχιστη πιθανότητα μιας εντοπισμένης περιοχής κειμένου.
  • --width: Το πλάτος της εικόνας μας θα αλλάξει το μέγεθός του προτού περάσει από τον ανιχνευτή κειμένου EAST. Ο ανιχνευτής μας απαιτεί πολλαπλάσια 32.
  • - Ύψος: Το ίδιο με το πλάτος, αλλά για το ύψος. Και πάλι, ο ανιχνευτής μας απαιτεί πολλαπλάσια 32 για το μέγεθος του μεγέθους.
  • - padding: Το (προαιρετικό) ποσό γεμίσματος για προσθήκη σε κάθε περίγραμμα ROI. Μπορείτε να δοκιμάσετε τιμές 0,05 για 5% ή 0,10 για 10% (και ούτω καθεξής) εάν διαπιστώσετε ότι το αποτέλεσμα OCR σας είναι λανθασμένο.

Από εκεί, θα φορτώσουμε + προεπεξεργασία της εικόνας μας και θα ξεκινήσουμε τις βασικές μεταβλητές:

Η εικόνα μας φορτώνεται στη μνήμη και αντιγράφεται (έτσι μπορούμε αργότερα να αντλήσουμε τα αποτελέσματα εξόδου μας) Γραμμές 82 και 83.

Αρπάζουμε το πρωτότυπο πλάτος και ύψος (Γραμμή 84και μετά εξαγάγετε το νέος πλάτος και ύψος από το λεξικό args (Γραμμή 88).

Χρησιμοποιώντας τόσο τις αρχικές όσο και τις νέες διαστάσεις, υπολογίζουμε τις αναλογίες που χρησιμοποιούνται για να κλιμακώσουμε τις συντεταγμένες του ορίου οριοθέτησης αργότερα στο σενάριο (Γραμμές 89 και 90).

Το μέγεθός μας αλλάζει μέγεθος, αγνοώντας την αναλογία διαστάσεων (Γραμμή 93).

Στη συνέχεια, ας συνεργαστούμε με τον ανιχνευτή κειμένου EAST:

Τα δύο ονόματα επιπέδων εξόδου τοποθετούνται σε μορφή λίστας Γραμμές 99-101. Για να μάθετε γιατί αυτά τα δύο ονόματα εξόδου είναι σημαντικά, θα θέλατε να ανατρέξετε στον αρχικό μου οδηγό εντοπισμού κειμένου EAST.

Στη συνέχεια, το προ-εκπαιδευμένο νευρωνικό δίκτυο EAST φορτώνεται στη μνήμη (Γραμμή 105).

Δεν μπορώ να το τονίσω αυτό αρκετά: χρειάζεστε τουλάχιστον το OpenCV 3.4.2 για να έχετε την εφαρμογή cv2.dnn.readNet.

Το πρώτο κομμάτι του & # 8220magic & # 8221 εμφανίζεται στη συνέχεια:

Για να προσδιορίσουμε τις τοποθεσίες κειμένου:

  • Δημιουργήστε μια σταγόνα Γραμμές 109 και 110. Διαβάστε περισσότερα για τη διαδικασία εδώ.
  • Περάστε το blob μέσω του νευρικού δικτύου, λαμβάνοντας βαθμολογίες και γεωμετρία (Γραμμές 111 και 112).
  • Αποκωδικοποιήστε τις προβλέψεις με τη συνάρτηση decode_predictions που ορίστηκε προηγουμένως (Γραμμή 116).
  • Εφαρμόστε μη μέγιστη καταστολή μέσω της μεθόδου imutils (Γραμμή 117). Το NMS παίρνει αποτελεσματικά τις πιο πιθανές περιοχές κειμένου, εξαλείφοντας άλλες επικαλυπτόμενες περιοχές.

Τώρα που γνωρίζουμε πού βρίσκονται οι περιοχές κειμένου είναι, πρέπει να κάνουμε βήματα προς αναγνωρίζω το κείμενο! Αρχίζουμε να βρούμε τα οριακά κουτιά και να επεξεργαστούμε τα αποτελέσματα, προετοιμάζοντας το στάδιο για πραγματικά αναγνώριση κειμένου:

Αρχικοποιούμε τη λίστα αποτελεσμάτων για να περιέχει τα πλαίσια οριοθέτησης OCR και το κείμενο Γραμμή 120.

Στη συνέχεια αρχίζουμε να βάζουμε βρόχο πάνω στα κουτιά (Γραμμή 123) οπου εμεις:

  • Κλιμάκωση των πλαισίων οριοθέτησης με βάση τις προηγούμενες υπολογισμένες αναλογίες (Γραμμές 126-129).
  • Πατήστε τα κουτιά οριοθέτησης (Γραμμές 134-141).
  • Και τέλος, εξαγάγετε το επένδυση roi (Γραμμή 144).

Ο αγωγός OpenCV OCR μας μπορεί να ολοκληρωθεί χρησιμοποιώντας ένα κομμάτι του Tesseract v4 & # 8220magic & # 8221:

Λαμβάνοντας υπόψη το σχόλιο στο μπλοκ κώδικα, ενεργοποιούμε τις παραμέτρους Tesseract config Γραμμή 151 (Αγγλικά Γλώσσα, LS ™ νευρωνικό δίκτυο, και μονή λινόe του κειμένου).

Σημείωση: Ίσως χρειαστεί να διαμορφώσετε την τιμή --psm χρησιμοποιώντας τις οδηγίες μου στο πάνω μέρος αυτού του σεμιναρίου εάν διαπιστώσετε ότι λαμβάνετε λανθασμένα αποτελέσματα OCR.

Η βιβλιοθήκη pytesseract αναλαμβάνει τα υπόλοιπα Γραμμή 152 όπου καλούμε pytesseract.image_to_string, περνώντας τη συμβολοσειρά roi και config.

; Κεραία! Σε δύο γραμμές κώδικα, χρησιμοποιήσατε το Tesseract v4 για να αναγνωρίσετε ένα ROI κειμένου σε μια εικόνα. Απλώς θυμηθείτε, υπάρχει πολλά συμβαίνουν κάτω από την κουκούλα.

Το αποτέλεσμα μας (οι τιμές του πλαισίου οριοθέτησης και η πραγματική συμβολοσειρά κειμένου) προσαρτώνται στη λίστα αποτελεσμάτων (Γραμμή 156).

Στη συνέχεια, συνεχίζουμε αυτήν τη διαδικασία για άλλους ROI στην κορυφή του βρόχου.

Τώρα ας εμφανίσουμε / εκτυπώσουμε τα αποτελέσματα για να δούμε αν πραγματικά λειτουργούσε:

Τα αποτελέσματά μας ταξινομούνται από πάνω προς τα κάτω Γραμμή 159 βασισμένο στο ε-συντεταγμένη του πλαισίου οριοθέτησης (αν και ίσως θέλετε να τα ταξινομήσετε διαφορετικά).

Από εκεί, ανατρέχοντας στα αποτελέσματα, εμείς:

  • Εκτυπώστε το κείμενο OCR στο τερματικό (Γραμμές 164-166).
  • Αφαιρέστε χαρακτήρες εκτός ASCII από κείμενο, καθώς το OpenCV δεν υποστηρίζει χαρακτήρες εκτός ASCII στη συνάρτηση cv2.putText (Γραμμή 171).
  • Σχεδιάστε (1) ένα πλαίσιο οριοθέτησης που περιβάλλει το ROI και (2) το κείμενο του αποτελέσματος πάνω από το ROI (Γραμμές 173-176).
  • Εμφανίστε την έξοδο και περιμένετε να πατηθεί οποιοδήποτε πλήκτρο (Γραμμές 179 και 180).

Αποτελέσματα αναγνώρισης κειμένου OpenCV

Τώρα που έχουμε εφαρμόσει τον αγωγό OpenCV OCR, ας το δούμε σε δράση.

Φροντίστε να χρησιμοποιήσετε το "Λήψεις" ενότητα αυτής της ανάρτησης ιστολογίου για λήψη του πηγαίου κώδικα, του μοντέλου ανιχνευτή κειμένου OpenCV EAST και των παραδειγμάτων εικόνων.

Από εκεί, ανοίξτε μια γραμμή εντολών, μεταβείτε στο σημείο που κατεβάσατε + εξήγαγε το φερμουάρ και εκτελέστε την ακόλουθη εντολή:

Σχήμα 4: Η πρώτη μας δοκιμή του OpenCV OCR είναι επιτυχής.

We’re starting with a simple example.

Notice how our OpenCV OCR system was able to correctly (1) detect the text in the image and then (2) recognize the text as well.

The next example is more representative of text we would see in a real- world image:

Figure 5: A more complicated picture of a sign with white background is OCR’d with OpenCV and Tesseract 4.

Again, notice how our OpenCV OCR pipeline was able to correctly localize and recognize the text however, in our terminal output we see a registered trademark Unicode symbol — Tesseract was likely confused here as the bounding box reported by OpenCV’s EAST text detector bled into the grassy shrubs/plants behind the sign.

Let’s look at another OpenCV OCR and text recognition example:

Figure 6: A large sign containing three words is properly OCR’d using OpenCV, Python, and Tesseract.

In this case, there are three separate text regions.

OpenCV’s text detector is able to localize each of them — we then apply OCR to correctly recognize each text region as well.

Our next example shows the importance of adding padding in certain circumstances:

Figure 7: Our OpenCV OCR pipeline has trouble with the text regions identified by OpenCV’s EAST detector in this scene of a bake shop. Keep in mind that no OCR system is perfect in all cases. Can we do better by changing some parameters, though?

In the first attempt of OCR’ing this bake shop storefront, we see that “SHOP” is correctly OCR’d, but:

  1. The “U” in “CAPUTO” is incorrectly recognized as “TI”.
  2. The apostrophe and “S” is missing from “CAPUTO’S’.
  3. And finally, “BAKE” is incorrectly recognized as a vertical bar/pipe (“|”) with a period (“.”).

By adding a bit of padding we can expand the bounding box coordinates of the ROI and correctly recognize the text:

Figure 8: By adding additional padding around the text regions identified by EAST text detector, we are able to properly OCR the three words in this bake shop sign with OpenCV and Tesseract. See the previous figure for the first, failed attempt.

Just by adding 5% of padding surrounding each corner of the bounding box we’re not only able to correctly OCR the “BAKE” text but we’re also able to recognize the “U” and “’S” in “CAPUTO’S”.

Of course, there are examples where OpenCV flat out fails:

Figure 9: With a padding of 25%, we are able to recognize “Designer” in this sign, but our OpenCV OCR system fails for the smaller words due to the color being similar to the background. We aren’t even able to detect the word “SUIT” and while “FACTORY” is detected, we are unable to recognize the text with Tesseract. Our OCR system is far from perfect.

I increased the padding to 25% to accommodate the angle/perspective of the words in this sign. This allowed for “Designer” to be properly OCR’d with EAST and Tesseract v4. But the smaller words are a lost cause likely due to the similar color of the letters to the background.

In these situations there’s not much we can do, but I would suggest referring to the limitations and drawbacks section below for suggestions on how to improve your OpenCV text recognition pipeline when confronted with incorrect OCR results.

Limitations and Drawbacks

It’s important to understand that no OCR system is perfect!

There is no such thing as a perfect OCR engine, especially in real-world conditions.

And furthermore, expecting 100% accurate Optical Character Recognition is simply unrealistic.

As we found out, our OpenCV OCR system worked in well in some images, it failed in others.

There are two primary reasons we will see our text recognition pipeline fail:

  1. The text is skewed/rotated.
  2. The font of the text itself is not similar to what the Tesseract model was trained on.

Even though Tesseract v4 is significantly more powerful and accurate than Tesseract v3, the deep learning model is still limited by the data it was trained on — if your text contains embellished fonts or fonts that Tesseract was not trained on, it’s unlikely that Tesseract will be able to OCR the text.

Secondly, keep in mind that Tesseract still assumes that your input image/ROI has been relatively cleaned.

Since we are performing text detection in natural scene images, this assumption does not always hold.

In general, you will find that our OpenCV OCR pipeline works best on text that is (1) captured at a 90-degree angle (i.e., top-down, birds-eye-view) of the image and (2) relatively easy to segment from the background.

If this is not the case, you may be able to apply a perspective transform to correct the view, but keep in mind that the Python + EAST text detector reviewed today does not provide rotated bounding boxes (as discussed in my previous post), so you will still likely be a bit limited.

Tesseract will always work best with clean, preprocessed images, so keep that in mind whenever you are building an OpenCV OCR pipeline.

If you have a need for higher accuracy and your system will have an internet connection, I suggest you try one of the “big 3” computer vision API services:

…each of which uses even more advanced OCR approaches running on powerful machines in the cloud.

What's next? I recommend PyImageSearch University.

I strongly believe that if you had the right teacher you could master computer vision and deep learning.

Do you think learning computer vision and deep learning has to be time-consuming, overwhelming, and complicated? Or has to involve complex mathematics and equations? Or requires a degree in computer science?

All you need to master computer vision and deep learning is for someone to explain things to you in simple, intuitive όροι. And that’s exactly what I do. My mission is to change education and how complex Artificial Intelligence topics are taught.

If you're serious about learning computer vision, your next stop should be PyImageSearch University, the most comprehensive computer vision, deep learning, and OpenCV course online today. Here you’ll learn how to successfully και confidently apply computer vision to your work, research, and projects. Join me in computer vision mastery.

Inside PyImageSearch University you'll find:

  • &check 23 courses on essential computer vision, deep learning, and OpenCV topics
  • &check 23 Certificates of Completion
  • &check 35h 14m on-demand video
  • &check Brand new courses released every month, ensuring you can keep up with state-of-the-art techniques
  • &check Pre-configured Jupyter Notebooks in Google Colab
  • &check Run all code examples in your web browser — works on Windows, macOS, and Linux (no dev environment configuration required!)
  • &check Access to centralized code repos for όλα 400+ tutorials on PyImageSearch
  • &check Easy one-click downloads for code, datasets, pre-trained models, etc.
  • &check Access on mobile, laptop, desktop, etc.

Save image within bounding box programmatically - Geographic Information Systems

Given a polygon and a point ‘p’, find if ‘p’ lies inside the polygon or not. The points lying on the border are considered inside.

We strongly recommend to see the following post first.
How to check if two given line segments intersect?
Following is a simple idea to check whether a point is inside or outside.

How to handle point ‘g’ in the above figure?
Note that we should return true if the point lies on the line or same as one of the vertices of the given polygon. To handle this, after checking if the line from ‘p’ to extreme intersects, we check whether ‘p’ is colinear with vertices of current line of polygon. If it is coliear, then we check if the point ‘p’ lies on current side of polygon, if it lies, we return true, else false.


Parameters

The location or workspace in which the random points feature class will be created. This location or workspace must already exist.

The name of the random points feature class to be created.

Random points will be generated inside or along the features in this feature class. The constraining feature class can be point, multipoint, line, or polygon. Points will be randomly placed inside polygon features, along line features, or at point feature locations. Each feature in this feature class will have the specified number of points generated inside it (for example, if you specify 100 points, and the constraining feature class has 5 features, 100 random points will be generated in each feature, totaling 500 points).

Random points will be generated inside the extent. The constraining extent will only be used if no constraining feature class is specified.

The number of points to be randomly generated.

The number of points can be specified as a long integer number or as a field from the constraining features containing numeric values for how many random points to place within each feature. The field option is only valid for polygon or line constraining features. If the number of points is supplied as a long integer number, each feature in the constraining feature class will have that number of random points generated inside or along it.

The shortest distance allowed between any two randomly placed points. If a value of 1 Meter is specified, all random points will be farther than 1 meter away from the closest point.

Determines if the output feature class will be a multipart or single-part feature.

  • Unchecked—The output will be geometry type point (each point is a separate feature). This is the default.
  • Checked—The output will be geometry type multipoint (all points are a single feature).

If Create Multipoint Output is checked, specify the number of random points to be placed in each multipoint geometry.

Derived Output

The output random points feature class.

The location or workspace in which the random points feature class will be created. This location or workspace must already exist.

The name of the random points feature class to be created.

Random points will be generated inside or along the features in this feature class. The constraining feature class can be point, multipoint, line, or polygon. Points will be randomly placed inside polygon features, along line features, or at point feature locations. Each feature in this feature class will have the specified number of points generated inside it (for example, if you specify 100 points, and the constraining feature class has 5 features, 100 random points will be generated in each feature, totaling 500 points).

Random points will be generated inside the extent. The constraining extent will only be used if no constraining feature class is specified.

The number of points to be randomly generated.

The number of points can be specified as a long integer number or as a field from the constraining features containing numeric values for how many random points to place within each feature. The field option is only valid for polygon or line constraining features. If the number of points is supplied as a long integer number, each feature in the constraining feature class will have that number of random points generated inside or along it.

The shortest distance allowed between any two randomly placed points. If a value of 1 Meter is specified, all random points will be farther than 1 meter away from the closest point.

Determines if the output feature class will be a multipart or single-part feature.

  • POINT — The output will be geometry type point (each point is a separate feature). This is the default.
  • MULTIPOINT — The output will be geometry type multipoint (all points are a single feature).

If create_multipoint_output is set to MULTIPOINT , specify the number of random points to be placed in each multipoint geometry. The default is 10.

Derived Output

The output random points feature class.

Code sample

The following Python window script demonstrates how to use the CreateRandomPoints tool in immediate mode.

The following stand-alone Python script demonstrates how to create random points with random values.

The following stand-alone Python script demonstrates several methods to use the CreateRandomPoints tool.


2. Configuration

Before being able to use Fabnami’s e-shop, you need to configure it properly. Some of the fields that appear in the various sections of the Fabnami Configuration and Administration app are compulsory whereas others are optional. Some fields, like the Materials, can contain the specifications and pricing configurations of any number of materials. Other fields can only contain single values.

2.1. Πληροφορίες

Most fields are self-explanatory: you’ll also find a brief help text below each field. All company-related information can appear in the e-shop front-end and be seen by your clients. Whether the information is displayed or not depends on the kind of front-end format you choose to have. Here are some remarks about the fields:

ο Company logo URL is optional and is used, for example, in the editable invoices that you can access from the Business  ▸ Orders page of the Configuration and Administration app.

ο Fixed phone is required, Mobile phone is optional and is currently not used.

ο VAT number can be optionally displayed after checking out the cart if your clients are based in your same commercial area.

Σε Sales tax name you can override the localized "VAT" string in case the country you are based in uses a different name (for example, "GST")

With the settings in Terms and conditions you can require your clients to agree to your Terms and Conditions before proceeding with the purchase. In this case, you must provide the URL of the web page that displays them.

You need to check Enable production if you want to activate the production/live mode and start accepting orders and payments (if online payments are enabled and configured). If you access the production servers without enabling the production mode, you’ll receive an error notification.

If you pick a payment service, you also need to input the Payment Service Provider Public/Publishable API keys used for testing and those used in production (also called live keys). You can find API keys in the websites of your payment processor of choice. If you access the test servers, the test API key is used. If you enable the production mode and access the production servers, the live API key is used instead. To complete the configuration of the online payment service, you must configure the secret (private) API keys in the Configuration  ▸ Specs & Pricing page.

ο Περιγραφή field gives you the possibility to describe your business briefly. You can use plain text or HTML. You can also embed a map to display the location of your business. To do that by using Google Maps, search your business’ location, click on the hamburger menu icon on the top-left corner of the page, choose Share or Embed Map from the slide-in menu. Choose then a custom-size embedded map and set the height (the second field on the left) to 200. Copy the iframe code, paste it into the Fabnami Information Description field and set the width to "100%"".

If you select Collect leads, Fabnami requires your clients to input a valid email address before computing any quote and makes such email (as well as the origin IP number and uploaded files) available to you in the Business  ▸ Quotes page of the Configuration and Administration app. Not requiring to input an email address at the beginning of the purchase process can result in an improved user experience and higher conversion rates. A client’s email address is in any case required during the check-out.

2.2. Specs & Pricing

Setting the checks and pricing expressions is the most complex part of the e-shop configuration. Here you need to configure the manufacturability checks and pricing for all the materials, finishes and additional services that you want to offer online. Every material can be associated with its manufacturability checks and with several finishes. You can configure the additional services so to have them displayed in combination with either manufacturable and non-manufacturable models. For example, if the model is not manufacturable, you can offer to check and repair it manually.

Many fields are self-explanatory, here are some remarks and explanations about the others: * The VAT rate must be expressed as a fraction: if the tax rate is 20% you need to type in 0.2 * The Time filter in days controls the maximum age of the orders and quotes displayed in the Business  ▸ Orders and Business  ▸ Quotes pages. The default and maximum number is 90. * The Payment Service Provider Private/Secret Keys are the API key corresponding to the Public/Publishable keys mentioned in the Information section.

2.2.1. Integrations

Citrix Podio

Based on Citrix Podio, we developed a set of applications to let you manage your clients’ orders and let you and your colleagues collaborate in an easy and fast way during the fulfillment of the orders. If you have a Podio account (free up to 10 users), you can install the Fabnami applications by going to the 3D-printing order-fulfillment management app-pack in the Podio market and installing it. The apps integrated with Fabnami are the following:

All models uploaded by your clients for which Fabnami computed a quote are visible in this Podio app.

All model/material/finish combinations requested by your clients as well all purchased services can be found in this app. Each 3D-print job belongs to one order only, and each order can be associated with multiple jobs. Also, each job references one and only one model.

All orders issued by your clients appear in this app. Each order is associated with one or more jobs.

To configure properly the Fabnami Podio apps, you need to add a Podio-specific JSON object to the Integrations section of the Configuration  ▸ Specs & Pricing page within the Configuration and Administration app, like the following one:

The app_id and token must correspond to the ones of your Podio apps. To visualize the id and token of a Podio app, click on the app icon in the top navigation bar, and then click on the gear in the top-left corner of the page. At the bottom of the pop-up list, click on the second-last item Προγραμματιστής. You can find the app_id and token on the next page, just copy and paste them into the appropriate fields in Configuration  ▸ Specs & Pricing page within the Configuration and Administration app.

Νόμισμα

Before being able to use Podio, you need to enable the currency in which the Fabnami pricing engine computes your print quotes (USD, EUR, GBP, and CHF are pre-configured). To add a currency like, for example, the Canadian Dollar CAD, please proceed as follows:

If you have not done it yet, install the 3D-printing order fulfillment management app-pack

Click on the 3D Print Orders app

Click on the small wrench in the upper-right corner

Scroll down to Price VAT excl.

Click on the down-pointing arrow beside the banknote icon

Επιλέγω Set currency from the drop-down menu

Repeat the same for Price VAT inc.

Dropbox

The Fabnami Dropbox integration allows you to have all 3D-models uploaded by your clients appear in real-time in your Dropbox folder. To enable the integration, log into the Configuration and Administration app, navigate to Configuration  ▸ Dropbox app and follow the instructions to give Fabnami access to your Dropbox folder. Additionally, Dropbox must be enabled by pasting the following code into the Integrations section of the Configuration  ▸ Specs & Pricing page within the Configuration and Administration app:

2.2.2. Webhooks

A webhook is an HTTP callback that can be triggered by certain events to notify external systems. In the Configuration and Administration app, you can configure webhooks that can be triggered when Fabnami computes a quote or when a client issues an order. In both cases, you can freely configure the payload that is POSTed or PUT to the external systems' endpoint. The payload must be in JSON format and can reference any quote or order data element, including your client’s email (if you configured Fabnami to request it), file names, body (shell) count, unit price for quotes, billing/shipping address, order amount, and order quantities. Please find an example in the Salesforce webhook section.

Salesforce

You can use webhooks to create leads in Salesforce whenever Fabnami computes a quote, or a client issues an order. To do that, you need to define a Salesforce web-to-lead form. The web-to-lead form page contains the following important pieces of information:

uniquely identifies your web-to-lead form

To create a web-to-lead whenever Fabnami computes a quote, the JSON payload should look like this:

The email is available if you enable Collect leads in the Configuration  ▸ Information page within the Configuration and Administration app, which makes Fabnami require your clients' email address before uploading a 3D model.

To create a web-to-lead whenever a client issues an order, you should configure the JSON webhook payload to look like this:

Do not hesitate to contact [email protected] to get advice and assistance with the integration of Salesforce with your Fabnami account.

2.2.3. Materials

ο Materials section contains the manufacturability checks and the pricing logic for all materials and finishes. The fields Name, ID και Machine model ID are for internal use only, to let you keep track of your offer and share the IDs with other apps like Enterprise Resource Planning or inventory tracking apps. ο Περιγραφή field is the only one that is visible to your clients in the e-shop front-end. If you define finishes, the finish description follows the material’s description, after a comma. ο Delivery time indicates the time needed by you to fulfill a print order in the specified material. If the delivery time is expressed with a shorthand like, for example, 6H , 3D or 1W , the expression is expanded to six hours, two days ή one week.

2.2.4. Manufacturability checks

Στο Manufacturability checks section, you can configure the controls performed on the 3D models uploaded by your customers. You can base the checks on any geometric and topological feature of the 3D mesh, on top of using our proprietary algorithms for thin-wall and minimum-detail size detection. The checks' logic needs to be coded in the Logic field as a JavaScript expression. You can configure the manufacturability checks for each material you define. Depending on the outcome of the check, Fabnami shows your clients the corresponding quote or, optionally, a service.

The flexibility of Fabnami’s configuration allows you to specify any manufacturability check logic. To avoid the difficulties of having to program the checks starting from basic functions and measures, we developed a library of helper functions that allows you to configure the manufacturability checks without having to learn to program.

contains a description of all model measures and geometric algorithms that you can use in the manufacturability check JavaScript expression.

contains a description of the helper functions that you can use to define easily and concisely the manufacturability and raise issues that need to be notified to your customers.

contains a few manufacturability expression examples on which you can base your configuration.

2.2.5. 3D-print price

In the Price section of the Configuration and Administration app, you need to define a pricing model for the 3D print based on the geometric and topological features of the 3D meshes uploaded by your customers. The price needs to be coded in the Logic field as a JavaScript expression.

The price expression bears several similarities with the one used to configure the manufacturability checks. It must set the price of the 3D print for the material/finish you are configuring, which is eventually displayed to your customers. Although you can use all available low-level measures and functions, we developed a library of helper functions to reduce the difficulties related to programming the pricing logic.

You can find additional information in the following sections:

contains a description of all model measures and geometric algorithms that you can use in the pricing JavaScript expression.

contains a description of how to configure the 3D print price logic.

contains a few pricing expression examples on which you can base your configuration.

Finishes

You can associate any number of finishes to each material you define. The price of the finishes is configured via a JavaScript price expression, just like the materials’ prices. The finish’s price is added to the price of the relevant material before displaying the quote to your clients.

2.2.6. JavaScript expressions

During the configuration of the Fabnami e-commerce solution, you encounter two kinds of expression: the manufacturability check expressions και το price expressions. The JavaScript logic of both expressions have access to all 3D model’s geometric and topological measures and, additionally, to the results of several algorithms that are automatically applied to the 3D model. The manufacturability check expressions can also define a set of optional, configurable checks, whose results become automatically available within the expression.

Model measures

The JavaScript expression has access to object named model that contains a comprehensive set of 3D model properties and measures. The properties marked with a star (*) need additional information to be computed, as it is explained below. The properties available to the JavaScript expression in the model object are the following:

model.bounding_box_size (array of three numeric values)

Additionally, the manufacturability check expressions can also access the following measures:

Lateral path

Some 3D printers use a technology that requires a tool to follow the borders of a model slice. For example, the paper-based MCor printers cut sheets of paper with a blade along the border of a model’s horizontal slices. If you use the following command in the Manufacturability check logic:

model.lateral_path becomes available in both the manufacturability check and pricing JavaScript logic. The lateral path is proportional to the length of the path followed by a tool that runs along the contour a model’s slices. The actual path length depends on the thickness of the slices.

Support material volume

To calculate the support material volume you have several choices:

Set model.support_material.algorithm = "simple" and set the property model.support_material.threshold_overhang_angle (in radians and larger than zero) or, alternatively, use the helper function compute_support_material(angle) . Fabnami computes the support material volume and sets model.support_material_volume to its computed value. Please note that this calculation method does not minimize the print duration. Optionally, you can set model.support_material.support_calculation_precision (integer and larger than zero) to increase or decrease the precision (beware: higher precisions require more time). If you do not define it, it defaults to 30.

Minimal shadow support material

Set model.support_material.algorithm = "optimize_rotation" and set the property model.support_material.threshold_overhang_angle (in radians and larger than zero) or, alternatively, use the helper function minimize_support_using_threshold_overhang_angle(angle) . Fabnami optimally rotates the 3D-mesh to minimize the support material volume and sets model.support_material_volume to its computed value. Please note that this calculation method does not minimize the print duration. Optionally, you can set model.support_material.support_calculation_precision (integer and larger than zero) to increase or decrease the precision (beware: higher precisions require more time). If you do not define it, it defaults to 30.

Flat-part support material

Set model.support_material.algorithm = "use_minimal_bounding_box_dimension" and set the property model.support_material.threshold_overhang_angle (in radians and larger than zero) or, alternatively, use the helper function minimize_support_using_minimal_bounding_box_dimension(angle) . Fabnami computes the support material volume for the case model is laid flat, so that its minimum dimension is the vertical one, and sets model.support_material_volume to its computed value. For some 3D print processes, this is the best way to minimize the print duration.

Set model.support_material.algorithm = "smart" to compute the volume of the support material generated by the Stratasys’ SMART method. Fabnami sets model.support_material_volume to its computed value.

Smart and minimal support material

Set model.support_material.algorithm = "smart_minimal_bounding_box_rotation" to compute the volume of the support material generated by the Stratasys’ SMART method, minimized by flipping the 3D-mesh bounding box in all possible ways. Fabnami sets model.support_material_volume to its computed value.

Embedding support material

Some printers almost completely embed the object in the support material. In this case, you can compute the support material volume by subtracting the object volume from the bounding box volume and optionally multiply the result by a factor lower than 1 to account for the fact that the bounding box is not full and for the density of the support material:

Maximum sharpness

If you set the property model.max_sharpness_angle (expressed in radians), the property model.sharpness_ok becomes available to the JavaScript expression and is true if no too sharp angles between facets are found. If you use the helper function require_max_sharpness(angle) , Fabnami sets model.max_sharpness_angle automatically you do not need to set it manually.

Maximum overhang angle

If you set the property model.max_overhang_angle (expressed in radians), the property model.overhanging_facet_count becomes available to the JavaScript expression. The expression model.overhanging_facet_count == 0 returns true if no facet hangs over the maximum angle. If your printer uses support material, you do not need to set this variable, but you can optionally optimize the support material as it is explained in the Support material volume section. If you use the helper function require_no_overhanging_surfaces(angle) , model.max_overhang_angle is automatically set you do not need to set it manually.

Minimal thickness

If you set the property model.min_thickness , model.thin_facet_count becomes available within the JavaScript expression. The expression model.thin_facet_count == 0 returns true if no thin walls are found. If you use the helper function require_thicker_than(min_thickness) , the model.min_thickness is automatically set you do not need to set it manually.

2.2.7. Mesh repair

All common mesh defects — for example, duplicated vertexes and edges and non-harmonized face normals — are automatically and transparently fixed by default only for the purpose of computing the quotes. If you need advanced automatic repair for specific use cases, please get in touch with us. If you are interested in this subject, please have a look at the following blog entry authored by Fabnami’s founders: The limits of automatic 3D mesh repair.

2.2.8. Manufacturability check expressions

The manufacturability check expressions allow you to compute whether the 3D models uploaded by your clients can be 3D-printed in a given material, to notify your clients of all the 3D mesh issues they should fix before being able to submit the mesh successfully for print or to warn about potential issues with the 3D-models they submitted. The most frequent checks are implemented in the helper functions that are available in the JavaScript expression (See the Simplified check coding section). If you need to perform more exhaustive checks, please read the Advanced check coding section. You can mix advanced code and helper functions as needed.

Simplified check coding

The simplified coding is based on a set of helper functions that encapsulate multiple manufacturability checks and notifications to your clients. The helper functions available are the following:

This option tightens some mesh checks. If you enable this option, Fabnami checks 3D meshes very strictly and does not compute the volume of a mesh unless the mesh satisfies several strict criteria. However, we noticed that the software bundled with some 3D printers and the widely used Netfabb application do not apply very strict checks. So Fabnami performs by default less strict checks and lets you consider as manufacturable models that do not fulfill the most strict requirements for manufacturability.

This option tightens some mesh checks. Use it if the slicer or tool-path generation software you use does not handle well self-intersections. By default, the is_two_manifold test corresponds to the result of a less strict check whereas is_solid is not affected by this option and is always computed using a strict algorithm to detect holes in the mesh, which make the mesh not watertight.

This option enables the calculation of a variable that is proportional to the path followed by a tool that runs along the horizontal slices of a model. If this function is called, the path length becomes available as model.lateral_path . This option was specifically designed to compute the blade usage in MCor printers.

If the 3D mesh has self-intersections, the model is considered to be non-manufacturable, and your clients are notified via the e-shop.

If the strict_two_manifoldness_detection option is enabled and the 3D mesh is not 2-manifold, the model is considered to be non-manufacturable and your customers are notified via the e-shop. By, default Fabnami adopts a tolerant heuristic.

This check considers a model as manufacturable if the 3D mesh is strictly two-manifold (the option strict_two_manifoldness_detection does not affect this specific check) and its inside/outside can be defined without ambiguity. If the model is considered to be non-manufacturable, your clients are notified via the e-shop.

If the number of distinct components found in the 3D mesh is higher the max_count , the model is considered to be non-manufacturable, and your clients are notified via the e-shop.

If the number of distinct connected components found in the 3D mesh is higher than max_count , the model is considered to be non-manufacturable, and your customers are clients via the e-shop.

If a wall with thickness thickness smaller than min_thickness is found, the model is considered to be non-manufacturable, and your clients are notified via the e-shop.

If any edge with an angle smaller than angle is found, the model is considered to be non-manufacturable, and your clients are notified via the e-shop.

If a facet has an overhang angle larger than angle (expressed in radians), the model is considered to be non-manufacturable, and your clients are notified via the e-shop.

If any of the three bounding-box measures is smaller than min_dimension , the model is considered to be non-manufacturable, and your clients are notified via the e-shop.

The max_bb parameter is an array with three numerical values (for example, [25, 35, 50] ). If the model cannot be flipped in any way to fit it inside the specified max_bb box, the model is considered to be non-manufacturable, and your clients are notified via the e-shop.

The min_bb and max_bb parameters have to be arrays with three numerical values (for example, [25, 35, 50] ). If the model cannot be flipped in any way to fit it inside the specified max_bb box and, at the same time, to contain a min_bb sized box, the model is considered to be non-manufacturable, and your clients are notified via the e-shop.

All functions described above perform the checks, possibly notify your customers and do not return values.

If you want to mix helper functions and advanced code, you might need to know the result of a check without issuing a notification. Helper functions have the following twin functions that return a boolean value ( true or false ) without issuing a notification:

Advanced check coding

If your manufacturability check needs go beyond the functionalities offered by the helper functions, you can code your manufacturability check logic. In this case, you also need to specify which issues need to be notified to your customers via the e-shop by using the following function:

The parameter A must be one of the following error codes:

If A does not correspond to any permitted error code, it defaults to custom_issue and the optional parameter B takes the value of A . If A corresponds to a permitted error code, your clients are notified in their language of choice. You can specify an additional error message with the parameter B . This optional additional error message is displayed nearby the error message corresponding to the error code passed with the parameter A . The optional error message is not localized and is shown as it appears in the JavaScript expression.

You can enable the strict modes for volume calculation and two-manifoldness detection by setting the following variables to true

You can enable the calculation of the lateral path by setting the following variable to true :

The lateral path was explicitly designed to compute the blade usage of MCor printers.

2.2.9. Manufacturability check warnings

As it is explained in the Manufacturability check expressions section, by notifying a manufacturability issue, the model is marked as not manufacturable. If you want to warn your customers about issues that can potentially affect the manufacturability of the model, but still consider the model as manufacturable, you can issue a manufacturability check warning. Such warnings can be generated in the Manufacturability checks section of the Configuration  ▸ Specs & Pricing page within the Configuration and Administration app by adding a line like the following:

No standardized messages are available: you can only use custom text. Language localization is not available.

2.2.10. Price expressions

The role of the price expression is to calculate a price for 3D printing a 3D model in a specified material and finish. Analogously to the manufacturability check JavaScript expressions, you can use a library of helper functions (documented in the Simplified pricing coding section) that cover some common pricing cases. If your pricing needs to go beyond the functionalities offered by the helper functions, you need to read the Advanced pricing coding section.

Simplified pricing coding

The simplified coding is based on a set of helper functions that encapsulate commonly used pricing models. In many cases, a few lines of code are enough to compute the price for a 3D print. The helper functions available are the following:

computes the 3D print price based exclusively on the model volume by using the price tiers defined in a table (see the example below).

var computed_price = get_price_from_table_using_value(table, value)

more generally, computes the 3D print price based on the value by using the price tiers defined in a price tiers table. The first function does not assign a value to the price variable, but you can process its result in your custom JavaScript code and finally assign the price amount to the price variable.

The format of the price tiers table is an array of objects. Each object has two properties:


Δες το βίντεο: Αναδιπλώστε wrap το πλαίσιο κειμένου που εμφανίζεται στο κάτω μέρος της εικόνας.. (Οκτώβριος 2021).