网站建设与规划实验心得,网站建站程序,连云港网站排名优化,投资公司网站设计文章目录 背景代码结果 背景
由于我们在做项目的时候可能会涉及到某个指定区域进行目标检测或者人脸识别等任务#xff0c;所以这篇博客是为了探究如何在传统目标检测的基础上来结合特定区域进行检测#xff0c;以OpenCV自带的包为例。
一般来说有两种方式实现区域指定所以这篇博客是为了探究如何在传统目标检测的基础上来结合特定区域进行检测以OpenCV自带的包为例。
一般来说有两种方式实现区域指定
第一种在网络处理之前将特定区域划分出来然后在送入到神经网络进行检测第二种在网络处理之后直接来划分区域的坐标对网络处理后目标进行判定判定此目标是否在这个区域中如果在则show否则则略过
很明显通过第一种方式网络可以减少很大的计算复杂度因为不用将整张图片送入到网络中进行处理。
代码
这个代码是直接通过对特定区域结合OpenCV自带人脸检测器来进行人脸检测。若区域内目标则被检测超过区域则不被记录。
import cv2face_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 300while True:# 读取一帧图像ret, frame cap.read()if not ret:print(无法读取摄像头图像)break# 获取感兴趣区域roi frame[roi_y:roi_yroi_height, roi_x:roi_xroi_width]# 将感兴趣区域转换为灰度图像gray cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)# 使用人脸检测器检测人脸区域faces face_cascade.detectMultiScale(gray, scaleFactor1.1, minNeighbors5, minSize(30, 30))# 在原始图像上绘制感兴趣区域矩形cv2.rectangle(frame, (roi_x, roi_y), (roi_xroi_width, roi_yroi_height), (255, 0, 0), 2)# 在感兴趣区域上绘制人脸区域矩形for (x, y, w, h) in faces:cv2.rectangle(roi, (x, y), (xw, yh), (0, 255, 0), 2)# 在窗口中显示图像cv2.imshow(Camera, frame)if cv2.waitKey(1) 27:breakcap.release()
cv2.destroyAllWindows()这个代码在上面代码的基础上加入了鼠标点击事件用户可以通过自己来划分特定检测区域划分之后将从整张图片的检测转换为特定区域的检测。
import cv2def draw_roi(event, x, y, flags, param):global roi_x, roi_y, roi_width, roi_height, drawingif event cv2.EVENT_LBUTTONDOWN:# 鼠标按下开始绘制roi_x, roi_y x, yelif event cv2.EVENT_LBUTTONUP:# 鼠标释放结束绘制roi_width, roi_height x - roi_x, y - roi_ydrawing Trueif __name__ __main__:# 创建一个全局变量来存储感兴趣区域的坐标和大小roi_x, roi_y, roi_width, roi_height 0, 0, 0, 0drawing Falseover 0cap 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, scaleFactor1.1, minNeighbors5, 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, scaleFactor1.1, minNeighbors5, 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:breakcap.release()cv2.destroyAllWindows()结果