OpenCV 是一个开源的计算机视觉库,OpenCV 库用C语言和 C++ 语言编写,可以在 Windows、Linux、Mac OS X 等系统运行。同时也在积极开发 Python、Java、Matlab 以及其他一些语言的接口,将库导入安卓和 iOS 中为移动设备开发应用。
OpenCV 库包含从计算机视觉各个领域衍生出来的 500 多个函数,包括工业产品质量检验、医学图像处理、安保领域、交互操作、相机校正、双目视觉以及机器人学。
首先我们来引入我们需要的模块:pip install opencv-python
pip的仓库一般都是在国外的服务器上,加了镜像源可以提供下载的速度。
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
常见 pip 镜像源(国内源)
清华镜像源:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云镜像源:http://mirrors.aliyun.com/pypi/simple/
中国科技大学镜像源: https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学镜像源:http://pypi.hustunique.com/
山东理工大学镜像源:http://pypi.sdutlinux.org/
豆瓣镜像源:http://pypi.douban.com/simple/
2、图片像素矩阵读写原理临时使用pip镜像源可以在使用pip的时候加参数:-i https://pypi.tuna.tsinghua.edu.cn/simple
首先我们测试如何使用opencv查看一张图片,我们下载的是opencv视觉库,但是引入的时候是引入cv2,调用 imshow函数进行开启窗口查看图片。
import cv2image = cv2.imread("image/test.jpeg")cv2.imshow("window", image)
运行结果:窗口一闪而过
因为程序一旦停止运行,图片就不会展示了,所以会出现一闪而过的窗口展示,所以为了让图片长时间展示出来,那么需要加:cv2.waitKey()
图片像素矩阵概念
数字图像数据可以用矩阵来表示,因此可以采用矩阵理论和矩阵算法对数字图像进行分析和处理。由于数字图像可以表示为矩阵的形式,所以在计算机数字图像处理程序中,通常用二维数组来存放图像数据。
cv库中的函数cv.image读取的是图片的像素矩阵,矩阵单元是rbg的向量形式。下面举例读取纯色图片来解释原理情况:
import cv2image = cv2.imread("image/test_98_98.jpeg")# 返回矩阵 矩阵的每个是rgb行向量,[r,g, b]""" · The function imread loads an image from the specified file and returns it、If the image cannot be 、 read (because of missing file, improper permissions, unsupported or invalid format), the function 、 returns an empty matrix ( Mat::data==NULL )."""print(len(image)) # 像素:高print(len(image[0])) # 像素:宽print(image) # 像素矩阵(3维列表)cv2.imshow("window", image)cv2.waitKey(0)
三维列表:最外维是高,中间维度是宽,最里面的维度是rgb
就比如读取一张纯色(40,44,52)的jpeg图片,发现矩阵的每个是rgb行向量都是相同的。
jpeg与png区别:png可以存储透明的图片,因为png图片的像素单元,是4个数值的元组进行存储,分别对应 Red、Green、Blue、透明度
而我们采用传统的文件读取方式,读出结果都是二进制的格式:
with open('./image/test_98_98.png', 'rb') as f: print(f.read())
3、调用电脑本地摄像头在进行连接手机摄像头之前,我们可以尝试调用电脑本地摄像头做预测试,代码如下
import cv2capture = cv2.VideoCapture(0)# 0为电脑内置摄像头while True: ret, frame = capture.read() # 摄像头读取, ret为是否成功打开摄像头, true, false:frame为视频的每一帧图像 frame = cv2.flip(frame, 1) # 摄像头是和人对立的,将图像左右调换回来正常显示。 cv2.imshow("video", frame) c = cv2.waitKey(50) if c == 27: # 27 对应是 esc 键 break
运行结果:开启video的窗口,展示摄像头实时的图像。
代码相关参数介绍
关于函数waitKey(delay=None)的介绍:@param delay 参数,等待的时长,会发生同步阻塞,单位是milliseconds毫秒,如果传值为0,那么就是永久阻塞直到键盘事件发生。
关于函数flip(src, flipCode, dst=None)的介绍:@param flipCode 参数,翻转码,分别有三种取值:大于0,小于0,等于0,下面的源码注释也详细地介绍了。
def waitKey(delay=None): # real signature unknown; restored from __doc__# @param delay Delay in milliseconds、0 is the special value that means "forever".def flip(src, flipCode, dst=None): # real signature unknown; restored from __doc__"""、 The function cv::flip flips the array in one of three different ways (row 、 and column indices are 0-based): 、 The example scenarios of using the function are the following: 、 * Vertical flipping of the image (flipCode == 0) to switch between 、 top-left and bottom-left image origin、This is a typical operation 、 in video processing on Microsoft Windows* OS. 、 * Horizontal flipping of the image with the subsequent horizontal 、 shift and absolute difference calculation to check for a 、 vertical-axis symmetry (flipCode > 0). 、 * Simultaneous horizontal and vertical flipping of the image with 、 the subsequent shift and absolute difference calculation to check 、 for a central symmetry (flipCode < 0). 、 * Reversing the order of point arrays (flipCode > 0 or 、 flipCode == 0)."""
视频播放案例测试:
import cv2 # 导入库cv2.namedWindow("camera", 1) # 定义启动窗口名称video = "https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4"# 此处根据IP摄像头生成的局域网地址capture = cv2.VideoCapture(video)# 引入视频地址,video其实也可以换成你电脑中的视频地址或者网络视频资源可以制作成一个播放器。while True: success, img = capture.read() # 读取视频 cv2.imshow("camera", img) cv2.waitKey(10)
另外,我们也可以将其他视频引入进来,当然你可以换一个网络视频地址或者本地视频地址,把它变成视频播放器,然后我们就需要去读取我们引入的视频地址。
网络视频地址比如:https://klxxcdn.oss-cn-hangzhou.aliyuncs.com/histudy/hrm/media/bg3.mp4
4、内网IP连接手机摄像头 android手机上安装一款APP:IP摄像头
如果应用商店没有,那么打开手机百度进行下载,安装成功后,点击软件界面下方“打开IP摄像头服务器”,选择局域网的IP地址。
展示手机端摄像头实时图像
要想连接成功,必须保持手机与电脑处于同一局域网下,例如同一热点,同一WIFI。
既然实时的,而且要长时间运行,那当然少不了while true
import cv2 # 导入库cv2.namedWindow("camera", 1) # 定义启动窗口名称video = "http://admin:admin@192.168.0.101:8081/"# 此处根据IP摄像头生成的局域网地址capture = cv2.VideoCapture(video)# 引入视频地址,video其实也可以换成你电脑中的视频地址可以制作成一个播放器。num = 0while True: success, img = capture.read() # 读取视频 img = cv2.flip(img, 1) cv2.imshow("camera", img) key = cv2.waitKey(10) if key == 27: # esc键退出 break if key == ord(' '): num = num + 1 filename = "frames_%s.jpg" % num cv2.imwrite(filename, img) # 保存一张图像capture.release()# The method is automatically called by subsequent VideoCapture::open and by VideoCapture destructor.cv2.destroyWindow("camera")# The function destroyWindow destroys the window with the given name.
运行结果如下所示:
cv2.imwrite(filename, img) 保存一张图像,filename传文件的地址值和文件名称
在Windows中用python处理图像时遇到问题-!_src.empty() in function 'cv::cvtColor'
在运行时报错,根据显示,应该是没有对cvtColor传入源图像。逐步检查:
5、opencv实现人脸检测文件路径正确,是绝对路径,文件名中有中文,最后是因为文件名中有中文,将处理后文件进行保存后发现英文文件名的图像正常,而中文错误。
梳理一下实现人脸识别需要进行的步骤:
流程大致如此,在此之前,要先让人脸被准确的找出来,也就是能准确区分人脸的分类器,在这里我们可以用已经训练好的分类器,网上种类较全,分类准确度也比较高,我们也可以节约在这方面花的时间。
下载人脸检测xml文件
需要下载人脸模型库文件“ haarcascade_frontalface_default.xml ”,帮助摄像头获取的画面去对比,下载成功后,将“haarcascade_frontalface_default.xml”文件放在上面的代码文件目录里。
链接:https://pan.baidu.com/s/1lxZrI9ZjXWreJvKPYgyQRQ 提取码:w96c
人脸位置检查代码展示如下:
import cv2# 读取视频信息。cap = cv2.VideoCapture("http://admin:admin@192.168.0.101:8081/") # @前为账号密码,@后为ip地址face_xml = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") # 导入XML文件while cap.isOpened(): f, img = cap.read() # 读取一帧图片 img = cv2.flip(img, 1) # 镜像翻转图片 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图 face = face_xml.detectMultiScale(gray, 1.3, 10) # 检测人脸,并返回人脸位置信息 for (x, y, w, h) in face: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2) # x、y 位置坐标值,w 、h矩形框的大小:width、height # 最后参数 2 的意思是,矩形框的border(前端css中的div border类似)值 # (255, 255, 255) 捕捉人脸位置的矩形框颜色 cv2.imshow("camera", img) if cv2.waitKey(10) == 27: breakcap.release()
实验结果是:在人脸的位置出现白色的矩形框:就好比这样,由于博主不想露脸,效果就像如下所示的那样。
太困了,明天更新,准备先休息了,明天见 · · · · · ·