本项目先修课程包括 python基本语法,矩阵分析
本项目主要内容包括 常用库介绍,单应性变换,照相机模型,增强现实,三维重建,图像聚类,图像搜索, 图像搜索,图像识别与跟踪
识别:detection, tracking, recognition, image-search 重建:3D-Reconstruction, AR
from PIL import Image
import numpy as np
from pylab import *
# 读取图片
p = Image.open('gerrard.jpg')
# 图片尺寸
print p.size
# 读取图片并转换为灰度图
p = Image.open('gerrard.jpg').convert('L')
# 读取图片到数组
arr = np.array(p_gray)
# show image
p.show()
gray()
imshow(arr)
show()
# 创建缩略图, resize, rotate
p.thumbnail((80, 80))
resizedP = p.resize((80, 80))
rotatedP = p.rotate(45)
# 裁剪
p = Image.open('gerrard.jpg')
p.crop((50,0,150,150)).show()
# 旋转并黏贴
p_rotated_crop = p.crop((50,0,150,150)).transpose(Image.ROTATE_180)
p.paste(p_rotated_crop, box)图像模糊就是将图像和一个高斯核进行卷积操作
from scipy.ndimage import filters
im = array(Image.open('gerrard.jpg').convert('L'))
im2 = filters.gaussian_filters(im,5)
Image.fromarray(im2).show()梯度
imx, imy = np.zeros(im.shape), np.zeros(im.shape)
filters.sobel(im, 1, imx)
filters.sobel(im, 0, imy)
map(lambda arr : Image.fromarray(arr).show(), [imx, imy, np.sqrt(imx**2, imy**2)])import cv2
myimg=cv2.imread('sky.jpg')
img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY)
newimg=cv2.equalizeHist(img)
cv2.imshow('src',img)
cv2.imshow('dst',newimg)在给定的图片中找到人脸
face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml')
img = cv2.imread('blacklaker.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.5, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)在摄像头捕获的实时视频中识别人脸
def detect(img, cascade):
faces = cascade.detectMultiScale(img, 1.3, 4, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
if len(faces) == 0:
return []
faces[:,2:] += faces[:,:2]
return faces
def draw_rects(img, rects, color):
for x1, y1, x2, y2 in rects:
cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
cascade = cv2.CascadeClassifier("./haarcascades/haarcascade_frontalface_alt.xml")
cam = cv2.VideoCapture(0)
while True:
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray)
rects = detect(gray, cascade)
vis = img.copy()
draw_rects(vis, rects, (0, 255, 0))
cv2.imshow('facedetect', vis)
if cv2.waitKey(5) == 27:
break
cv2.destroyAllWindows()单应性变换是指将平面内的点映射到另一个平面内的二维投影变换。常用于图像配准,图像纠正和纹理扭曲,以及创建全景图像。
求解H矩阵共有8个自由度,而每一组点都可以列出两条方程,所以,只要有四组点,就可以找到对应的变换矩阵
仿射变换包含了一个可逆矩阵和一个平移向量,可以用于很多应用,比如图像扭曲
求解仿射变换的H矩阵的时候,只有六个自由度,所以,我们只要知道三个对应点,就可以求出H。
相似变化,如下,当s=1时,称为刚体变换 $$\left[ \begin{matrix} x' \ y' \ 1 \end{matrix} \right] = \left[ \begin{matrix} scos(\theta) & -ssin(\theta) & t_x \ ssin(\theta) & scos(\theta) & t_y \ 0 & 0 & 1 \ \end{matrix} \right]\left[ \begin{matrix} x \ y \ 1 \end{matrix} \right] $$
from scipy import ndimage
im = np.array(Image.open('gerrard.jpg').convert('L'))
H = np.array([[1.7, .3, -100], [.3, 1.8, -100], [0, 0, 1]])
im2 = ndimage.affine_transform(im, H[:2, :2], (H[0,2], H[1,2]))
figure()
gray()
imshow(im)
figure()
gray()
imshow(im2)
show()把一张图片插入另一张图片中的特定位置(需要进行一些缩放,平移,旋转,扭曲)
$$\lambda x = PX&& 将三维的点X投影为二维图像点x,P为一个3*4的矩阵(称为照相机矩阵或者投影矩阵)
相机矩阵可以分解为
import camera
points = np.loadtxt('house.p3d').T
points = np.vstack((points, np.ones(points.shape[1])))
P = np.array([[1,0,0,0],[0,1,0,0],[0,0,1,-10]])
cam = camera.Camera(P)
x = cam.project(points)
plot(x[0],x[1], 'k.')
show()尝试旋转照相机,看看投影的变化轨迹。
相机标定的过程对于CV非常重要,其本质就是求出照相机内标定矩阵的过程。内标定矩阵主要由照相机的光心位置和焦距来决定。很多时候我们假定光心位于图像的中心。获得正确的焦距则比较复杂,需要进行精确测量。