opencv学习

本文详细介绍如何使用Python和OpenCV进行图像和视频处理,包括图像读取、展示、保存,视频录制,摄像头拍照,以及人脸检测等核心功能,并提供具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统环境:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值