目标检测学习笔记(二)——图片取样及数据集制作

前言

参考:

从视频中提取图片:如何将视频逐帧提取成为一张张图片?

图片重命名:python文件批量改名

制作数据集:睿智的目标检测12——使用labeling进行目标检测数据集标注

批量修改标签名称:如何批量修改Pascal VOC数据集中xml标签中的标签名称

拍摄视频并提取图片

拍摄视频

getvedio.py

'''
python 录制mp4视频 by 郑瑞国
'''
import numpy as np
import cv2

cap = cv2.VideoCapture(0)

## some videowriter props
sz = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
      int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

fps = 20
# fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
# fourcc = cv2.VideoWriter_fourcc('m', 'p', 'e', 'g')
fourcc = cv2.VideoWriter_fourcc(*'mpeg')

## open and set props
out = cv2.VideoWriter()
out.open('getvedio/16.mp4', fourcc, fps, sz, True)

while (True):
    ret, frame = cap.read()
    out.write(frame)
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xff == ord('q'):
        break

out.release()
cap.release()
cv2.destroyAllWindows()

提取图片

方法1:视频帧差法提取图片

frame_extract.py

# -*- coding: utf-8 -*-

import cv2
import numpy as np
import os
import urllib

def frame_difference(frame1, frame2):   #求取侦差
    # f1, f2 
    f1 = cv2.resize(frame1, (416, 416))
    f2 = cv2.resize(frame2, (416, 416))
    f1 = cv2.cvtColor(f1, cv2.COLOR_BGR2GRAY)
    f2 = cv2.cvtColor(f2, cv2.COLOR_BGR2GRAY)                 # 灰度化
    f1 = cv2.threshold(f1, 128, 255, cv2.THRESH_BINARY)[1]    # 二值化
    f2 = cv2.threshold(f2, 128, 255, cv2.THRESH_BINARY)[1]
    
    diff = cv2.absdiff(f1, f2)          #求取差值

    p = cv2.countNonZero(diff) / float(416 * 416)
 
    return p


if __name__ == "__main__":
    root = r'F:\0-0\Myyolo\vedio_img\getvedio'
    threshold = 0.09      #阙值
    frame_interval = 15    #帧间隔
    save_root = r'F:\0-0\Myyolo\vedio_img\getvedio\img'
    
    for c, path in enumerate(os.listdir(root)):
        path = os.path.join(root, path)
        video = cv2.VideoCapture(path)
   

        count = 0
        st, frame1 = video.read() #st,frame是获cv2.VideoCapture.read()方法的两个返回值。
        st, frame2 = video.read() #其中st是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。

        while st:

            if count % frame_interval == 0:
                st, frame2 = video.read()
            
                p = frame_difference(frame1, frame2)  #求取侦差
                print(p)
                
                if p > threshold:
                    save_dir = os.path.join(save_root, os.path.splitext(os.path.basename(path))[0])

                    if not os.path.exists(save_dir):                                        #如果目录不存在
                        os.makedirs(save_dir)   #创建目录

                    print(save_dir)

                    #cv2.imencode(os.path.join(save_dir, str(count)+'.jpg'), frame1)
                    #cv2.imencode(str(count)+'.jpg', frame1)[1].tofile(save_dir)
                    cv2.imwrite(os.path.join(save_dir, str(count) + '.jpg'), frame1)

                    print('保存图片')
                frame1 = frame2
            st, frame2 = video.read()
            count += 1

            if st:
                cv2.imshow("video%d"%c, frame2)  #函数可以在窗口中显示图像。该窗口和图像的原始大小自适应(自动调整到原始尺寸)。
                cv2.waitKey(100)   #是一个和键盘绑定的函数,它的作用是等待一个键盘的输入(因为我们创建的图片窗口如果没有这个函数的话会闪一下就消失了,所以如果需要让它持久输出,我们可以使用该函数)。它的参数是毫秒级。该函数等待任何键盘事件的指定毫秒。如果您在此期间按下任何键,程序将继续进行。我们也可以将其设置为一个特定的键。

        video.release()           #发布软件资源  /  释放硬件资源
        cv2.destroyAllWindows()   #销毁我们创建的所有窗口。如果要销毁任何特定窗口,请使用函数cv2.destroyWindow(),其中传递确切的窗口名称作为参数。(应该是使用创建窗口时所使用的窗口名称,字符串类型。)

        print("video%d"%c, "done!")

        

方法2:定时从视频截图

使用img_extract.py

# 每隔 多少 秒 提取视频中的图片到文件夹


# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.


def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    print(f'Hi, {name}')  # Press Ctrl+F8 to toggle the breakpoint.


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    print_hi('PyCharm')

# See PyCharm help at https://www.jetbrains.com/help/pycharm/
# -*- coding: utf-8 -*-
import os
import cv2    ##加载OpenCV模块

def video2frames(pathIn: object = '',
                 pathOut: object = '',
                 only_output_video_info: object = False,
                 extract_time_points: object = None,
                 initial_extract_time: object 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值