使用opencv实现简单的人脸识别

一、opencv模块的使用

1、简介

opencv-python是一个python绑定库,旨在解决计算机视觉问题。使用opencv模块,可以实现一些对图片和视频的操作。

2、安装

安装opencv之前需要先安装numpy, matplotlib。然后使用pip安装opencv库即可。

3、导入

使用import cv2进行导入即可,需要注意的是cv2读取图片的颜色通道是BGR(蓝绿红)。

4、使用

使用cv2.imread()接收读取的图片,此处需要注意的是读取路径必须为英文。

cat = cv2.imread("cat1.png")

使用cv2.imshow()函数显示读取的图片。

cv2.imshow("cat", cat)

其中,函数内的第一个参数为显示图片窗口左上角的名字,第二个参数为接收读取的图片。

注意:在调用显示图像的API后,要调用cv2.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。

cv2.waitKey(0)

其中,函数内的意思是等待键盘输入的时间,单位毫秒,如果为0则无限等待。

最后,使用cv2.destroyAllWindows()释放内存。

cv2.destroyAllWindows()

显示图像结果如下。

二、实现简单的人脸识别

1、下载人类特征数据

首先在github网站下载开源人脸特征数据。网址:opencv/data at 4.x · opencv/opencv · GitHub

选择如上文件

选择人脸数据进行下载。

2、简单的人脸识别代码

首先使用cv2.imread()接收要读取的图片。

yoogni = cv2.imread("myq.jpg")

CascadeClassifieropencvobjdetect模块中用来做目标检测的级联分类器的一个类。传入人脸特征数据,返回识别出的人脸对象。

detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

使用detectMultiScale()接收返回检测出的人脸对象。

face_zone = detector.detectMultiScale(yoogni)

打印接收的对象。

print(face_zone)

输出结果如下:

输出的为检测的人类区域。

3、在图上绘制识别出的人脸区域

使用cv2.rectangle()绘制出识别成功的人脸区域。

for x, y, w, h in face_zone:
    cv2.rectangle(yoogni
, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255))

其中pt1是左上角坐标,pt2是右下角坐标,w是识别区域的宽,h是识别区域的高。颜色选择的是红色。

使用cv2.imshow()函数显示绘制完成的图片。

cv2.imshow("myq",yoogni)

输出结果如下:

三、进行多个人脸识别

在进行一张图片的多个人脸识别时,常常会出现识别错误的情况,如下图。

所以在识别时进行参数的调整。

face_zone = detector.detectMultiScale(myq, scaleFactor=1.3, minNeighbors=5) 

scaleFactor表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%,此处调整为1.3。

minNeighbors表示构成检测目标的相邻矩形的最小个数(默认为3个)。该参数指定每一个候选矩形边界框需要有多少相邻的检测点,此处调整为5。

输出结果如下。

可以看出,检测精度明显上升。

四、进行视频人脸识别

本周在图片人脸识别的基础上进行扩展,进行视频的人脸识别。

1、视频捕获

首先进行视频捕获。

cap = cv2.VideoCapture("video2.mp4")

videocapture是按帧读取视频,就是读取视频里的图片,这个函数返回一张图片和一个布尔类型的值,布尔类型的值表示还有没有下一帧。

flag, frame = cap.read()
print(flag, frame.shape)

此时frame是第一帧图片,frame.shape输出的是图片维度。输出结果如下:

传入人脸特征数据

detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

2、将图像转为黑白影像再进行人脸识别

因为在识别人脸的时候,黑白和彩色不影响识别,所以为了运行速度更快,可以将识别时候的视频转为黑白。

gray = cv2.cvtColor(luo, code=cv2.COLOR_BGR2GRAY)

对黑白图像进行人脸识别

face_zone = detector.detectMultiScale(gray)

3、对视频进行人脸识别

首先要使用while语句进行判别,判断视频是否读到最后一帧。返回全部帧,使用isOpened函数判断视频是否还打开。

while cap.isOpened():

在while语句中,首先按帧读取视频。

flag, frame = cap.read()

由于原视频过大,所以将视频重新调整一下大小,使用luo接收返回值。

luo = cv2.resize(frame, dsize=(640, 360))

再将图片转为黑白色,并进行人脸识别。

gray = cv2.cvtColor(luo, code=cv2.COLOR_BGR2GRAY)
face_zone = detector.detectMultiScale(gray)

在按帧绘制出识别区域。

for x, y, w, h in face_zone:
    cv2.rectangle(luo
, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255))

写判断语句,当视频播放到最后一帧时退出循环。

if not flag:
   
break

显示视频。

cv2.imshow("me", luo)

下面判断语句的意思是,等待10毫秒,如果用户没有摁下q键,就显示下一帧视频,并且cv2只读了图片没有读声音。及摁下q键退出视频。

if ord("q") == cv2.waitKey(20):
   
break

以上代码均写在while语句中。下面释放内存。

cv2.destroyAllWindows()
cap.release()

输出结果如下。

 

五、进行摄像头人脸识别

1、调取本地摄像头

还是使用videocapture函数,参数为0调取本地摄像头。

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

2、人脸识别

与上一节的人脸识别代码一样,输出结果如下。

 

3、保存视频

获取宽高,方便写入视频,因为转换为整形数字时可能会把小数点后几位截走,所以+1,视频大一点可以,小一点不行。

w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + 1
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) + 1

函数内第一个参数是视频名字;第二个是视频编码,及保存的视频格式;第三个是一秒几帧,第四个是视频的高宽。此处保存的视频名字为me,视频为avi格式。

vw = cv2.VideoWriter("me.avi", cv2.VideoWriter_fourcc("M", "P", "4", "2"), 24, (w, h))

在上一节人脸识别的while语句中,

cv2.imshow("me", frame)

这一句代码后面,判断摄像头录制是否结束。

if not flag:
   
break

如果视频没结束,把这一帧写入视频。

vw.write(frame)

保存结果如下。

 

 

  • 13
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在ROS中使用OpenCV实现人脸识别,可以按照以下步骤进行: 1. 安装OpenCV库 在Ubuntu 18.04下,可以使用以下命令安装OpenCV库: ``` sudo apt-get install libopencv-dev ``` 2. 创建ROS包 使用以下命令创建ROS包: ``` catkin_create_pkg face_recognition roscpp rospy std_msgs sensor_msgs cv_bridge image_transport ``` 3. 创建ROS节点 在ROS包中创建一个名为`face_recognition_node.cpp`的ROS节点,并在其中实现人脸识别算法。 首先,需要包含以下头文件: ```cpp #include <ros/ros.h> #include <sensor_msgs/Image.h> #include <cv_bridge/cv_bridge.h> #include <opencv2/opencv.hpp> ``` 然后,定义ROS节点类,并在类中添加订阅器和回调函数,用于接收图像消息和进行人脸识别: ```cpp class FaceRecognitionNode { public: FaceRecognitionNode() { image_sub_ = nh_.subscribe("/camera/rgb/image_raw", 1, &FaceRecognitionNode::imageCallback, this); } void imageCallback(const sensor_msgs::Image::ConstPtr& msg) { cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { ROS_ERROR("cv_bridge exception: %s", e.what()); return; } // 人脸识别算法 cv::CascadeClassifier face_cascade; face_cascade.load("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml"); std::vector<cv::Rect> faces; cv::Mat gray; cv::cvtColor(cv_ptr->image, gray, cv::COLOR_BGR2GRAY); cv::equalizeHist(gray, gray); face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30)); // 在图像中绘制人脸框 for (size_t i = 0; i < faces.size(); i++) { cv::rectangle(cv_ptr->image, faces[i], cv::Scalar(0, 255, 0), 2); } // 发布识别结果 image_pub_.publish(cv_ptr->toImageMsg()); } private: ros::NodeHandle nh_; ros::Subscriber image_sub_; ros::Publisher image_pub_; }; ``` 在回调函数中,将ROS图像消息转换为OpenCV图像格式,并使用OpenCV人脸识别算法`CascadeClassifier`进行人脸检测。检测到人脸后,在图像中绘制人脸框,并将识别结果发布为ROS图像消息。 4. 编译ROS节点 使用以下命令编译ROS节点: ``` cd ~/catkin_ws catkin_make ``` 5. 运行ROS节点 在终端中运行以下命令启动ROS节点: ``` rosrun face_recognition face_recognition_node ``` 接着,使用以下命令启动相机节点,向ROS节点发送图像消息: ``` roslaunch usb_cam usb_cam-test.launch ``` 最后,可以使用以下命令查看ROS节点发布的人脸识别结果: ``` rosrun image_view image_view image:=/face_recognition/image_raw ``` 这样就可以在ROS中实现基于OpenCV人脸识别功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值