从零入门AI视觉与人脸识别实战
AI机器视觉图像基础和人脸识别学习目标机器视觉图像基础Opencv图像基础操作Opencv如何采集摄像头图像人脸识别监控系统实战机器视觉图像基础计算机视觉人感知的环境是三维计算机存储的图像是二维。计算机视觉研究让计算机像人一样“看”给计算机装上“眼睛相机”和“大脑算法”理解图像与视频内容。典型应用领域领域应用场景生物医学染色体分析、X光/CT影像分析、显微医学操作文字处理OCR文字识别、文档修复、垃圾邮件分类智能交通交通管理、自动驾驶、智能泊车休闲娱乐电影特效、人像美颜、VR、体感游戏图像数字化把连续的模拟图像转为计算机可处理的数字图像分为采样、量化两步。采样把空间连续图像转为离散像素点。采样后的图像尺寸叫分辨率由宽(width)、高(height)组成。示例640*480图像总像素点 640×480307200640 \times 480 307200640×480307200采样间隔越小 → 像素越多分辨率越高图像越清晰但数据体积更大。量化将采样点的信号转为离散整数。灰度级采样点亮度取值范围一般为2的整数次幂。8位图像282562^825628256级灰度0代表黑色最暗255代表白色最亮。量化等级越高图像层次越丰富质量越好数据量变大。图像的数学表示数字图像等价于矩阵记作III或函数 f(x,y)。像素(Pixel)图像最小采样单元使用坐标(x,y)(x,y)(x,y)定位。通道(Channel)像素的数据维度例如BGRA。灰度图单通道只保存亮度信息仅1个通道8位灰度0黑255白。彩色图像RGB多通道图像红®、绿(G)、蓝(B)三原色。(255,0,0)→ 纯红(124,252,0)→ 草坪绿(135,206,235)→ 天蓝色颜色空间转换RGB、HSV、YUV之间可以互相转换库提供API不需要手动计算公式。灰度化彩色图转单通道灰度图三种算法最大值法(Imax(R,G,B))(Imax(R,G,B))(Imax(R,G,B))平均值法(I(RGB)/3)(I(RGB)/3)(I(RGB)/3)加权平均值法I0.11×B0.59×G0.30×RI0.11 \times B0.59 \times G0.30 \times RI0.11×B0.59×G0.30×ROpencv图像基础操作OpenCV简介OpenCVOpen Source Computer Vision Library开源计算机视觉库英特尔发起维护。特点跨平台Windows、Linux、macOS、Android、iOS2500优化算法图像处理、特征检测、目标识别、视频分析支持C / Python / Java和Numpy、TensorFlow、PyTorch无缝结合场景人脸识别、自动驾驶、医学影像、机器人视觉核心功能图像读写保存、像素操作缩放/旋转/裁剪色彩空间转换特征匹配目标跟踪相机标定三维重建。安装命令pipinstallopencv-python-ihttps://pypi.tuna.tsinghua.edu.cn/simpleOpenCV读取图像importcv2# cv2.IMREAD_COLOR 1 读取彩色图默认BGR格式不是RGBimg_colorcv2.imread(img/flower.jpg,cv2.IMREAD_COLOR)print(img_color.shape)# cv2.IMREAD_GRAYSCALE 0 直接读取灰度图img_graycv2.imread(img/flower.jpg,cv2.IMREAD_GRAYSCALE)# cv2.IMREAD_UNCHANGED -1 读取原图包含透明Alpha通道img_alphacv2.imread(img/flower.jpg,-1)OpenCV显示图像cv2.imshow(窗口名,图像数组)img_colorcv2.imread(img/flower.jpg)ifimg_colorisnotNone:cv2.imshow(img,img_color)cv2.waitKey(0)# 等待按键0代表无限等待cv2.destroyAllWindows()# 关闭全部窗口cv2.waitKey(n)等待n毫秒按键输入cv2.destroyAllWindows()释放窗口资源。颜色空间转换⚠️ OpenCV读取彩色图默认是BGR顺序不是RGBcolor_imagecv2.imread(img/flower.jpg)# BGR转灰度gray_imagecv2.cvtColor(color_image,cv2.COLOR_BGR2GRAY)# 保存图片cv2.imwrite(img/output.jpg,gray_image)图像缩放 cv2.resize()imagecv2.imread(img/flower.jpg)#方式1直接指定宽高resized1cv2.resize(image,(300,200))#方式2按比例缩放fx水平缩放系数fy垂直缩放系数resized2cv2.resize(image,None,fx0.5,fy0.5)#插值参数# INTER_AREA适合缩小图像# INTER_CUBIC适合放大图像画质高速度慢# INTER_LINEAR双线性插值默认resized3cv2.resize(image,None,fx2,fy2,interpolationcv2.INTER_CUBIC)#放大resized4cv2.resize(image,None,fx0.3,fy0.3,interpolationcv2.INTER_AREA)#缩小cv2.imshow(resized1,resized1)cv2.waitKey(0)cv2.destroyAllWindows()图像裁切numpy数组切片完成裁剪图像shape顺序(高度h,宽度w,通道数)imagecv2.imread(img/flower.jpg)h,wimage.shape[:2]print(f宽:{w},高:{h})xint(w/2)new_image1image[:,:x]#取图片左半部分new_image2image[:,x:]#取图片右半部分cv2.imshow(new_image1,new_image1)cv2.imshow(new_image2,new_image2)cv2.waitKey(0)cv2.destroyAllWindows()Opencv采集摄像头图像importcv2importtimedefcapture_camera():capcv2.VideoCapture(0)#0代表本机默认摄像头ifnotcap.isOpened():print(无法打开摄像头)returnwhileTrue:ret,framecap.read()#读取一帧ifnotret:print(无法接收帧退出)breakcv2.imshow(Camera,frame)keycv2.waitKey(30)ifkeyord(q):#q键退出循环breakelifkeyord(s):#s键截屏保存time_strtime.strftime(%Y%m%d%H%M%S,time.localtime())fileNamefphone/{time_str}.jpgcv2.imwrite(fileName,frame)cap.release()#释放摄像头硬件资源cv2.destroyAllWindows()capture_camera()代码关键点说明cv2.VideoCapture(0)打开摄像头多摄像头可尝试1,2ret, frame cap.read()ret布尔值是否读取成功frame读到的图像帧numpy数组cv2.waitKey()监听键盘按键程序结束必须执行cap.release()释放摄像头destroyAllWindows()关闭窗口。人脸识别监控系统实战静态图片人脸检测Haar级联分类器importcv2#加载官方人脸检测xml分类器face_detectcv2.CascadeClassifier(haarcascade_frontalface_default.xml)imgcv2.imread(img/girl.jpg)img_graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#检测人脸facesface_detect.detectMultiScale(img_gray,1.1,3,minSize(200,200),maxSize(300,300))#遍历所有人脸画矩形框for(x,y,w,h)infaces:cv2.rectangle(img,\((x,y)\),(xw,yh),(0,0,250),2,cv2.LINE_AA)cv2.imshow(img,img)cv2.waitKey(0)cv2.destroyAllWindows()detectMultiScale多尺度检测返回(x,y,w,h)人脸框坐标cv2.rectangle()绘制矩形标记人脸位置。摄像头实时人脸检测监控importcv2importtime face_detectcv2.CascadeClassifier(haarcascade_frontalface_default.xml)capcv2.VideoCapture(0)ifnotcap.isOpened():print(无法打开摄像头)whileTrue:ret,framecap.read()ifnotret:print(读取帧失败退出)breakimg_graycv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)facesface_detect.detectMultiScale(img_gray,1.1,3,minSize(200,200),maxSize(300,300))for(x,y,w,h)infaces:cv2.rectangle(frame,(x,y),(xw,yh),(0,0,250),2,cv2.LINE_AA)cv2.imshow(Camera,frame)keycv2.waitKey(2)ifkeyord(q):breakelifkeyord(s):time_strtime.strftime(%Y%m%d%H%M%S,time.localtime())fileNamefphone/{time_str}.jpgcv2.imwrite(fileName,frame)cap.release()cv2.destroyAllWindows()逻辑流程读取摄像头画面 → BGR图像转为灰度图 → Haar级联分类器检测人脸 → 在原图绘制矩形框标记人脸按q退出按s截图保存。