Documentos de Académico
Documentos de Profesional
Documentos de Cultura
import numpy as np
import cv2 as cv2
import glob
DIMX=9
DIMY=6
square_size=25
# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
,→o bananos")
print(objp)
# Matrices para almacenar puntos de objeto y puntos de imagen de todas las␣
,→imágenes.
images = glob.glob('/content/images/*.jpg')
1
ret, corners = cv2.findChessboardCorners(gray, (DIMX,DIMY),None)
if ret == True:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
imgpoints.append(corners2)
cv2.destroyAllWindows()
cv2.waitKey(1)
#print(imgpoints)
print(mtx)
print(type(mtx))
print(dist)
print(type(dist))
# termina la calibración
img = cv2.imread('/content/images/15.jpg')
h, w = img.shape[:2]
newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h))
# no distorsionar
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
# recortar la imagen
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult1.png',dst)
# no distorsionar
mapx,mapy = cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5)
2
dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)
# recortar la imagen
x,y,w,h = roi
#dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult2.png',dst)
mean_error = 0
for i in range(len(objpoints)):
imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx,␣
,→dist)
se crea los puntos origen note la escala que es 1 en este caso aca se multiplica
por el tamanio del rectangulo en milimetros, metros, centimetros o bananos
[[ 0. 0. 0.]
[ 25. 0. 0.]
[ 50. 0. 0.]
[ 75. 0. 0.]
[100. 0. 0.]
[125. 0. 0.]
[150. 0. 0.]
[175. 0. 0.]
[200. 0. 0.]
[ 0. 25. 0.]
[ 25. 25. 0.]
[ 50. 25. 0.]
[ 75. 25. 0.]
[100. 25. 0.]
[125. 25. 0.]
[150. 25. 0.]
[175. 25. 0.]
[200. 25. 0.]
[ 0. 50. 0.]
[ 25. 50. 0.]
[ 50. 50. 0.]
[ 75. 50. 0.]
[100. 50. 0.]
[125. 50. 0.]
[150. 50. 0.]
[175. 50. 0.]
[200. 50. 0.]
3
[ 0. 75. 0.]
[ 25. 75. 0.]
[ 50. 75. 0.]
[ 75. 75. 0.]
[100. 75. 0.]
[125. 75. 0.]
[150. 75. 0.]
[175. 75. 0.]
[200. 75. 0.]
[ 0. 100. 0.]
[ 25. 100. 0.]
[ 50. 100. 0.]
[ 75. 100. 0.]
[100. 100. 0.]
[125. 100. 0.]
[150. 100. 0.]
[175. 100. 0.]
[200. 100. 0.]
[ 0. 125. 0.]
[ 25. 125. 0.]
[ 50. 125. 0.]
[ 75. 125. 0.]
[100. 125. 0.]
[125. 125. 0.]
[150. 125. 0.]
[175. 125. 0.]
[200. 125. 0.]]
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[[967.74391241 0. 464.42978024]
[ 0. 968.10983863 349.95350063]
[ 0. 0. 1. ]]
<class 'numpy.ndarray'>
[[-2.49145534e-01 2.07985201e+00 -9.84672028e-03 -1.03043826e-03
-5.66350004e+00]]
<class 'numpy.ndarray'>
total error: 0.04244428419510854
matriz inversa
20
-5.66350004e+00]]
<class 'numpy.ndarray'>
1 Punto 3
[ ]: import numpy as np
import cv2
DIM = (1280,720)
K = mtx
#np.array([[967.743914, 0.0, 464.4242978016], [0.0, 968.10984015, 349.
,→953550106], [0.0, 0.0, 1.0]])
cap = cv2.VideoCapture(0)
while True:
flag, img = cap.read()
try:
map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, np.eye(3), K,␣
,→DIM, cv2.CV_16SC2)
cv2.imshow('result', calibrated)
except:
cap.release()
raise
k = cv2.waitKey(30)
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
El anterior codigo permite realizar una aplicación que des-distorsione un streaming de video,
donde los resultados son los podemos observar a continuación:
21
[ ]: import cv2
from google.colab.patches import cv2_imshow
img = cv2.imread('/content/1.png')
img2 = cv2.imread('/content/2.png')
print('Resultado 1')
cv2_imshow(img)
Resultado 1
[ ]: print('Resultado 2')
cv2_imshow(img2)
Resultado 2
22
Punto 4 #Realidad aumentada
[ ]: import numpy as np
import cv2
import glob
cap = cv2.VideoCapture(0)
images = glob.glob('/Users/aaronsantiagopedrazacardenas/Desktop/Augmented␣
,→Reality/images/*.jpg') #todas las imágenes jpg de la carpeta se pueden␣
,→mostrar
currentImage = 1
replaceImg=cv2.imread(images[currentImage])
rows,cols,ch = replaceImg.shape
pts1 = np.float32([[0,0],[cols,0],[cols,rows],[0,rows]]) #estos puntos son␣
,→necesarios para la transformación
maskThreshold=10
while(True):
# Captura fotograma a fotograma
ret, img = cap.read()
23
# Nuestras operaciones en el marco vienen aquí
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Esta función se usa para detectar las esquinas del tablero de ajedrez, 9x6␣
,→es el número de esquinas a encontrar
dst = cv2.warpPerspective(replaceImg,M,(cols,rows))
#Se crea una máscara para agregar las dos imágenes.
#El umbral de máscara es una variable porque permite restar el fondo␣
,→negro de diferentes imágenes.
#decidir la acción en función del valor clave (salir, hacer zoom, cambiar␣
,→la imagen)
24
if key == ord('z'): # + aumentar zoom
zoomLevel=zoomLevel+0.05
rows,cols,ch = replaceImg.shape
pts1 = np.float32([[0,0],[cols,0],[cols,rows],[0,rows]])
pts1 = pts1 + np.
,→float32([[zoomLevel*cols,zoomLevel*rows],[-zoomLevel*cols,zoomLevel*rows],[-zoomLevel*cols,-
print('Zoom in')
if key == ord('x'): # - disminuir zoom
zoomLevel=zoomLevel-0.05
rows,cols,ch = replaceImg.shape
pts1 = np.float32([[0,0],[cols,0],[cols,rows],[0,rows]])
pts1 = pts1 + np.
,→float32([[zoomLevel*cols,zoomLevel*rows],[-zoomLevel*cols,zoomLevel*rows],[-zoomLevel*cols,-
25
print ('Decrease Mask Threshold')
else:
print ('Mask Threshold at the minimun value')
26
[ ]: import cv2
from google.colab.patches import cv2_imshow
img2 = cv2.imread('/content/iron-zoom.png')
img4 = cv2.imread('/content/logo.png')
img5 = cv2.imread('/content/playa.png')
print('Casco Iron man con zoom')
cv2_imshow(img2)
[ ]: img3 = cv2.imread('/content/ironman.png')
print('Casco Iron man sin zoom')
cv2_imshow(img3)
27
[ ]: print('Logo Opencv')
cv2_imshow(img4)
Logo Opencv
28
[ ]: print('Playa')
cv2_imshow(img5)
Playa
29