[工具]-python利用opencv将视频中多个感兴趣区域分别截取下来,实现一段视频中分别提取不同感兴趣ROI的子视频

简介

算是之前一个版本的升级版本,具体原理参考
https://blog.csdn.net/ai_faker/article/details/115495422?spm=1001.2014.3001.5501


功能介绍

输入:一段视频
输出:该段视频中我们感兴趣的几个区域


例子演示

在这里插入图片描述
输出保存为
在这里插入图片描述


使用说明

代码运行后会弹出一个窗口界面,我们在这个窗口界面进行子视频输出区域选取

  • 1.点击屏幕,第一个点代表着想要输出子区域1的左上角,第二个点代表想要输出子区域1的右下角,两个点确定一个输出子区域
  • 2.点击屏幕,第三个点代表着想要输出子区域2的左上角,第四个点代表想要输出子区域2的右下角,两个点确定一个输出子区域
  • 3.以此类推,子区域3…子区域4…
  • 确定完全部想要输出子区域后,单击空格键完成选择。

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

代码附录

import cv2
import numpy as np

### auther:cheng
### time:20210410

import cv2
import numpy as np


def OnMouseAction(event,x,y,flags,param):
    global coor_x, coor_y, coor, num_list_pro, num_list
    global counter
    if event == cv2.EVENT_LBUTTONDOWN:
        counter = counter + 1                               # 每点击一次计数器+1
        if(counter % 2 == 0):                               # 每两个点更新一下pro值        
            num_list_pro += 2
            num_list.append(num_list_pro)                   # 得到列表 [1,3,5]
        coor_x ,coor_y = x ,y
        coor_m = [coor_x,coor_y]
        coor = np.row_stack((coor,coor_m))
    elif event==cv2.EVENT_LBUTTONUP:
        cv2.line(img, (coor_x, coor_y), (coor_x, coor_y), (255, 255, 0), 7)

def video_info(camera, fps):
    if (camera.isOpened()):                               # 判断视频是否成功打开
        print('视频已打开')
    else:
        print('视频打开失败!')
    print('视频帧率:%d fps' %fps)                          # 获取视频帧率
    size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
            int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    print ('原视频尺寸:'+str(size))                         # 输出视频尺寸

def get_chosse_action(img, OnMouseAction):
    while True:
        cv2.imshow('IImage',img)
        cv2.setMouseCallback('IImage',OnMouseAction)
        k = cv2.waitKey(1) & 0xFF
        if k == ord(' '):                                 # 空格完成退出操作
            break
    cv2.destroyAllWindows()                               # 关闭页面


def output_choose_vedio(fourcc, fps, coor, frame, num_i, out):
    # Width_choose = coor[num_i+1,0]-coor[num_i,0]
    # Height_choose = coor[num_i+1, 1] - coor[num_i, 1]
    # out = cv2.VideoWriter('output_test%d.avi' %int(num_i / 2),fourcc, fps, (Width_choose,Height_choose))
    Video_choose = frame[coor[num_i,1]:coor[num_i+1,1],coor[num_i,0]:coor[num_i+1,0]]
    out.write(Video_choose)
    cv2.imshow('Video_choose %d' %int(num_i / 2), Video_choose)
    cv2.rectangle(frame, tuple(coor[num_i,:]), tuple(coor[num_i +1,:]), (0, 255, 0), 2) 




coor_x,coor_y = -1, 0                   # 初始值并无意义,只是先定义一下供后面的global赋值改变用于全局变量
coor = np.array([[1,1]])

counter = 0                             # 计数器
num_list_pro = -1                       # 生成每个num_i,每两个点生成
num_list = []                           # 将得到的num_i 存入列表,最后的形式[1,3,5,7·····]
out_list = []



fourcc = cv2.VideoWriter_fourcc(*'XVID')                        # 使用XVID编码器
camera = cv2.VideoCapture('/home/cheng/Downloads/data.mp4')         # 从文件读取视频,Todo:只需要修改成自己的视频路径即可进行测试
fps = camera.get(cv2.CAP_PROP_FPS)                              # 获取视频帧率
grabbed, img = camera.read()                                    # 逐帧采集视频流
video_info(camera, fps)
get_chosse_action(img, OnMouseAction)


def main():
    for value in num_list:
        Width_choose = coor[value+1,0]-coor[value,0]
        Height_choose = coor[value+1, 1] - coor[value, 1]
        out = cv2.VideoWriter('output_test%d.avi' %int(value / 2),fourcc, fps, (Width_choose,Height_choose))
        print(out)
        out_list.append(out)

    while True:
        grabbed, frame = camera.read()                                                      # 逐帧采集视频流,如果读取结束则退出
        if not grabbed:
            break
        
        for value in num_list:
            out = out_list[int(value / 2)]
            output_choose_vedio(fourcc, fps, coor, frame, value, out)
                                                                             

        cv2.imshow('video', frame)                                                          # 显示采集到的视频流
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):                                                                 # 按Q推出
            break

    # out.release()
    camera.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

转载请备本博客链接

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值