opencv学习

来源:互联网 发布:淘宝查看vip等级 编辑:程序博客网 时间:2024/06/16 09:03

系统环境:
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.csdn.net/sunny2038/article/details/9057415
http://blog.csdn.net/xingchenbingbuyu/article/details/51386949
http://blog.csdn.net/HUSTcanpi/article/details/50625533
http://blog.csdn.net/xwm1000/article/details/71788344