快(50%)两步实现yolov5只检测指定区域,屏蔽非检测区域(包含效果视频)

话不多说,直接上效果

# 结果

  1. 屏蔽前

屏蔽前

  1. 屏蔽后

屏蔽后

第一步:制作mask

制作mask的方法有很多种,题主见过用labelme和用鼠标做的,这里推荐用鼠标获取mask多边形的的坐标。

  1. 获取坐标点,这里推荐使用cv2的鼠标事件
import cv2
# 鼠标回调函数
def mouse_callback(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print('Mouse position: ', x, y)
# 读取图像
img = cv2.imread('image.jpg')
# 创建一个窗口
cv2.namedWindow('image')
# 设置鼠标回调函数
cv2.setMouseCallback('image', mouse_callback)
while True:
    # 显示图像
    cv2.imshow('image', img)
    # 等待按键,如果按下'q'键,退出循环
    if cv2.waitKey(0) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()
  1. 获取mask
		# mask的多边形坐标点
        pts = np.array([[0, 0], [0, 1080], [1920, 1080], [1920, 850], [850, 0]], dtype=np.int32)
        # 重塑为形状 (1, -1, 2)
        pts = pts.reshape((-1, 1, 2))
        # 创建一个全黑的掩码
        mask = np.zeros(im0.shape, dtype=np.uint8)
        # 使用白色填充这个多边形
        cv2.fillPoly(mask, [pts], (255, 255, 255))

屏蔽区域如下图黑色部分
在这里插入图片描述

第二步:修改相应的dataloader

题主使用的是offline的视频,因此使用了dataloader中的LoadImages类,如果使用在线视频流,可以修改LoadStreams类相应位置

  1. 找到修改位置
    修改位置一般在最后return 前的letterbox前,题主使用了一个flag来决定是否屏蔽其他区域
  2. 代码修改
# 原来的代码
if self.transforms:
     im = self.transforms(im0)  # transforms
else:
     im = letterbox(im0, self.img_size, stride=self.stride, auto=self.auto)[0]  # padded resize
     im = im.transpose((2, 0, 1))[::-1]  # HWC to CHW, BGR to RGB
     im = np.ascontiguousarray(im)  # contiguous
#修改后的代码
flag = 0
if flag:
 	# 关建行,使用位与运算来将黑色区域屏蔽掉
     mask_im = cv2.bitwise_and(im0, mask)
     if self.transforms:
         im = self.transforms(mask_im)  # transforms
     else:
         im = letterbox(mask_im, self.img_size, stride=self.stride, auto=self.auto)[0]  # padded resize
         im = im.transpose((2, 0, 1))[::-1]  # HWC to CHW, BGR to RGB
         im = np.ascontiguousarray(im)  # contiguous
 else:
     if self.transforms:
         im = self.transforms(im0)  # transforms
     else:
         im = letterbox(im0, self.img_size, stride=self.stride, auto=self.auto)[0]  # padded resize
         im = im.transpose((2, 0, 1))[::-1]  # HWC to CHW, BGR to RGB
         im = np.ascontiguousarray(im)  # contiguous

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值