一、编程实现“实验四编程练习”的内容
答:选用people.png图片对其进行处理
import cv2
def overlay_img(img,img_over,img_over_x,img_over_y):
img_h=img.shape[0]
img_w=img.shape[1]
img_over_h,img_over_w,img_over_c=img_over.shape
if img_over_c==3:
img_over=cv2.cvtColor(img_over,cv2.COLOR_BGR2BGRA)
for w in range(0,img_over_w):
for h in range(0,img_over_h):
if img_over[h,w,3]!=0:
for c in range(0,3):
x=img_over_x+w
y=img_over_y+h
if x>=img_w or y>=img_h:
break
img[y,x,c]=img_over[h,w,c]
return img
face_img=cv2.imread("people.jpg")
glass_img=cv2.imread("glass.png",cv2.IMREAD_UNCHANGED)
height,width,channel=glass_img.shape
face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
garyframe = cv2.cvtColor(face_img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(garyframe,1.15,5)
for (x,y, w, h)in faces:
gw = w
gh = int(height * w/width)
glass_img = cv2.resize(glass_img,(gw,gh))
overlay_img(face_img,glass_img,x,y + int(h * 1/3))
cv2.imshow( "screen", face_img)
cv2.waitKey(0)
cv2.destroyAllwindows()
写出OpenCV的安装及配置过程
方法一:
1.为了提高安装速度,先配置清华镜像,命令为:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
2.在Anaconda-Navigator左侧选择 Environment,在右侧要使用的环境中,左上方将 Installed 改为All,右侧搜索cv,便可看到opencv,勾选后点击右下角 Apply
方法二:
1.在opencv-python · PyPI网站中找到对应的操作系统和python版本的whl文件。
2.在cmd命令行中打开该文件所在位置,这里以我的为例,输入
pip install opencv_python-4.5.3.56-cp38-cp38-win_amd64.whl
3.输入pip list,查看是否安装成功。
运用Haar分类器方法编写人脸识别程序,并进行调试
load.py用来录入自己的人脸数据,train.py用来将录入的人脸图片转化为yml文件形式,方便识别,recognize.py负责识别出自己的人脸。这里以自己的人脸为例,标号为1,名字为“Student A”
load.py代码如下:
import cv2 as cv
font = cv.FONT_HERSHEY_SCRIPT_SIMPLEX # 设置字体
user_id = input('请输入用户id')
def face_detect_demo(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 将图片灰度
face_dector = cv.CascadeClassifier(
'D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') # 加载特征数据,前者为xml文件所在路径
faces = face_dector.detectMultiScale(gray, minNeighbors=5)
# scaleFactor为图像尺度参数,数值太大容易丢失物体
# minNeighbors控制着误检测,默认值为x表明至少有x次重叠检测,我们才认为人脸存在
# minSize表示检测最小像素点
# maxSize表示检测最大像素点
# 可通过调节maxSize和minSize使识别更为精确
for (x, y, w, h) in faces:
cv.putText(img, 'Student A', (x + w + 5, y - 5), font, 1, (255, 0, 0), 1)
for i in range(1, 800):
t = user_id + "." + str(i)
cv.imwrite(f'data/{t}.jpg', gray[y:y + h, x:x + w]) # 采集数据
cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2) # 绘制矩形
cv.imshow('result', img)
cap = cv.VideoCapture(0, cv.CAP_DSHOW) # 打开默认摄像头
while True:
ok, img = cap.read() # ok表示是否有读到数据,img表示读到的数据(图片)
if not ok:
break
face_detect_demo(img)
key = cv.waitKey(1) # 给读取延时
if key == 27: # 按下ESC停止
break
cv.destroyAllWindows()
cap.release()
train.py代码如下:
import os
import cv2
import numpy as np
from PIL import Image
recognizer = cv2.face.LBPHFaceRecognizer_create() # 创建一个基于LBPH的训练器
# 检测人脸
face_dector = cv2.CascadeClassifier(
'D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') # 加载特征数据,前者为xml文件所在路径
img_path = 'data' # 数据路径
all_image_paths = [os.path.join(img_path, f) for f in os.listdir(img_path)]
facesSamples = []
ids = []
for each_img in all_image_paths: # 遍历列表中的图片
id = int(os.path.split(each_img)[1].split('.')[0]) # 获取每张图片id,[0]确保读取id和data中第一个id号相同
if id == 1:
PIL_img = Image.open(each_img).convert('L') # 读取图片转换为灰度数据
np_img = np.array(PIL_img, 'uint8') # 每个像素点转成8位
faces = face_dector.detectMultiScale(np_img) # 检测转换后的数据矩阵有无脸
for x, y, w, h in faces:
facesSamples.append(np_img[y:y + h, x:x + w]) # 将人脸部分切出
ids.append(id)
recognizer.train(facesSamples, np.array(ids))
recognizer.write('trainer1.yml')
recognize.py代码如下:
# coding=gbk
import cv2 as cv
font = cv.FONT_HERSHEY_SCRIPT_SIMPLEX # 设置字体
cap = cv.VideoCapture(0) # 打开默认摄像头
recognizer = cv.face.LBPHFaceRecognizer_create() # 创建一个基于LBPH的训练器
faceCascade = cv.CascadeClassifier(
'D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') # 加载特征数据,前者为xml文件所在路径
recognizer.read('trainer1.yml') # 加载训练好的数据
while True:
ok, img = cap.read() # ok表示是否有读到数据,img表示读到的数据(图片)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 灰度处理
faces = faceCascade.detectMultiScale(
gray, minNeighbors=5,
minSize=(32, 32)
)
for x, y, w, h in faces: # 确保检测到脸
cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), thickness=2)
id, con = recognizer.predict(gray[y:y + h, x:x + w])
# print(id)
# print(type(id)) #查看id数据类型
if id == 1:
name = 'Student A'
if id == 1002:
name = 'Student B'
if id == 1003:
name = 'Student C'
if id == 1004:
name = 'Student D'
cv.putText(img, name, (x + w + 5, y - 5), font, 1, (0, 0, 255), 1)
cv.imshow('video', img)
key = cv.waitKey(1) # 给读取延时
if key == 27: # 按下ESC停止
break
cv.destroyAllWindows()
cap.release()
简答题
什么是傅里叶变换?高通滤波器和低通滤波器的概念是什么?
答:
(1)傅立叶变换表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。对于一张图片进行傅里叶变换就是将它分解为正弦和余弦两部分,以完成从空间域到频域的转换。
(2)高通滤波器(HPF)是检测图像的某个区域,然后根据像素与周围像素的亮度差值来提升该像素的亮度的滤波器。
(3)低通滤波器(LPF)则是在像素与周围像素的亮度差值小于一定特征值,平滑该像素的亮度。
什么是直方图均衡化?
将原图象的直方图通过变换函数修正为均匀的直方图,然后按均衡直方图修正原图象。图象均衡化处理 后,图象的直方图是平直的,即各灰度级具有相同的出现频数,那么由于灰度级具有均匀的概率分布,图象看起来就更清晰了。
什么是中值滤波及其原理?
(1)中值滤波法是一种非线性平滑技术,它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素 点灰度值的中值。 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,
(2)中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真 实值,从而消除孤立的噪声点。