Suite

Enregistrer l'image dans le cadre de délimitation par programmation

Enregistrer l'image dans le cadre de délimitation par programmation


Je souhaite enregistrer une image à partir de QGIS mais la fonctionnalité d'enregistrement d'image semble limitée.

Est-il possible d'utiliser la ligne de commande python pour enregistrer une image à une échelle de zoom spécifique et pour définir un cadre de délimitation sur la région que je souhaite imprimer ?

Par exemple, je souhaite enregistrer une image à l'échelle 1:1000 000 avec des coordonnées spécifiques en tant que cadre de délimitation.


Pouvez-vous essayer la dernière version de développement de QGis ? QGis 3 comportera une fonctionnalité « enregistrer en tant qu'image » bien améliorée, la version n'est pas encore officiellement publiée, mais les versions nocturnes sont disponibles et semblent assez stables. Présentation de la nouvelle fonctionnalité : http://imhere-asia.com/blog/post/more-qgis-30-improvements-saving-map-canvas-as-image-pdf

Sinon, vous pouvez également utiliser le Composer : ajoutez une seule carte en prenant tout l'espace, puis vous pouvez définir l'échelle et les coordonnées dans les propriétés de la carte. La documentation est disponible ici : https://docs.qgis.org/2.18/en/docs/user_manual/print_composer/overview_composer.html

Je suis sûr que c'est également possible en Python, mais cela semble excessif pour votre cas d'utilisation.


Exkoria, je sais que vous utilisez QGIS, mais j'ai pensé que je publierais ce code à partir d'ArcMAP au cas où vous pourriez obtenir de l'aide. Il effectue un panoramique sur chaque entité d'un fichier de formes et exporte une image, puis se répète pour toutes les entités du fichier de formes que vous spécifiez. Comme je l'ai dit, ce n'est pas QGIS, mais cela pourrait aider d'une manière ou d'une autre.

# Ce script effectue un panoramique d'ArcMap, une fois pour chaque entité de la couche (valeur transmise) # # Notez le time.sleep(1), cela a été inclus car je devais faire une pause pour # laisser à ArcBruTile le temps de télécharger des images. En fonction de votre kilométrage, # cela doit probablement être ajusté. # # 19/04/2012 # # http://nodedangles.wordpress.com # # import 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)) pour la ligne dans 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:scratchImagesMap_%s. jpg">PartagerAméliorer cette réponserépondu 28 août '14 à 13:50BarrettBarrett2,99314 insignes d'argent29 insignes de bronze 

Comment savoir si un fichier PDF contient des données non visibles dans le cadre de délimitation ? [fermé]

Vous voulez améliorer cette question ? Mettez à jour la question afin qu'elle soit sur le sujet pour TeX - LaTeX Stack Exchange.

J'intègre une petite zone d'une grande page Web dans un document compilé avec pdflatex (à l'aide de includegraphics ). Une image raster / capture d'écran produit des artefacts lors d'un zoom avant, donc à la place, j'enregistre la page au format PDF avec la boîte de dialogue d'impression du navigateur et je recadre la section dont j'ai besoin.

Cet outil modifie le cadre de délimitation et produit le visuel apparence. Mais le fichier conserve tout le contenu de l'original.

Il y a des informations personnelles contenues en dehors de la zone de délimitation que je voudrais m'assurer qu'elles ne figurent pas dans le pdf recadré (noms d'utilisateur, horodatages, identifiants, etc.). Étant donné une chaîne de texte en clair ascii dans le document original, par ex. mon nom d'utilisateur, comment puis-je m'y prendre pour savoir s'il est présent dans le PDF. Puis-je m'attendre à ce que le texte ascii de la page soit contenu littéralement ou serait-il codé sous une forme vectorielle?

Je mentionne que le fichier provient d'un navigateur, car intuitivement, les navigateurs peuvent encoder leurs PDF imprimés de manière prévisible, il est peut-être facile de découper des zones s'il correspond directement au DOM.


1 réponse 1

Tout d'abord, notez que vous pouvez toujours utiliser Point2D.Double pour représenter des points dans un plan.

Ensuite, je diviserais votre programme en deux méthodes : la première pour élaguer les points qui ne se trouvent pas dans une zone de délimitation spécifiée, et la seconde pour lire les points à partir de l'entrée standard et les mettre dans la première.

En ce qui concerne les conventions de codage, j'aurais une ligne vide avant le si déclaration. En outre, vous devez entourer l'état d'un si déclaration avec un seul espace. Alors, au lieu de


13 réponses 13

Vous pouvez configurer des plans de travail pour chaque objet. Ou ajustez simplement le plan de travail pour qu'il ne s'adapte qu'à l'objet que vous souhaitez exporter, puis cochez l'option « clip sur le plan de travail » lors de l'enregistrement/l'exportation.

Tu pourrais cacher tout ce que tu ne pas voulez exporter en premier :

  • Tout sélectionner
  • Maj - cliquez sur l'art que vous souhaitez exporter
  • Choisissez Objet > Masquer dans le menu
  • Exporter (en laissant "clip to artbaord" ONUcoché) Vous ne devriez voir que l'art non caché.
  • Choisissez Objet > Afficher tout dans le menu.
  • Répéter

Vous pouvez également utiliser le raccourci caché « masquer les autres ». Sélectionnez l'objet que vous souhaitez enregistrer/exporter, puis appuyez sur Commande-Option-Maj-3 (Mac) ou Ctrl-Alt-Maj-3 (Win). Cela masquera tout ce qui n'est pas sélectionné. Enregistrer/Exporter, puis appuyez sur Commande-Option-3 (Mac) ou Ctrl-Alt-3 (Win) pour tout montrer à nouveau. Sélectionnez un nouvel objet et répétez.

Ou je trouve souvent que la simple copie dans un nouveau fichier est plus rapide.

  • Sélectionnez l'œuvre que vous souhaitez exporter
  • Modifier > Copier
  • Fichier > Nouveau
  • Modifier > Coller
  • Exporter (en laissant "clip to artbaord" ONUvérifié)
  • Fichier > Fermer (ne pas enregistrer - appuyez simplement sur la touche d)
  • Répéter

Faites-le assez souvent et cela devient un processus très rapide.

Je viens d'adapter le plan de travail aux objets que je veux :

  1. Sélectionnez les objets souhaités.
  2. Objet -> Plans de travail -> Ajuster à l'art sélectionné
  3. ctrl+alt+maj+s pour ouvrir la boîte de dialogue Enregistrer pour le Web.
  4. ctrl + z pour annuler l'ajustement.

Cela nécessite à la fois Illustrator et Photoshop, mais c'est mon préféré :

  1. Cliquez pour sélectionner l'objet/les objets dans Illustrator
  2. Faites un "Fichier>Copier", Ctrl+C ou applekey-C pour copier
  3. Dans Photoshop, faites "Fichier> Nouveau", Ctrl+N ou applekey-N et conservez les options par défaut qu'il vous donne (exception : vous pouvez changer l'arrière-plan en Transparent)
  4. Dans Photoshop, faites un "Fichier>Coller", ctrl+v ou applekey-V.

Vous n'aurez plus que l'objet/les objets seuls (déjà recadrés !) et pourrez enregistrer, exporter ou exporter pour le Web à partir de là. Je ne sais pas si cela fonctionne sur toutes les plates-formes, mais c'est certainement le cas sur mon macbook air.

Dans Illustrator CC 2015.3 (20), Adobe a finalement ajouté un outil d'exportation de ressources similaire à Sketch.

Maintenant, vous pouvez sélectionner n'importe quel objet, faites un clic droit et "Exporter la sélection. ". Si vous souhaitez exporter plusieurs sélections différentes, vous pouvez cliquer sur "Collecter pour l'exportation".

Dans le modal qui apparaît, vous pouvez :

  • Donnez un nom à chaque élément.
  • Choisissez un format pour chaque élément png, jpg, svg et pdf sont pris en charge.
  • Pour les formats raster, vous pouvez créer plusieurs sorties à l'échelle, par ex. 2x pour les écrans Retina. Chaque échelle exportée a un suffixe configurable.

Ces configurations sont enregistrées afin que lorsque vous modifiez les objets ultérieurement, vous pouvez tout réexporter facilement.

Voici une astuce étonnamment simple que j'ai récemment apprise.

Ouvrez le fichier AI avec Photoshop (Clic droit, Ouvrir avec Adobe Photoshop…)

Dans la boîte de dialogue, sélectionnez le bouton Images et toutes les images de votre document apparaissent. Sélectionnez les images que vous souhaitez ouvrir et elles s'ouvriront chacune dans un document séparé à la résolution intégrée.

Si vous exportez des SVG voici un moyen super simple:

  1. Copiez la forme que vous souhaitez exporter dans le presse-papiers.
  2. Ouvrir le terminal
  3. Tapez pbpaste > unNomFichier.svg

Votre SVG sera prêt à être placé dans le répertoire de votre choix.

Ce n'est pas la solution idéale, mais si vous placez les objets sélectionnés dans un calque (soit les déplacez, soit les dupliquez temporairement dans un nouveau calque), désactivez le reste des calques et exportez.

Vous ne savez pas dans quel format vous exportez, mais une solution consiste à désactiver la visibilité des objets que vous ne souhaitez pas exporter dans le panneau Calques, puis à exporter.

Le moyen le plus simple que je connaisse est de sélectionner les objets que vous souhaitez exporter, puis de sélectionner l'outil Plan de travail dans la barre d'outils. Utilisez cet outil pour cliquer sur les objets sélectionnés un par un (vous devrez peut-être cliquer deux fois sur les objets après le premier) et un nouveau plan de travail sera créé pour chaque objet.

Ensuite, il vous suffit d'appuyer sur Cmd + E (mac) ou Ctrl + E (pc) pour exporter, puis sélectionnez simplement le format que vous souhaitez et assurez-vous que la case "Utiliser les plans de travail" est cochée. Chaque image individuelle sera exportée en tant qu'instance du nom de fichier que vous saisissez en fonction de son numéro de plan de travail (c'est-à-dire : nom de fichier-01 , nom de fichier-02, etc.). Gardez simplement à l'esprit que cela exportera tout dans la zone du plan de travail sur tous les calques, donc si vous avez besoin de BG transparents, vous devrez masquer tous les calques BG ou autres calques que vous ne souhaitez pas inclure dans l'exportation.

Meilleure solution : enregistrez l'action dans le panneau Actions (ajoutez une clé pour cette action - par exemple F2) :

  • sélectionnez quelque chose sur le plan de travail (objet, deux objets, etc.),
  • appuyez sur Ctrl + C (copier),
  • appuyez sur Ctrl + N (créer un nouveau document),
  • sélectionnez Insérer un élément de menu. dans le menu du panneau Actions (coin droit du panneau Actions)
  • sélectionner le fichier -> enregistrer pour le Web
  • arrêter d'enregistrer les actions

À partir de maintenant, lorsque vous appuyez sur F2, vous enregistrez automatiquement pour l'objet sélectionné sur le Web :)

Le plus simple que j'ai trouvé - faites votre sélection, classez, exportez, puis cochez la case "sélection" pour exporter uniquement les éléments sélectionnés.

Donc je le fais de cette façon: Attribuez un raccourci clavier Ctrl-Alt-Shift-4 à ObjectsFit to Selected Art, et un Ctrl-Shift-E à FileExport De cette façon:

  1. Sélectionnez l'objet
  2. Appuyez sur Ctrl-Alt-Shift-3 (pour masquer tous les autres)
  3. Appuyez sur Ctrl-Alt-Shift-4 (pour ajuster le plan de travail)
  4. Appuyez sur Ctrl-Shift-E (pour exporter)

PS : n'oubliez pas de cocher "Utiliser les plans de travail" dans la boîte de dialogue d'exportation ! Et appuyez deux fois sur Ctrl-Z pour annuler les modifications temporaires.

Le moyen le plus rapide consiste à utiliser les fonctionnalités d'exportation impressionnantes de Sketch.

Façon 1 : -Sélectionnez le groupe dans Illustrator -Collez dans Sketch (répétez avec tous les groupes que vous souhaitez exporter) -Sélectionnez les groupes dans Sketch et cliquez sur "rendre exportable" -Exportez à la résolution souhaitée.

Façon 2: -Sélectionnez le groupe dans Illustrator -Collez dans Sketch (répétez avec tous les groupes que vous souhaitez exporter) -Sélectionnez les groupes dans l'onglet niveaux -Faites glisser et déposez le bureau ou le dossier.


Mdhntd

Quelles instances peuvent être résolues aujourd'hui par les solveurs modernes (pur LP) ?

Est-il possible que Curiosity ait mesuré son propre méthane ou ait échoué à faire la spectrométrie ?

Quels sont les plus efficaces pour éteindre les feux de forêt : les avions ou les hélicoptères ?

Qu'est-ce qui a causé les flashs dans les séquences vidéo de Tchernobyl ?

Quand est-ce que je fais ma première sauvegarde contre le sort Web ?

Quelle est la signification des acronymes de 4 lettres dans les noms romains comme Titus Flavius ​​T. f. T. n. Sabinus ?

Pourriez-vous vous vendre en esclavage aux USA ?

Wolfgang Unzicker était-il le dernier GM amateur ?

Contourner avec un mauvais cvv de carte de débit et obtenir OTP

Dois-je avertir mon patron que je pourrais prendre un congé de maladie

Terme désignant un personnage qui n'existe que pour lui parler

Dans National Velvet, pourquoi n'ont-ils pas utilisé de doublure pour Elizabeth Taylor ?

Qui paie pour des mesures de sécurité accrues sur les vols vers les États-Unis ?

Trouver le nom de couleur HTML le plus proche

Dois-je être légalement qualifié pour installer un thermostat intelligent Hive ?

Y a-t-il des avantages à écrire à la main par rapport à taper une histoire ?

Une référence a-t-elle un emplacement de stockage ?

Fatigué somnolent vs fatigué physiquement

Comment voyager entre deux mondes stationnaires en un minimum de temps ? (dilatation du temps)

Créer un cadre de délimitation dans ArcGIS API for JavaScript ?

Convertir les coordonnées géographiques en zone UTM 29N avec JavascriptAjouter des graphiques de différentes références spatiales à l'aide de l'API ArcGIS pour JavaScript ?Générer une zone de délimitation aléatoire de 100x100 m dans n'importe quelle projection en Python pur ?Clip objet spatial à la zone de délimitation dans RLa lecture des lignes dans la zone de délimitation a échouéComment déterminer la zone de délimitation de l'étendue actuelle du canevas de qgis à partir de la console python Meilleur cadre de délimitation en utilisant collectionComment restreindre le panoramique dans QGIS à une étendue donnéeBoundingBox clé dans l'API Geo de RedisDécouvrez si un cadre de délimitation se trouve dans une couche vectorielle dans openlayers 3

J'essaie de créer un cadre de délimitation pour ma carte dans ArcGIS 3.28. Je veux que la zone de délimitation reste dans une zone donnée en fonction des coordonnées données. J'ai trouvé une classe appelée Extent dans la référence API qui peut définir un cadre de délimitation, mais il ne semble pas qu'il existe un moyen d'implémenter le cadre de liaison. Voici ce que j'ai en ce moment :`

En utilisant ceci, existe-t-il un moyen de créer un cadre englobant ou y a-t-il quelque chose que je peux y ajouter pour le faire fonctionner?

J'essaie de créer un cadre de délimitation pour ma carte dans ArcGIS 3.28. Je veux que la zone de délimitation reste dans une zone donnée en fonction des coordonnées données. J'ai trouvé une classe appelée Extent dans la référence API qui peut définir un cadre de délimitation, mais il ne semble pas qu'il existe un moyen d'implémenter le cadre de liaison. Voici ce que j'ai en ce moment :`

En utilisant ceci, existe-t-il un moyen de créer un cadre englobant ou y a-t-il quelque chose que je peux y ajouter pour le faire fonctionner?

J'essaie de créer un cadre de délimitation pour ma carte dans ArcGIS 3.28. Je veux que la zone de délimitation reste dans une zone donnée en fonction des coordonnées données. J'ai trouvé une classe appelée Extent dans la référence API qui peut définir un cadre de délimitation, mais il ne semble pas qu'il existe un moyen d'implémenter le cadre de liaison. Voici ce que j'ai en ce moment :`

En utilisant ceci, existe-t-il un moyen de créer un cadre englobant ou y a-t-il quelque chose que je peux y ajouter pour le faire fonctionner?

J'essaie de créer un cadre de délimitation pour ma carte dans ArcGIS 3.28. Je veux que la zone de délimitation reste dans une zone donnée en fonction des coordonnées données. J'ai trouvé une classe appelée Extent dans la référence API qui peut définir un cadre de délimitation, mais il ne semble pas qu'il existe un moyen d'implémenter le cadre de liaison. Voici ce que j'ai en ce moment :`

En utilisant ceci, existe-t-il un moyen de créer un cadre englobant ou y a-t-il quelque chose que je peux y ajouter pour le faire fonctionner?


Si vous êtes plus préoccupé par les performances que par le code propre, utilisez-le. Il restreint le nombre d'appels aux accesseurs de propriété d'objets COM lents. C'est la principale raison pour laquelle cette solution est plus rapide que la méthode simple ci-dessus :

Edit: L'approche originale d'IAmNerd2000 échoue lorsque le formatage se situe en dehors de la "RealUsedRange". Il a donc été supprimé de ce post.

Edit : comme l'a souligné MacroMarc, de très grandes plages utilisées entraîneront le blocage du code optimal en raison d'une erreur de mémoire insuffisante. En tant que travail actuel, j'ai recours au code de VBasic2008 si l'erreur se produit. Donc, au pire, il sera aussi lent que le code de VBasic2008, mais au mieux, il sera 10 fois plus rapide.

Edit : RealUsedRange_VBasic2008_refac ne fonctionnait pas dans certaines situations. La solution a maintenant été modifiée pour refléter cela.

Edit : Modifications basées sur le message de Tinman. Les principaux changements ont été la suppression des références de variantes, en utilisant CountLarge au lieu de .Rows.Count=1 et .Columns.Count=1 et Value2 au lieu de Value


OpenCV OCR et reconnaissance de texte avec Tesseract

Afin d'effectuer la reconnaissance de texte OpenCV OCR, nous devons d'abord installer Tesseract v4 qui comprend un modèle basé sur l'apprentissage en profondeur très précis pour la reconnaissance de texte.

À partir de là, je vais vous montrer comment écrire un script Python qui :

  1. Exécute le texte détection en utilisant le détecteur de texte EAST d'OpenCV’s, un détecteur de texte d'apprentissage en profondeur très précis utilisé pour détecter du texte dans des images de scènes naturelles.
  2. Une fois que nous avons détectée les régions de texte avec OpenCV, nous allons ensuite extraire chacun des ROI textuels et les passer dans Tesseract, nous permettant de construire un pipeline OCR OpenCV complet !

Enfin, je terminerai le didacticiel d'aujourd'hui en vous montrant quelques exemples de résultats de l'application de la reconnaissance de texte avec OpenCV, ainsi qu'en discutant de certaines des limitations et des inconvénients de la méthode.

Allons-y et commençons avec OpenCV OCR !

Comment installer Tesseract 4

Figure 1: Le moteur OCR Tesseract existe depuis les années 1980. Depuis 2018, il comprend désormais une capacité d'apprentissage en profondeur intégrée, ce qui en fait un outil OCR robuste (n'oubliez pas qu'aucun système OCR n'est parfait). L'utilisation de Tesseract avec le détecteur EAST d'OpenCV’s constitue une excellente combinaison.

Tesseract, un moteur OCR très populaire, a été développé à l'origine par Hewlett Packard dans les années 1980 et a ensuite été open source en 2005. Google a adopté le projet en 2006 et le parraine depuis.

Si vous avez lu mon précédent post sur Utiliser Tesseract OCR avec Python, vous savez que Tesseract peut très bien fonctionner dans des conditions contrôlées…

…mais fonctionnera assez mal s'il y a une quantité importante de bruit ou si votre image n'est pas correctement prétraitée et nettoyée avant d'appliquer Tesseract.

Tout comme l'apprentissage en profondeur a eu un impact sur presque chaque facette de la vision par ordinateur, il en va de même pour la reconnaissance de caractères et la reconnaissance de l'écriture manuscrite.

Les modèles basés sur l'apprentissage en profondeur ont réussi à obtenir une précision de reconnaissance de texte sans précédent, bien au-delà des approches traditionnelles d'extraction de caractéristiques et d'apprentissage automatique.

Ce n'était qu'une question de temps avant que Tesseract n'intègre un modèle d'apprentissage en profondeur pour améliorer encore la précision de l'OCR et, en fait, ce moment est venu.

La dernière version de Tesseract (v4) prend en charge OCR basé sur l'apprentissage en profondeur qui est significativement plus précise.

Dans la suite de cette section, vous apprendrez comment installer Tesseract v4 sur votre machine.

Plus loin dans cet article de blog, vous apprendrez comment combiner l'algorithme de détection de texte EAST d'OpenCV avec Tesseract v4 dans un script Python unique pour effectuer automatiquement OpenCV OCR.

Commençons à configurer votre machine !

Installer OpenCV

Pour exécuter le script d'aujourd'hui, vous aurez besoin d'OpenCV installé. La version 3.4.2 ou supérieure est requise.

Pour installer OpenCV sur votre système, suivez simplement l'un de mes guides d'installation OpenCV, en vous assurant de télécharger la version correcte/souhaitée d'OpenCV et OpenCV-contrib dans le processus.

Installer Tesseract 4 sur Ubuntu

Les commandes exactes utilisées pour installer Tesseract 4 sur Ubuntu seront différentes selon que vous utilisez Ubuntu 18.04 ou Ubuntu 17.04 et versions antérieures.

Pour vérifier votre version d'Ubuntu, vous pouvez utiliser la commande lsb_release :

Comme vous pouvez le voir, j'utilise Ubuntu 18.04 mais vous devriez vérifier votre version d'Ubuntu avant de continuer.

Pour les utilisateurs d'Ubuntu 18.04, Tesseract 4 fait partie du référentiel principal apt-get, ce qui facilite l'installation de Tesseract via la commande suivante :

Si vous utilisez Ubuntu 14, 16 ou 17, vous aurez besoin de quelques commandes supplémentaires en raison des exigences de dépendance.

La bonne nouvelle est qu'Alexander Pozdnyakov a créé un Ubuntu PPA (Personal Package Archive) pour Tesseract, ce qui facilite l'installation de Tesseract 4 sur les anciennes versions d'Ubuntu.

Ajoutez simplement le référentiel PPA alex-p/tesseract-ocr à votre système, mettez à jour vos définitions de package, puis installez Tesseract :

En supposant qu'il n'y ait pas d'erreurs, vous devriez maintenant avoir installé Tesseract 4 sur votre machine.

Installer Tesseract 4 sur macOS

L'installation de Tesseract sur macOS est simple à condition que Homebrew, le gestionnaire de packages "non officiel" de macOS, soit installé sur votre système.

Exécutez simplement la commande suivante et Tesseract v4 sera installé sur votre Mac :

2020-07-21 Mise à jour : Tesseract 5 (version alpha) est disponible. Actuellement, nous vous recommandons de vous en tenir à Tesseract 4. Si vous souhaitez le dernier Tesseract (à ce jour, il s'agit de la 5.0.0-alpha), assurez-vous d'ajouter le commutateur --HEAD à la fin de la commande.

Si vous avez déjà installé Tesseract sur votre Mac (si vous avez suivi mon précédent tutoriel d'installation de Tesseract, par exemple), vous devez d'abord dissocier l'installation d'origine :

Et à partir de là, vous pouvez exécuter la commande d'installation.

Vérifiez votre version de Tesseract

Figure 2: Capture d'écran de mon terminal système où j'ai entré la commande tesseract -v pour demander la version. J'ai vérifié que j'ai installé Tesseract 4.

Une fois que Tesseract est installé sur votre machine, vous devez exécuter la commande suivante pour vérifier votre version de Tesseract :

Tant que vous voyez tesseract 4 quelque part dans la sortie, vous savez que la dernière version de Tesseract est installée sur votre système.

Installez vos liaisons Tesseract + Python

Maintenant que nous avons installé le binaire Tesseract, nous devons maintenant installer les liaisons Tesseract + Python afin que nos scripts Python puissent communiquer avec Tesseract et effectuer une OCR sur les images traitées par OpenCV.

Si vous utilisez un environnement virtuel Python (que je recommande vivement pour que vous puissiez avoir des environnements Python séparés et indépendants), utilisez la commande workon pour accéder à votre environnement virtuel :

Dans ce cas, j'accède à un environnement virtuel Python nommé cv (abréviation de "vision par ordinateur") — vous pouvez remplacer cv par le nom que vous avez donné à votre environnement virtuel.

À partir de là, nous utiliserons pip pour installer Pillow, une version de PIL plus compatible avec Python, suivie de pytesseract et imutils :

Ouvrez maintenant un shell Python et confirmez que vous pouvez importer à la fois OpenCV et pytesseract :

Si vous ne voyez aucune erreur d'importation, votre machine est maintenant configurée pour effectuer l'OCR et la reconnaissance de texte avec OpenCV

Passons à la section suivante (en sautant les instructions Pi) où nous apprendrons comment implémenter réellement un script Python pour effectuer OpenCV OCR.

Installez Tesseract 4 et les logiciels de support sur Raspberry Pi et Raspbian

Noter: Vous pouvez ignorer cette section si vous n'êtes pas sur un Raspberry Pi.

Inévitablement, on me demandera comment installer Tesseract 4 sur le Rasberry Pi.

Les instructions suivantes ne sont pas destinées aux âmes sensibles, vous pourriez rencontrer des problèmes. Ils sont testés, mais le kilométrage peut varier sur votre propre Raspberry Pi.

Tout d'abord, désinstallez vos liaisons OpenCV des packages du site système :

Ici, j'ai utilisé la commande rm car mon fichier cv2.so dans les packages de site n'est qu'un lien symbolique. Si les liaisons cv2.so sont votre réel liaisons OpenCV, vous souhaiterez peut-être déplacer le fichier hors des packages de site pour le conserver en toute sécurité.

Installez maintenant deux packages QT sur votre système :

Pour une raison quelconque, le fichier de données en anglais formé était manquant dans l'installation, j'ai donc dû le télécharger et le déplacer dans le bon répertoire :

À partir de là, créez un nouvel environnement virtuel Python :

Et installez les packages nécessaires :

Vous avez terminé ! Gardez simplement à l'esprit que votre expérience peut varier.

Comprendre la reconnaissance de texte OpenCV OCR et Tesseract

Maintenant que nous avons installé avec succès OpenCV et Tesseract sur notre système, nous devons brièvement revoir notre pipeline et les commandes associées.

Pour commencer, nous allons appliquer le détecteur de texte EAST d'OpenCV pour détecter la présence de texte dans une image. Le détecteur de texte EAST nous donnera le cadre de délimitation (x, y)-coordonnées du texte ROIs.

Nous extrairons chacun de ces retours sur investissement, puis les transmettrons à l'algorithme de reconnaissance de texte d'apprentissage en profondeur LSTM de Tesseract v4.

La sortie du LSTM nous donnera nos résultats OCR réels.

Enfin, nous allons dessiner les résultats OpenCV OCR sur notre image de sortie.

Mais avant d'aborder notre projet, examinons brièvement la commande Tesseract (qui sera appelée sous le capot par la bibliothèque pytesseract).

Lors de l'appel du binaire tessarct, nous devons fournir un certain nombre d'indicateurs. Les trois plus importants sont -l , --oem et --psm .

L'indicateur -l contrôle la langue du texte d'entrée. Nous utiliserons eng (anglais) pour cet exemple, mais vous pouvez voir toutes les langues prises en charge par Tesseract ici.

L'argument --oem, ou OCR Engine Mode, contrôle le type d'algorithme utilisé par Tesseract.

Vous pouvez voir les modes de moteur OCR disponibles en exécutant la commande suivante :

Nous utiliserons --oem 1 pour indiquer que nous souhaitons utiliser uniquement le moteur d'apprentissage en profondeur LSTM.

Le dernier indicateur important, --psm contrôle le mode de segmentation de page automatique utilisé par Tesseract :

Pour les ROI de texte OCR, j'ai trouvé que les modes 6 et 7 fonctionnent bien, mais si vous faites l'OCR de gros blocs de texte, vous voudrez peut-être essayer 3, le mode par défaut.

Chaque fois que vous obtenez des résultats d'OCR incorrects, je vous recommande fortement d'ajuster le --psm car cela peut avoir une influence considérable sur vos résultats d'OCR de sortie.

Structure du projet

Assurez-vous de saisir le zip du “Téléchargements” section de l'article de blog.

De là, décompressez le fichier et accédez au répertoire. La commande tree nous permet de voir la structure des répertoires dans notre terminal :

Notre projet contient un répertoire et deux fichiers notables :

  • images/ : Un répertoire contenant six images de test contenant le texte de la scène. Nous allons essayer OpenCV OCR avec chacune de ces images.
  • frosted_east_text_detection.pb : Le détecteur de texte EAST. Ce CNN est pré-formé pour la détection de texte et prêt à l'emploi. Je n'ai pas formé ce modèle — il est fourni avec OpenCV Je l'ai également inclus dans le “Téléchargements” Pour ta convenance.
  • text_recognition.py : Notre script pour l'OCR — nous examinerons ce script ligne par ligne. Le script utilise le détecteur de texte EAST pour trouver des régions de texte dans l'image, puis tire parti de Tesseract v4 pour la reconnaissance.

Implémentation de notre algorithme OCR OpenCV

Nous sommes maintenant prêts à effectuer la reconnaissance de texte avec OpenCV !

Ouvrez le fichier text_recognition.py et insérez le code suivant :

Le script OCR d'aujourd'hui nécessite cinq importations, dont l'une est intégrée à OpenCV.

Plus particulièrement, nous utiliserons pytesseract et OpenCV. Mon package imutils sera utilisé pour la suppression non maximale car la fonction OpenCV’s NMSBoxes ne semble pas fonctionner avec l'API Python. Je noterai également que NumPy est une dépendance pour OpenCV.

Le package argparse est inclus avec Python et gère les arguments de ligne de commande — il n'y a rien à installer.

Maintenant que nos importations sont prises en charge, implémentons la fonction decode_predictions :

La fonction decode_predictions commence le Ligne 8 et est expliqué en détail dans le message de détection de texte EAST. La fonction:

  1. Utilise un détecteur de texte basé sur l'apprentissage en profondeur pour détecter (ne pas reconnaître) des régions de texte dans une image.
  2. Le détecteur de texte produit deux tableaux, l'un contenant le probabilité d'une zone donnée contenant du texte, et une autre qui mappe le score à un emplacement de la zone de délimitation dans l'image d'entrée.

Comme nous le verrons dans notre pipeline OpenCV OCR, le modèle de détecteur de texte EAST produira deux variables :

  • scores : Probabilités pour les régions de texte positives.
  • géométrie : les cadres de délimitation des régions de texte.

…dont chacun est un paramètre de la fonction decode_predictions.

La fonction traite ces données d'entrée, résultant en un tuple contenant (1) les emplacements des cadres de délimitation du texte et (2) la probabilité correspondante de cette région contenant du texte :

  • rects : Cette valeur est basée sur la géométrie et est sous une forme plus compacte afin que nous puissions appliquer plus tard NMS.
  • confidences : Les valeurs de confiance de cette liste correspondent à chaque rectangle dans les rects .

Ces deux valeurs sont renvoyées par la fonction.

Noter: Idéalement, une boîte englobante pivotée serait incluse dans rects , mais il n'est pas tout à fait simple d'extraire une boîte englobante pivotée pour la preuve de concept d'aujourd'hui. Au lieu de cela, j'ai calculé le rectangle englobant horizontal qui prend en compte l'angle. L'angle est disponible sur Ligne 41 si vous souhaitez extraire une boîte englobante pivotée d'un mot à passer dans Tesseract.

Pour plus de détails sur le bloc de code ci-dessus, veuillez consulter cet article de blog.

À partir de là, analysons nos arguments de ligne de commande :

Notre scénario a besoin deux arguments de ligne de commande :

  • --image : Le chemin vers l'image d'entrée.
  • --east : Le chemin vers le détecteur de texte EAST pré-entraîné.

Facultativement, les arguments de ligne de commande suivants peuvent être fournis :

  • --min-confidence : La probabilité minimale d'une région de texte détectée.
  • --width : La largeur à laquelle notre image sera redimensionnée avant d'être passée par le détecteur de texte EAST. Notre détecteur nécessite des multiples de 32.
  • --height : Identique à la largeur, mais pour la hauteur. Encore une fois, notre détecteur nécessite un multiple de 32 pour une hauteur redimensionnée.
  • --padding : La quantité (facultatif) de remplissage à ajouter à chaque bordure de ROI. Vous pouvez essayer des valeurs de 0,05 pour 5 % ou 0,10 pour 10 % (et ainsi de suite) si vous trouvez que votre résultat OCR est incorrect.

À partir de là, nous allons charger + prétraiter notre image et initialiser les variables clés :

Notre image est chargée en mémoire et copiée (afin que nous puissions ensuite dessiner nos résultats de sortie dessus) sur Lignes 82 et 83.

Nous saisissons le original largeur et hauteur (Ligne 84) puis extraire le Nouveau largeur et hauteur du dictionnaire args (Ligne 88).

En utilisant à la fois les dimensions d'origine et les nouvelles dimensions, nous calculons les ratios utilisés pour mettre à l'échelle les coordonnées de notre cadre de délimitation plus tard dans le script (Lignes 89 et 90).

Notre image est ensuite redimensionnée, ignorer le rapport hauteur/largeur (Ligne 93).

Ensuite, travaillons avec le détecteur de texte EAST :

Nos deux noms de couche de sortie sont mis sous forme de liste sur Lignes 99-101. Pour savoir pourquoi ces deux noms de sortie sont importants, vous voudrez vous référer à mon didacticiel original de détection de texte EAST.

Ensuite, notre réseau de neurones EAST pré-entraîné est chargé en mémoire (Ligne 105).

Je ne saurais trop insister sur ce point : vous avez besoin d'OpenCV 3.4.2 au minimum pour avoir l'implémentation cv2.dnn.readNet.

Le premier bit de “magie” se produit ensuite :

Pour déterminer les emplacements de texte, nous :

  • Construire un blob sur Lignes 109 et 110. En savoir plus sur le processus ici.
  • Passez le blob à travers le réseau de neurones, en obtenant des scores et une géométrie (Lignes 111 et 112).
  • Décoder les prédictions avec la fonction decode_predictions définie précédemment (Ligne 116).
  • Appliquer la suppression non maximale via ma méthode imutils (Ligne 117). NMS prend efficacement les régions de texte les plus probables, éliminant les autres régions qui se chevauchent.

Maintenant que nous savons où les régions de texte sont, nous devons prendre des mesures pour reconnaître le texte! Nous commençons à parcourir les cadres de délimitation et traitons les résultats, préparant la scène pour reconnaissance de texte :

Nous initialisons la liste des résultats pour contenir nos cadres de délimitation OCR et le texte sur Ligne 120.

Ensuite, nous commençons à boucler sur les cases (Ligne 123) où nous:

  • Mettez à l'échelle les cadres de délimitation en fonction des rapports calculés précédemment (Lignes 126-129).
  • Remplissez les cadres de délimitation (Lignes 134-141).
  • Et enfin, extraire le roi rembourré (Ligne 144).

Notre pipeline OCR OpenCV peut être complété en utilisant un peu de Tesseract v4 “magic” :

Prenant note du commentaire dans le bloc de code, nous définissons nos paramètres de configuration Tesseract sur Ligne 151 (Anglais Langue, LSTM réseau de neurones et simple lignee du texte).

Noter: Vous devrez peut-être configurer la valeur --psm en utilisant mes instructions en haut de ce didacticiel si vous obtenez des résultats OCR incorrects.

La librairie pytesseract s'occupe du reste sur Ligne 152 où nous appelons pytesseract.image_to_string , en passant notre roi et config string .

? Boom! En deux lignes de code, vous avez utilisé Tesseract v4 pour reconnaître un retour sur investissement de texte dans une image. N'oubliez pas qu'il y a il se passe beaucoup de choses sous le capot.

Notre résultat (les valeurs de la zone de délimitation et la chaîne de texte réelle) sont ajoutés à la liste des résultats (Ligne 156).

Ensuite, nous continuons ce processus pour d'autres ROI en haut de la boucle.

Maintenant, affichons/imprimons les résultats pour voir si cela a réellement fonctionné :

Nos résultats sont triés de haut en bas sur Ligne 159 basé sur oui-coordonnée de la boîte englobante (bien que vous souhaitiez peut-être les trier différemment).

À partir de là, en parcourant les résultats, nous :

  • Imprimez le texte OCR sur le terminal (Lignes 164-166).
  • Supprimez les caractères non-ASCII du texte car OpenCV ne prend pas en charge les caractères non-ASCII dans la fonction cv2.putText (Ligne 171).
  • Dessinez (1) un cadre de délimitation entourant la ROI et (2) le texte du résultat au-dessus de la ROI (Lignes 173-176).
  • Affichez la sortie et attendez qu'une touche soit enfoncée (Lignes 179 et 180).

Résultats de la reconnaissance de texte OpenCV

Maintenant que nous avons implémenté notre pipeline OpenCV OCR, voyons-le en action.

Assurez-vous d'utiliser le "Téléchargements" section de cet article de blog pour télécharger le code source, le modèle de détecteur de texte OpenCV EAST et les exemples d'images.

À partir de là, ouvrez une ligne de commande, accédez à l'endroit où vous avez téléchargé + extrait le zip et exécutez la commande suivante :

Figure 4 : Notre premier essai d'OpenCV OCR est un succès.

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 terms. 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 et 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 all 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.


Paramètres

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). C'est la valeur par défaut.
  • 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). C'est la valeur par défaut.
  • 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. Information

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:

le 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.

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

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

Dans 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.

le La description 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 Developer. 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.

Currency

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

Clique sur le 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

Choisir 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 forme. 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

le Materials section contains the manufacturability checks and the pricing logic for all materials and finishes. The fields Nom, ID et 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. le La description 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. le 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 ou alors one week.

2.2.4. Manufacturability checks

Dans le 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 et le 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:


Voir la vidéo: Windev: Enregistrer les images dans la BDD VS Enregistrer les images dans un répertoire