Idea de Proyecto (Realidad Aumentada – Detección y Estimación de Código ARuco)

Idea de Proyecto : Un proyecto basado en el escaneo y detección de códigos Aruco. Implementación de Homografía para la estimación de parámetros de calibración de cámara intrínsecos y extrínsecos e inclusión de Estimación de Pose para la implementación de proyectos de Realidad aumentada en futuros proyectos. Para la visita de detección de código Qr: este enlace
Para más proyectos, visite: Códigos Sahil Khosla  
Aruco – Códigos uco de realidad aumentada 
Estos son los marcadores especiales de realidad aumentada que tienen un número de identificación único dentro de ellos. Estos marcadores se decodifican en serialización binaria y se pueden decodificar tanto manualmente como por computadora. El marcador ArUco es una cuadrícula de 5×5 que es de color blanco y negro. Los marcadores ArUco se basan en el código Hamming. En la cuadrícula, las columnas primera, tercera y quinta representan bits de paridad. Las columnas segunda y cuarta representan los bits de datos. Por lo tanto, hay diez bits de datos totales. Entonces, el número máximo de marcadores que se pueden codificar son:
2^10 = 1024
Las características principales de ArUco son:
1. Detecta marcadores con una sola línea de código C++. 
2. Detecta varios diccionarios: ARUCO, AprilTag, ArToolKit+, ARTAG, CHILITAGS. 
3. Más rápido que cualquier otra biblioteca para la detección de marcadores 
4. Pocas dependencias OpenCV (>=2.4.9) y eigen3 (incluido en la biblioteca). 
5. Detección de Mapas de Marcadores (varios marcadores). 
6. Integración trivial con OpenGL y OGRE. 
7. Rápido, confiable y multiplataforma porque se basa en OpenCV. 
8. Ejemplos que lo ayudarán a ejecutar su aplicación AR en menos de 5 minutos. 
9. Calibre su cámara usando Aruco ChessBoard 
Referencia a la biblioteca aruco
Instalación 
1. Instale openCV 
2. Instale la biblioteca numpy 
3. Instale la biblioteca Aruco
Asegúrese de tener python instalado en el sistema ubuntu  Ejecute
el código 
Abra la terminal y escriba 
->python aruco_poseEstimation.py
 

Python

# importing required libraries
import sys
import os
import cv2
from cv2 import aruco
import numpy as np
 
# to start real-time feed
cap = cv2.VideoCapture(0)
 
# importing aruco dictionary
dictionary = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_250)
 
# calibration parameters
calibrationFile = "calibrationFileName.xml"
calibrationParams = cv2.FileStorage(calibrationFile, cv2.FILE_STORAGE_READ)
camera_matrix = calibrationParams.getNode("cameraMatrix").mat()
dist_coeffs = calibrationParams.getNode("distCoeffs").mat()
 
r = calibrationParams.getNode("R").mat()
new_camera_matrix = calibrationParams.getNode("newCameraMatrix").mat()
 
 
aruco_dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_250 )
markerLength = 0.25   # Here, our measurement unit is centimetre.
arucoParams = cv2.aruco.DetectorParameters_create()
 
def cameraPoseFromHomography(H):
    H1 = H[:, 0]
    H2 = H[:, 1]
    H3 = np.cross(H1, H2)
 
    norm1 = np.linalg.norm(H1)
    norm2 = np.linalg.norm(H2)
    tnorm = (norm1 + norm2) / 2.0;
 
    T = H[:, 2] / tnorm
    return np.mat([H1, H2, H3, T])
 
def draw(img, corners, imgpts):
    imgpts = np.int32(imgpts).reshape(-1, 2)
 
    # draw ground floor in green
    img = cv2.drawContours(img, [imgpts[:4]], -1, (0, 255, 0), -3)
 
    # draw pillars in blue color
    for i, j in zip(range(4), range(4, 8)):
        img = cv2.line(img, tuple(imgpts[i]), tuple(imgpts[j]), (255), 3)
 
    # draw top layer in red color
    img = cv2.drawContours(img, [imgpts[4:]], -1, (0, 0, 255), 3)
    return img
 
while True:
  
   # Capture frame-by-frame
    ret, frame = cap.read()
    size = frame.shape
 
 
    # print size
    # Our operations on the frame come here
    # aruco.detectMarkers() requires gray image
    imgRemapped_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  
    
    avg1 = np.float32(imgRemapped_gray)
    avg2 = np.float32(imgRemapped_gray)
 
    # Detect aruco
    res = cv2.aruco.detectMarkers(imgRemapped_gray, aruco_dict, parameters = arucoParams)
    imgWithAruco = imgRemapped_gray  # assign imRemapped_color to imgWithAruco directly
    if len(res[0]) > 0:
    print res[0]
 
    # Corner detection       
    # print res[0][0][0][0][0], " ", res[0][0][0][0][1]
        # print res[0][0][0][1][0], " ", res[0][0][0][1][1]
        # print res[0][0][0][2][0], " ", res[0][0][0][2][1]
        # print res[0][0][0][3][0], " ", res[0][0][0][3][1]
 
    # converting corners to pixel
    x1 = (res[0][0][0][0][0], res[0][0][0][0][1])
        x2 = (res[0][0][0][1][0], res[0][0][0][1][1])
    x3 = (res[0][0][0][2][0], res[0][0][0][2][1])
    x4 = (res[0][0][0][3][0], res[0][0][0][3][1])
 
    # Drawing detected frame white color
    cv2.line(imgWithAruco, x1, x2, (255, 0, 0), 2)
    cv2.line(imgWithAruco, x2, x3, (255, 0, 0), 2)
    cv2.line(imgWithAruco, x3, x4, (255, 0, 0), 2)
    cv2.line(imgWithAruco, x4, x1, (255, 0, 0), 2)
 
    # font type hershey_simplex
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(imgWithAruco, 'Corner 1', x1, font, 1, (255, 255, 255), 2, cv2.LINE_AA)
    cv2.putText(imgWithAruco, 'Corner 2', x2, font, 1, (255, 255, 255), 2, cv2.LINE_AA)
    cv2.putText(imgWithAruco, 'Corner 3', x3, font, 1, (255, 255, 255), 2, cv2.LINE_AA)
    cv2.putText(imgWithAruco, 'Corner 4', x4, font, 1, (255, 255, 255), 2, cv2.LINE_AA)
     
 
    # Camera internals
    focal_length = size[1]
    center = (size[1]/2, size[0]/2)
    camera_matrix = np.array(
                             [[focal_length, 0, center[0]],
                             [0, focal_length, center[1]],
                             [0, 0, 1]], dtype = "double"
                             )
 
        if res[1] != None: # if aruco marker detected
        im_src = imgWithAruco
        im_dst = imgWithAruco
         
        pts_dst = np.array([[res[0][0][0][0][0], res[0][0][0][0][1]], [res[0][0][0][1][0], res[0][0][0][1][1]], [res[0][0][0][2][0], res[0][0][0][2][1]], [res[0][0][0][3][0], res[0][0][0][3][1]]])
        pts_src = pts_dst
        h, status = cv2.findHomography(pts_src, pts_dst)
 
        imgWithAruco = cv2.warpPerspective(im_src, h, (im_dst.shape[1], im_dst.shape[0]))
 
        rvec, tvec, _ = cv2.aruco.estimatePoseSingleMarkers(res[0], markerLength, camera_matrix, dist_coeffs)
 
        imgWithAruco = cv2.aruco.drawAxis(imgWithAruco, camera_matrix, dist_coeffs, rvec, tvec, 10)
        cameraPose = cameraPoseFromHomography(h)
         
 
    cv2.imshow("aruco", imgWithAruco)   # display
     
     # if 'q' is pressed, quit.
    if cv2.waitKey(2) & 0xFF == ord('q'): 
            break

Publicación traducida automáticamente

Artículo escrito por sahilkhoslaa y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *