系统环境:
ubuntu14.04
python2.7.6
opencv3
1、图像读取
The AT&T Facedatabase(http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html)又称ORL人脸数据库,40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)
1 #coding=utf-8
2
3 import cv2
4
5 # 读取照片信息, OpenCV目前支持bmp、jpg、jpeg、png、pbm、pgm、ppm、ras、tiff、tif等格式
6 imgPath = "/home/shuifu/bagfiles/image_video/s1/1.pgm"
7 img = cv2.imread(imgPath)
8
9 # 创建一个叫image的窗口
10 cv2.namedWindow("Image")
11
12 # 在创建的窗口中显示图像
13 cv2.imshow("Image", img)
14
15 # 如果不添加,在IDLE执行窗口直接无响应。在命令行中执行的话,则是一闪而过。
16 cv2.waitKey(0)
17
18
19 # 释放窗口
20 cv2.destroyAllWindows()
2、图像的创建/复制
1 #coding=utf-8
2
3 import cv2
4 import numpy as np
5
6 imgPath = "/home/shuifu/bagfiles/Image/xalg001.jpg"
7
8 # 读取图片
9 img = cv2.imread(imgPath)
10
11 # 新opencv没有CreateImage接口,即没有cv2.CreateImage这样的函数,使用numpy函数
12 # 图像使用NumPy数组的属性来表示图像的尺寸和通道信息。
13 # 输出img.shape将得到(500,375,3),最后的3表示这是一个RGB图像
14 emptyImage = np.zeros(img.shape, np.uint8)
15
16 # 也可以复制原有的图像获得一副新图像
17 emptyImage2 = img.copy()
18
19 # 还可以用cvtColor获得原图像的副本
20 emptyImage3 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
21 # emptyImage3[...]=0是将其转成空白的黑色图像
22
23 # 显示图片
24 cv2.imshow("Image", img)
25 cv2.imshow("EmptyImage", emptyImage)
26 cv2.imshow("EmptyImage2", emptyImage)
27 cv2.imshow("EmptyImage3", emptyImage)
28
29 # 保存图像
30 # 第一个参数是保存的路径及文件名, 第二个参数是图像矩阵
31 # 第三个是可选参数,针对特定格式:对于JPEG,其表示的是图像的质量,用0-100的整数表示,默认为95。
32 # 注意,cv2.IMWRITE_JPEG_QUALITY类型为long,必须转换成int
33 # 对于PNG,第三个参数表示压缩级别,从0-9压缩级别,级别越高,图像尺寸越小。默认级别为3。
34 cv2.imwrite("/home/shuifu/bagfiles/Image/xalg_zp_01.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 5])
35 cv2.imwrite("/home/shuifu/bagfiles/Image/xalg_zp_02.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
36 cv2.imwrite("/home/shuifu/bagfiles/Image/xalg_zp_01.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
37 cv2.imwrite("/home/shuifu/bagfiles/Image/xalg_zp_02.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
38
39 cv2.waitKey(0)
40
41 cv2.destroyAllWindows()
3、保存视频
1 #coding=utf-8
2
3 import cv2
4
5 # VideoCapture()函数定义摄像头对象,其参数0表示第一个摄像头
6 capture = cv2.VideoCapture(0)
7
8 # 设置图片格式
9 # 将capture保存为motion-jpeg, cv_fourcc为保存格式
10 # Motion JPEG(MJPEG,Motion Joint Photographic Experts Group,FourCC:MJPG)是一种视频压缩格式,其中每一帧图像都分别使用JPEG编码
11 # size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)) )
12 capture.set(3, 640)
13 capture.set(4, 480)
14 capture.set(1, 10.0)
15
16 # cv_fourcc值要设置对, 不然无法写入, 而且不报错
17 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
18
19 # 第三个参数则是镜头快慢的,10为正常,小于10为慢镜头
20 video = cv2.VideoWriter("/home/shuifu/bagfiles/Video/myVideo.avi", fourcc, 10, (640, 480))
21
22 # isOpened验证摄像头是否开启
23 while (capture.isOpened()):
24 ret, frame = capture.read()
25 if ret == True:
26 # 图片操作cv2.flip(img, flipcode)翻转图像
27 # flipcode =0 沿x轴翻转;>0 沿y轴翻转;<0 x,y轴同时翻转
28 frame = cv2.flip(frame, 1)
29
30 # 获取gray图片
31 # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
32
33 # 视频中的图片一张张写入
34 video.write(frame)
35
36 # 显示图片
37 cv2.imshow("frame", frame)
38
39 # ord为键盘输入对应的整数
40 if cv2.waitKey(1) & 0xFF == ord("q"):
41 break
42 else:
43 break
44
45 # 如果不用release方法的话无法存储, 要等结束程序再等摄像头关了才能显示保持成功
46 video.release()
47
48 # 关闭摄像头,关闭窗口
49 capture.release()
50 cv2.destroyAllWindows()
4、摄像头拍照
1
2 import cv2
3
4 capture = cv2.VideoCapture(0)
5
6 num = 0
7 while(capture.isOpened() and num < 5):
8 # get a frame
9 ret, frame = capture.read()
10 # show a frame
11 cv2.imshow("capture", frame)
12 if cv2.waitKey(1) & 0xFF == ord("q"):
13 num += 1
14 cv2.imwrite("/home/shuifu/bagfiles/image_video/s41/test%s.jpeg"%(str(num)) , frame)
15 continue
16
17 capture.release()
18 cv2.destroyAllWindows()
5、自己人脸数据收集
读取图片
img=cv2.imread(image_name)
显示图片
cv2.imshow("This is a window!", img) # img为上面读取图片的句柄
灰度转换
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # img为上面读取图片的句柄
画图
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
参数:
img -> Image
pt1 -> Vertex of the rectangle
pt2 -> Vertex of the rectangle opposite to pt1
color -> Rectangle color or brightness(grayscale image)
保存图片
cv2.imwrite(filename, image[, params])
等待输入
cv2.waitKey(delay)
功能:waitKey等待一个键盘输入事件,如果delay的值小于等于0,则无限等待,如果delay的值大于0,则等待delay(毫秒)
1 #coding=utf-8
2
3 import cv2
4
5 # 识别人脸
6 def detectFaces(image_name):
7 # 读取图片
8 img = cv2.imread(image_name)
9
10 # 获取训练好的人脸的参数数据,这里直接使用opencv默认值
11 # 脸部特征分类地址
12 cascade_fn = "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml"
13 # 读取分类器
14 face_cascade = cv2.CascadeClassifier(cascade_fn)
15
16 # if语句:如果img维度为3,说明不是灰度图,先转换为灰度图gray,如果不为3,也就是2,原图就是灰度图
17 if img.ndim == 3:
18 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
19 else:
20 gray = img
21
22 # 探测人脸
23 faces = face_cascade.detectMultiScale( # faces表示检测到的人脸目标序列
24 gray, # gray表示的是要检测的输入图像为gray
25 scaleFactor = 1.15, # 表示每次图像尺寸减小的比例为1.15
26 minNeighbors = 5, # 表示每一个目标至少要被检测到4次才算是真的目标(因为周围的像素和窗口大小都可以检测到人脸)
27 minSize = (5, 5), # 目标的最小最大尺寸
28 flags = cv2.CASCADE_SCALE_IMAGE # 表示不是缩放分类器来检测,而是缩放图像
29 )
30
31 result = []
32 for(x, y, width, height) in faces:
33 result.append((x, y, x + width, y + height))
34 return result
35
36 def drawFaces(image_name):
37 print("hello image_name")
38 faces = detectFaces(image_name)
39 if faces:
40 img = cv2.imread(image_name)
41 print("hello img_new_name")
42 for(x1, y1, x2, y2) in faces:
43 cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 0))
44 # img_new_name = "/home/shuifu/bagfiles/Image/new_image.jpg"
45 # cv2.imwrite(img_new_name, img)
46 # 显示图像
47 # image = cv2.imread(img_new_name)
48 cv2.imshow("Find Faces!", img)
49 cv2.imwrite("/home/shuifu/bagfiles/Image/new_image.jpg",img)
50 cv2.waitKey(0)
51 else:
52 print("not found faces")
53
54 if __name__ == "__main__":
55 imgPath = "/home/shuifu/bagfiles/Image/005.jpg"
56 drawFaces(imgPath)
1 #coding=utf-8
2
3 import cv2
4
5 def camera():
6 capture = cv2.VideoCapture(0)
7 index = 1
8 while capture.isOpened():
9 # 返回一个元组,retval和image,retval是用来检查是否读入成功
10 ok, frame = capture.read()
11 if not ok:
12 break
13 else:
14 cv2.imshow("myPicture", frame)
15 # 转为灰度图
16 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
17 # 改变图片大小
18 dst = cv2.resize(gray, (92, 112))
19 key = cv2.waitKey(100)
20 # a拍照
21 if key & 0xFF == ord("a"):
22 filename = "/home/shuifu/bagfiles/image_video/s41/%d.pgm"%index
23 index += 1
24 cv2.imwrite(filename, dst)
25 # q推出
26 elif key & 0xFF == ord("q"):
27 break
28 else:
29 continue
30 capture.release()
31 cv2.destroyAllWindows()
32
33 if __name__ == "__main__":
34 camera()
1 #coding=utf-8
2
3 def createFile():
4 # Information
5 info = "/home/shuifu/bagfiles/image_video/s{0}/{1}.pgm;{2}\n"
6
7 # Input filename
8 name = raw_input("Enter file name:")
9
10 filename = "/home/shuifu/bagfiles/%s"%name
11
12 fp = open(filename, "w")
13
14 for i in range(1, 42):
15 for j in range(1, 11):
16 fp.write(info.format(i, j, i-1))
17
18 fp.close()
19
20 if __name__ == "__main__":
21 createFile()
备注参考:
http://blog.youkuaiyun.com/sunny2038/article/details/9057415
http://blog.youkuaiyun.com/xingchenbingbuyu/article/details/51386949
http://blog.youkuaiyun.com/HUSTcanpi/article/details/50625533
http://blog.youkuaiyun.com/xwm1000/article/details/71788344