1.安装opencv库:pip install opencv-python
2.基础使用范例
python
import cv2
#图片的基本操作#
'''
1.读取一张图片
参数 1:图片的文件名
如果图片放在当前文件夹下,直接写文件名就行,如'lena.jpg'
否则需要给出绝对路径,如'D:\OpenCVSamples\lena.jpg'
参数 2:读入方式,省略即采用默认值
cv2.IMREAD_COLOR:彩色图,默认值(1)
cv2.IMREAD_GRAYSCALE:灰度图(0)
cv2.IMREAD_UNCHANGED:包含透明通道的彩色图(-1)
'''
img = cv2.imread("D:/a.png")
#颜色转换为灰度图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#先定义窗口
#cv2.namedWindow('face', cv2.WINDOW_NORMAL)
# 2.显示图片
cv2.imshow('img', img)
cv2.imshow('gray',img_gray)
cv2.waitKey(0)
#获取图片属性
print(img.size)
print(img.shape)
#获取脸部ROI
# face=img[89:92,180:157]
# cv2.imshow('gg',face)
# cv2.waitKey(0)
#通道分隔与合并
# b,g,r= cv2.split(img)
# img=cv2.merge(b,g,r)
#b = img[:,0]
#cv2.imshow('blue',b)
#cv2.waitKey(0)
# 3.保存图片
#cv2.imwrite("D:/face.png", b)
print('save img success!')
import cv2
#打开摄像头#
#1.打开摄像头,并灰度显示
capture=cv2.VideoCapture(0)
# 获取捕获的分辨率
width, height = capture.get(3), capture.get(3) #capture.get():获取本地视频属性
print("width,height为:", width, height)
# 以原分辨率的一倍来捕获
capture.set(cv2.CAP_PROP_FRAME_WIDTH, width * 2) #capture.set():设置本地视频属性
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, width * 2)
while(True):
#获取一帧
ret,frame = capture.read()
#将这帧转换为灰度图
gray =cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(30) == ord('q'):
break
# 3.保存图片
cv2.imwrite("D:/its.png", gray)
print('save img success!')
import cv2
#播放本地视频
#播放本地视频
capture = cv2.VideoCapture('D:/名校励志演讲21.2012 巴纳德学院 奥巴马 .mp4')
while(capture.isOpened()):
ret,frame = capture.read()
gray= cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if(cv2.waitKey(30) == ord('q')):
break
# 3.保存图片
cv2.imwrite("D:/obama.png", gray)
print('save img success!')
import cv2
#录制视频#
capture = cv2.VideoCapture(0)
#定义编码方式并创建VideoWriter对象
fourcc=cv2.VideoWriter_fourcc(*'MJPG') #定义编码方式Fourcc
outfile=cv2.VideoWriter('D:/obama.avi',fourcc,25.,(640,480)) #25:帧率 (640,480):分辨率
while(capture.isOpened()):
ret,frame = capture.read()
if ret:
outfile.write(frame) #写入文件
cv2.imshow('frame',frame)
if(cv2.waitKey(1) == ord('q')):
break
else:
break
print('save success!')
import cv2
#图像几何变换:旋转、平移、缩放和翻转图片#
img= cv2.imread('D:/a.png')
#按照指定的宽度,高度缩放图片
#res=cv2.resize(img,190,189)
#按照比例缩放,如:x,y轴均放大一倍
res2= cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR)
#翻转图片:第二个参数(等于0,垂直翻转;大于0,水平翻转;小于0,水平垂直翻转)
dst=cv2.flip(res2,-1)
#获取行列
rows, cols = img.shape[:2]
#旋转图片,缩小一半
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.5)
wp=cv2.warpAffine(dst,M,(cols,rows)) #平移/旋转,靠仿射变换cv2.warpAffine()实现的
#cv2.imshow('shrink',res)
# cv2.imshow('zoom',dst)
cv2.imshow('rotation',wp)
cv2.waitKey(0)
# 3.保存图片
cv2.imwrite("D:/face.png",dst)
print('save img success!')
import cv2
import numpy as np
#绘图 cv2.line(), cv2.circle(), cv2.rectangle(), cv2.ellipse(), cv2.putText()#
#画线#
#创建黑色图片
img =np.zeros((512,512,3),np.uint8)
#画一条线
cv2.line(img,(0, 0), (512, 512), (255, 0, 0), 5)
#画矩形
cv2.rectangle(img,(384, 0), (510, 128), (0, 255, 0), 3)
#画圆
cv2.circle(img,(447, 63), 63, (0, 0, 255), -1)
#画椭圆
cv2.ellipse(img,(256, 256), (100, 50), 0, 0, 180, (255, 0, 0), -1)
#多边形
# 定义四个顶点坐标
pts = np.array([[10, 5], [50, 10], [70, 20], [20, 30]], np.int32)
# 顶点个数:4,矩阵变成 4*1*2 维
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (0, 255, 255))
# 使用 cv2.polylines() 画多条直线
line1 = np.array([[100, 20], [300, 20]], np.int32).reshape((-1, 1, 2))
line2 = np.array([[100, 60], [300, 60]], np.int32).reshape((-1, 1, 2))
line3 = np.array([[100, 100], [300, 100]], np.int32).reshape((-1, 1, 2))
cv2.polylines(img,[line1, line2, line3], True, (0, 255, 255))
#添加文字
font =cv2.FONT_HERSHEY_COMPLEX
cv2.putText(img,'China!!',(10,500),font,4, (255, 255, 255), 2, lineType=cv2.LINE_AA)
cv2.imshow('paint',img)
cv2.waitKey(0)
3.人脸检测实现
首先在opencv官网下载opencv pc版的安装包
Releases - OpenCV

**其次,安装下载包,找到人脸检测的xml文件,**如下:

注意:这些xml文件,可用于检测静止图像、视频和摄像所得到图像中的人脸
人脸检测特征数据文件

代码实现
python
import cv2
def fac_detect_demo(img):
#将图片转换为灰度图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#加载特征数据
face_detector=cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces=face_detector.detectMultiScale(gray)
# x,y为起始坐标,w,h为宽高
for x,y,w,h in faces:
# (x,y),(x+w,y+h)分别为左上角,右下角,矩形颜色为(0,255,0)即绿色;thickness=2为矩形的边框
cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,255,0),thickness=2)
cv2.imshow('reuslt:',img)
#人脸检测-图片单张人脸
#1.加载图片
img = cv2.imread("D:/aa.png")
#2.人脸检测
fac_detect_demo(img)
cv2.waitKey(0)
cv2.destroyAllWindows() #释放内存空间
效果如下:
python
import cv2
def fac_detect_demo(img):
#将图片转换为灰度图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#加载特征数据
face_detector=cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces=face_detector.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=3,maxSize=(50,50)) #进行人脸检测
# x,y为起始坐标,w,h为宽高
for x,y,w,h in faces:
print(x,y,w,h)
# (x,y),(x+w,y+h)分别为左上角,右下角,矩形颜色为(0,0,255)即红色;thickness=2为矩形的边框
cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=2)
cv2.imshow('reuslt:',img)
#人脸检测-图片多张脸
#1.加载图片
img = cv2.imread("D:/aaa.png")
#2.调用人脸检测方法
fac_detect_demo(img)
cv2.waitKey(0)
cv2.destroyAllWindows() #释放内存空间
效果如下:

人脸检测-视频中人脸识别
python
import cv2
def face_detect_demo(img):
# 将图片转换为灰度图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载特征数据
face_detector = cv2.CascadeClassifier('D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
faces = face_detector.detectMultiScale(gray,maxSize=(210,210),minSize=(120,120)) # 进行人脸检测
# x,y为起始坐标,w,h为宽高
for x, y, w, h in faces:
print(x, y, w, h)
# (x,y),(x+w,y+h)分别为左上角,右下角,矩形颜色为(0,0,255)即红色;thickness=2为矩形的边框
cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)
cv2.circle(img, center=(x + w // 2, y + h // 2), radius=w // 2, color=(0, 255, 0), thickness=2)
cv2.imshow('reuslt:', img)
#人脸检测-视频中人脸识别
#读取视频
cap= cv2.VideoCapture('D:/名校励志演讲21.2012 巴纳德学院 奥巴马 .mp4')
while True:
flag,frame= cap.read()
if not flag: #读到视频结尾,break
break
face_detect_demo(frame)
if ord('q')==cv2.waitKey(10):
break
cv2.destroyAllWindows()
cap.release()
效果如下: