[PYTHON] Créez un modèle d'échiquier pour l'étalonnage de la caméra

Postscript

J'ai déployé la logique suivante dans une application Web. Veuillez l'utiliser si vous le souhaitez. https://checkerboardwebapp.herokuapp.com/

Le cadre gratuit de Heroku est de 600 heures, il peut donc ne pas être possible de l'utiliser dans certains cas. Eh bien, ça ira. Je ne pense pas que quiconque l'utilisera. Je l'ai fait presque pour moi, donc c'est assez difficile. Ce n'est pas si bon, il est donc préférable d'utiliser l'OpenCV officiel ici.

introduction

Bonsoir Je fabrique généralement des carreaux en noir et blanc (motif échiquier) pour l'étalonnage à l'aide d'un logiciel appelé ARCAD. Il est difficile de le refaire à chaque fois que la taille de la tuile change, alors j'ai essayé de savoir si cela pouvait être fait facilement. Quand je l'ai recherché, il y avait une bibliothèque qui pouvait facilement dessiner des figures en PDF, alors je l'ai implémentée. On ne sait pas dans quelle mesure il peut être utilisé car il n'a pas été réellement imprimé et vérifié. Je vais probablement avoir la chance de l'utiliser souvent à l'avenir Je me suis demandé si je pourrais l'utiliser n'importe où si je le publiais en tant qu'application WEB.

Chose que tu veux faire

Je veux faire quelque chose comme ↓ en spécifiant la taille réelle (mm) image.png

environnement

python:3.8 Bibliothèque utilisée: reportlab

Créez des carreaux en noir et blanc pour l'étalonnage

J'ai implémenté le code de ↓

box_grid.py


#! /usr/bin/python
# -*- coding: utf-8 -*-
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A1, A2, A3, A4,landscape, portrait
from reportlab.lib.units import cm, mm

FILE_NAME = './box_grid_calibration.pdf'
#Verticale
VERTICAL_SIZE = 28
#côté
HORIZONTAL_SIZE = 19
#Position de départ
START_X = 10.0*mm
START_Y = 10.0*mm
#Taille carrée
RECT_SIZE = 10.0*mm

if __name__ == '__main__':
    #Portrait A4
    pdf_canvas = canvas.Canvas(FILE_NAME, pagesize=portrait(A4))
    #A4 sur le côté
    # pdf_canvas = canvas.Canvas(FILE_NAME, pagesize=landscape(A4))
    pdf_canvas.saveState()

    cnt_flag = True

    X, Y = START_X, START_Y
    #Dessin vertical
    for i in range(VERTICAL_SIZE):
        #Dessin horizontal
        for j in range(HORIZONTAL_SIZE):
            #Dessinez alternativement le blanc et le noir
            pdf_canvas.setFillColorRGB(255, 255, 255) if cnt_flag else pdf_canvas.setFillColorRGB(0, 0, 0)
            pdf_canvas.rect(X, Y, RECT_SIZE, RECT_SIZE, stroke=0, fill=1)
            #Décaler la position X
            X += RECT_SIZE
            #Inversion du drapeau
            cnt_flag = not cnt_flag

        #S'il est pair, le noir et le blanc n'alternent pas, le drapeau est donc inversé une fois.
        if HORIZONTAL_SIZE % 2 == 0:
            cnt_flag = not cnt_flag

        #Revenir au point de départ de la coordonnée X
        X = START_X
        #Décaler la position Y
        Y += RECT_SIZE

    pdf_canvas.restoreState()
    pdf_canvas.save()

Une fois exécuté, here sera créé.

FILE_NAME = './box_grid_calibration.pdf'
#Verticale
VERTICAL_SIZE = 28
#côté
HORIZONTAL_SIZE = 19
#Position de départ
START_X = 10.0*mm
START_Y = 10.0*mm
#Taille carrée
RECT_SIZE = 10.0*mm

Je ne pense pas que cela nécessite une explication, mais les éléments ci-dessus déterminent le nombre de lignes, le nombre de colonnes, la position de départ du dessin et la taille de la tuile. En guise de mise en garde, reportlab semble avoir des coordonnées d'origine différentes des images normales, Il semble que l'axe Y devient positif vers le haut de l'origine inférieure gauche. L'axe X est le même. L'image est ci-dessous. Axe Y ↑ | | ● --- → axe X

J'ai également créé une version alternative et alignée de la version circulaire.

<détails> <résumé> Modèle alterné </ résumé>

circle_grid.py


#! /usr/bin/python
# -*- coding: utf-8 -*-
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A1, A2, A3, A4,landscape, portrait
from reportlab.lib.units import cm, mm

FILE_NAME = './circle_grid_calibration.pdf'
#Verticale
VERTICAL_SIZE = 28
#côté
HORIZONTAL_SIZE = 19
#Position de départ
START_X = 10.0*mm
START_Y = 10.0*mm
#Taille du rayon circulaire
RADIUS = 5.0*mm

if __name__ == '__main__':
    #Portrait A4
    pdf_canvas = canvas.Canvas(FILE_NAME, pagesize=portrait(A4))
    #A4 sur le côté
    # pdf_canvas = canvas.Canvas(FILE_NAME, pagesize=landscape(A4))
    pdf_canvas.saveState()

    cnt_flag = True

    X, Y = START_X, START_Y
    #Dessin vertical
    for i in range(VERTICAL_SIZE):
        #Dessin horizontal
        for j in range(HORIZONTAL_SIZE):
            #Dessinez alternativement le blanc et le noir
            pdf_canvas.setFillColorRGB(255, 255, 255) if cnt_flag else pdf_canvas.setFillColorRGB(0, 0, 0)
            pdf_canvas.circle(X, Y, RADIUS, stroke=0, fill=1)
            #Décaler la position X
            X += RADIUS * 2
            #Inversion du drapeau
            cnt_flag = not cnt_flag

        #S'il est pair, le noir et le blanc n'alternent pas, le drapeau est donc inversé une fois.
        if HORIZONTAL_SIZE % 2 == 0:
            cnt_flag = not cnt_flag

        #Revenir au point de départ de la coordonnée X
        X = START_X
        #Décaler la position Y
        Y += RADIUS * 2

    pdf_canvas.restoreState()
    pdf_canvas.save()

J'ai couru ici

<détails>

Modèle d'alignement </ summary>

circle_grid2.py


#! /usr/bin/python
# -*- coding: utf-8 -*-
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A1, A2, A3, A4,landscape, portrait
from reportlab.lib.units import cm, mm

FILE_NAME = './circle_grid2_calibration.pdf'
#Verticale
VERTICAL_SIZE = 19
#côté
HORIZONTAL_SIZE = 13
#Position de départ
START_X = 10.0*mm
START_Y = 10.0*mm
#Taille du rayon circulaire
RADIUS = 5.0*mm

if __name__ == '__main__':
    #Portrait A4
    pdf_canvas = canvas.Canvas(FILE_NAME, pagesize=portrait(A4))
    #A4 sur le côté
    # pdf_canvas = canvas.Canvas(FILE_NAME, pagesize=landscape(A4))
    pdf_canvas.saveState()

    cnt_flag = True

    X, Y = START_X, START_Y
    #Dessin vertical
    for i in range(VERTICAL_SIZE):
        #Dessin horizontal
        for j in range(HORIZONTAL_SIZE):
            #Ne rien faire si c'est pair
            if not cnt_flag:
                #Inversion du drapeau
                cnt_flag = not cnt_flag
                continue
            #Set noir
            pdf_canvas.setFillColorRGB(0, 0, 0)
            pdf_canvas.circle(X, Y, RADIUS, stroke=0, fill=1)
            #Décaler la position X
            X += RADIUS * 3

        #Revenir au point de départ de la coordonnée X
        X = START_X
        #Décaler la position Y
        Y += RADIUS * 3

    pdf_canvas.restoreState()
    pdf_canvas.save()

J'ai couru ici

URL / source de référence

https://kuratsuki.net/2018/06/python-3-%E3%81%AE-reportlab-%E3%81%A7-pdf-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B/ https://symfoware.blog.fc2.com/blog-entry-769.html Merci pour l'URL ci-dessus.

Recommended Posts

Créez un modèle d'échiquier pour l'étalonnage de la caméra
Créer une boîte à Tweet pour Pepper
Calibrage de la caméra
Comment faire un test unitaire Part.1 Modèle de conception pour l'introduction
Qt pour l'application de bureau de l'application Python
Cours ROS 107 Créer un client pour rosblidge
Faisons un plug-in backend pour Errbot
Créer un bot pour Skype sur EC2 (CentOS)
Faire un histogramme pour le moment (matplotlib)
Faites pour VB6.
Faisons un module pour Python en utilisant SWIG
Supplément à "Calibration de la caméra" des didacticiels OpenCV-Python
[Pour jouer] Essayez de faire de Yuma un robot LINE (Python)
Faisons un jeu de squash
Faire une matrice de distance
Je vais créer un mot de passe!
Comprendre visuellement l'étalonnage de la caméra
Créer un bouton Nyan
Créez un jeu à la Tetris!
Créer un décodeur Base64
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
Comment créer un package Python (écrit pour un stagiaire)