目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)

简介: 本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。

背景

由于我们在做项目的时候可能会涉及到某个指定区域进行目标检测或者人脸识别等任务,所以这篇博客是为了探究如何在传统目标检测的基础上来结合特定区域进行检测,以OpenCV自带的包为例。

一般来说有两种方式实现区域指定:

  • 第一种:在网络处理之前,将特定区域划分出来,然后在送入到神经网络进行检测
  • 第二种:在网络处理之后,直接来划分区域的坐标对网络处理后目标进行判定,判定此目标是否在这个区域中,如果在则show,否则则略过

很明显通过第一种方式,网络可以减少很大的计算复杂度,因为不用将整张图片送入到网络中进行处理。

代码

这个代码是直接通过对特定区域结合OpenCV自带人脸检测器来进行人脸检测。若区域内,目标则被检测,超过区域则不被记录。

import cv2

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
# 定义感兴趣区域的坐标和大小
roi_x = 200
roi_y = 100
roi_width = 300
roi_height = 300

while True:
    # 读取一帧图像
    ret, frame = cap.read()
    if not ret:
        print("无法读取摄像头图像")
        break

    # 获取感兴趣区域
    roi = frame[roi_y:roi_y+roi_height, roi_x:roi_x+roi_width]

    # 将感兴趣区域转换为灰度图像
    gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)

    # 使用人脸检测器检测人脸区域
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # 在原始图像上绘制感兴趣区域矩形
    cv2.rectangle(frame, (roi_x, roi_y), (roi_x+roi_width, roi_y+roi_height), (255, 0, 0), 2)

    # 在感兴趣区域上绘制人脸区域矩形
    for (x, y, w, h) in faces:
        cv2.rectangle(roi, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # 在窗口中显示图像
    cv2.imshow("Camera", frame)

    if cv2.waitKey(1) == 27:
        break

cap.release()
cv2.destroyAllWindows()

这个代码在上面代码的基础上,加入了鼠标点击事件,用户可以通过自己来划分特定检测区域,划分之后将从整张图片的检测转换为特定区域的检测。

import cv2

def draw_roi(event, x, y, flags, param):
    global roi_x, roi_y, roi_width, roi_height, drawing
    if event == cv2.EVENT_LBUTTONDOWN:
        # 鼠标按下,开始绘制
        roi_x, roi_y = x, y

    elif event == cv2.EVENT_LBUTTONUP:
        # 鼠标释放,结束绘制
        roi_width, roi_height = x - roi_x, y - roi_y
        drawing = True

if __name__ == '__main__':
    # 创建一个全局变量来存储感兴趣区域的坐标和大小
    roi_x, roi_y, roi_width, roi_height = 0, 0, 0, 0
    drawing = False
    over = 0
    cap = cv2.VideoCapture(0)
    # 创建窗口并绑定鼠标事件
    cv2.namedWindow("Camera")
    cv2.setMouseCallback("Camera", draw_roi)
    # 加载人脸检测器
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    while True:
        ret, frame = cap.read()
        if not ret:
            print("无法读取摄像头图像")
            break

        # 如果触发了鼠标事件,则在感兴趣区域上运行人脸检测器
        roi = frame[roi_y:roi_y + roi_height, roi_x:roi_x + roi_width]

        # 在原始图像上绘制感兴趣区域矩形
        cv2.rectangle(frame, (roi_x, roi_y), (roi_x + roi_width, roi_y + roi_height), (255, 0, 0), 2)
        if drawing:
            gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
            faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
            for (x, y, w, h) in faces:
                cv2.rectangle(roi, (x, y), (x + w, y + h), (0, 255, 0), 2)
        else:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
            for (x, y, w, h) in faces:
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

        cv2.imshow("Camera", frame)
        if cv2.waitKey(1) == 27:
            break

    cap.release()
    cv2.destroyAllWindows()

结果

在这里插入图片描述
在这里插入图片描述

目录
相关文章
|
2月前
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
4799 3
|
2月前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
120 1
|
2月前
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
175 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
2月前
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
200 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
2月前
|
Ubuntu Linux C语言
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
本文介绍了在Ubuntu 18.04系统上编译安装OpenCV 3.4.0及其扩展包opencv_contrib 3.4.0的详细步骤,包括下载源码、安装依赖、配置CMake和编译安装,以及常见问题的解决方法。
218 1
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
|
2月前
|
缓存 监控 计算机视觉
视频监控笔记(三):opencv结合ffmpeg获取rtsp摄像头相关信息
本文介绍了如何使用OpenCV结合FFmpeg获取RTSP摄像头信息,包括网络架构、视频监控系统组成、以及如何读取和显示网络摄像头视频流。
64 1
|
2月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
68 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
2月前
|
JSON 数据格式 计算机视觉
Opencv实用笔记(一): 获取并绘制JSON标注文件目标区域(可单独保存目标小图)
本文介绍了如何使用OpenCV和Python根据JSON标注文件获取并绘制目标区域,同时可将裁剪的图像单独保存。通过示例代码,展示了如何读取图片路径、解析JSON标注、绘制标注框并保存裁剪图像的过程。此外,还提供了相关的博客链接,供读者进一步学习。
53 0
|
2月前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
93 0
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
521 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解