opencv webcam script v02 update

This commit is contained in:
13339479676 2022-01-02 15:46:29 +08:00
parent 917df2152f
commit 0bf2dbd722
3 changed files with 150 additions and 263 deletions

View File

@ -176,12 +176,13 @@ python opencv_webcam.py -fsd custom_dir -isasf # 以自动版为例
#### 指令查询
```shell
python opencv_webcam_v02.py --help
python opencv_webcam.py --help
```
```shell
usage: opencv_webcam_v02.py [-h] [--device DEVICE] [--quit QUIT] [--is_autoSaveFrame] [--is_headSaveFrame] [--is_resizeFrame] [--frame_saveDir FRAME_SAVEDIR] [--frame_nSave FRAME_NSAVE]
[--frame_capKey FRAME_CAPKEY] [--resize_frame RESIZE_FRAME [RESIZE_FRAME ...]] [--resizeRatio_frame RESIZERATIO_FRAME]
usage: opencv_webcam.py [-h] [--device DEVICE] [--quit QUIT] [--is_autoSaveFrame] [--is_headSaveFrame] [--is_resizeFrame] [--frame_saveDir FRAME_SAVEDIR] [--frame_nSave FRAME_NSAVE]
[--frame_capKey FRAME_CAPKEY] [--resize_frame RESIZE_FRAME [RESIZE_FRAME ...]] [--resizeRatio_frame RESIZERATIO_FRAME] [--frame_namePrefix FRAME_NAMEPREFIX]
[--frame_saveStyle FRAME_SAVESTYLE] [--jpg_quality JPG_QUALITY] [--png_quality PNG_QUALITY]
OpenCV Webcam Script
@ -206,5 +207,13 @@ optional arguments:
resize frame save
--resizeRatio_frame RESIZERATIO_FRAME, -rrf RESIZERATIO_FRAME
resize ratio frame save
--frame_namePrefix FRAME_NAMEPREFIX, -fnp FRAME_NAMEPREFIX
frame name prefix
--frame_saveStyle FRAME_SAVESTYLE, -fss FRAME_SAVESTYLE
frame save style
--jpg_quality JPG_QUALITY, -jq JPG_QUALITY
frame save jpg quality (0-100) default 95
--png_quality PNG_QUALITY, -pq PNG_QUALITY
frame save jpg quality (0-9) default 3
```

View File

@ -1,6 +1,6 @@
# OpenCV Webcam Script v0.1
# OpenCV Webcam Script v0.2
# 创建人:曾逸夫
# 创建时间2021-12-26
# 创建时间2022-01-02
import cv2
from pathlib import Path
@ -11,23 +11,43 @@ import glob
import re
import os
def parse_args(argv=None):
parser = argparse.ArgumentParser(description = 'OpenCV Webcam Script')
parser.add_argument('--device','-dev', default = 0, type = int, help = 'device index for webcam')
parser.add_argument('--quit','-q', default = "q", type = str, help = 'quit key for webcam')
parser.add_argument('--is_autoSaveFrame', '-isasf', action='store_true', help = 'is auto save frame')
parser.add_argument('--is_headSaveFrame', '-ishsf', action='store_true', help = 'is head save frame')
parser.add_argument('--is_resizeFrame', '-isrf', action='store_true', help = 'is resize frame')
parser.add_argument('--frame_saveDir', '-fsd', default = "./WebcamFrame", type = str, help = 'save frame dir')
parser.add_argument('--frame_nSave', '-fns', default = 1, type = int, help = 'n frames save a frame (auto save frame)')
parser.add_argument('--frame_capKey', '-fck', default = "a", type = str, help = 'frame capture key (head save frame)')
parser.add_argument('--resize_frame', '-rf', default = [640, 480], type = int, nargs = '+', help = 'resize frame save')
parser.add_argument('--resizeRatio_frame', '-rrf', default = 1.0, type = float, help = 'resize ratio frame save')
global args
args = parser.parse_args(argv)
def parse_args(known=False):
parser = argparse.ArgumentParser(description='OpenCV Webcam Script')
parser.add_argument('--device', '-dev', default=0,
type=int, help='device index for webcam')
parser.add_argument('--quit', '-q', default="q",
type=str, help='quit key for webcam')
parser.add_argument('--is_autoSaveFrame', '-isasf',
action='store_true', help='is auto save frame')
parser.add_argument('--is_headSaveFrame', '-ishsf',
action='store_true', help='is head save frame')
parser.add_argument('--is_resizeFrame', '-isrf',
action='store_true', help='is resize frame')
parser.add_argument('--frame_saveDir', '-fsd',
default="./WebcamFrame", type=str, help='save frame dir')
parser.add_argument('--frame_nSave', '-fns', default=1,
type=int, help='n frames save a frame (auto save frame)')
parser.add_argument('--frame_capKey', '-fck', default="a",
type=str, help='frame capture key (head save frame)')
parser.add_argument('--resize_frame', '-rf',
default=[640, 480], type=int, nargs='+', help='resize frame save')
parser.add_argument('--resizeRatio_frame', '-rrf',
default=1.0, type=float, help='resize ratio frame save')
parser.add_argument('--frame_namePrefix', '-fnp',
default="frame", type=str, help='frame name prefix')
parser.add_argument('--frame_saveStyle', '-fss',
default="jpg", type=str, help='frame save style')
parser.add_argument('--jpg_quality', '-jq',
default=95, type=int, help='frame save jpg quality (0-100) default 95')
parser.add_argument('--png_quality', '-pq',
default=3, type=int, help='frame save jpg quality (0-9) default 3')
# 保存路径管理
args = parser.parse_known_args()[0] if known else parser.parse_args()
return args
# 保存路径管理
def increment_path(path, exist_ok=False, sep='', mkdir=False):
# 引用https://github.com/ultralytics/yolov5/blob/master/utils/general.py
path = Path(path) # os-agnostic
@ -46,49 +66,106 @@ def increment_path(path, exist_ok=False, sep='', mkdir=False):
# webcam opencv
def webcam_opencv(device_index, quit_key, is_autoSaveFrame, frame_saveDir, frame_nSave, is_headSaveFrame, frame_capKey, is_resizeFrame, resize_frame, resizeRatio_frame):
cap = cv2.VideoCapture(device_index) # 连接设备
frame_width = cap.get(3) # 宽度
frame_height = cap.get(4) # 高度
fps = cap.get(5) # 帧率
def webcam_opencv(device_index, quit_key, is_autoSaveFrame, frame_saveDir, frame_nSave, is_headSaveFrame,
frame_capKey, is_resizeFrame, resize_frame, resizeRatio_frame, frame_namePrefix, frame_saveStyle,
jpg_quality, png_quality):
if (quit_key == frame_capKey): # 判断快捷键冲突
print(f'快捷键冲突! 程序结束!')
return
s_time = time.time() # 起始时间
cap = cv2.VideoCapture(device_index) # 连接设备
frame_width = cap.get(3) # 宽度
frame_height = cap.get(4) # 高度
fps = cap.get(5) # 帧率
print(f'宽度:{frame_width}, 高度:{frame_height} FPS{fps}')
success, _ = cap.read() # 读取设备
success, _ = cap.read() # 读取设备
if success:
print(f'摄像头连接成功!')
if is_autoSaveFrame or is_headSaveFrame:
# 帧保存路径管理
frame_samePath = increment_path(Path(f"{frame_saveDir}") / "frames", exist_ok=False) # 增量运行
frame_samePath = increment_path(
Path(f"{frame_saveDir}") / "frames", exist_ok=False) # 增量运行
frame_samePath.mkdir(parents=True, exist_ok=True) # 创建目录
frame_num = 0 # 帧数
frame_num = 0 # 帧数
while(1):
ret, frame = cap.read() # 捕获画面
ret, frame = cap.read() # 捕获画面
frame_num += 1
print(f'{frame_num}')
cv2.imshow("capture", frame) # 显示画面
cv2.imshow("capture", frame) # 显示画面
# print(frame.shape) # h,w,c
if (is_autoSaveFrame): # 自动保存
if (frame_num % frame_nSave == 0): # 每隔n帧保存一次
if (is_resizeFrame): # resize frame
w_resize = int(resize_frame[0] * resizeRatio_frame) # 重塑宽度
h_resize = int(resize_frame[1] * resizeRatio_frame) # 重塑高度
frame_new = cv2.resize(frame, (w_resize, h_resize), interpolation = cv2.INTER_AREA) # 重塑
cv2.imwrite(f'./{frame_samePath}/{frame_num}.jpg', frame_new)
if (is_autoSaveFrame): # 自动保存
if (frame_num % frame_nSave == 0): # 每隔n帧保存一次
if (is_resizeFrame): # resize frame
w_resize = int(
resize_frame[0] * resizeRatio_frame) # 重塑宽度
h_resize = int(
resize_frame[1] * resizeRatio_frame) # 重塑高度
frame_new = cv2.resize(
frame, (w_resize, h_resize), interpolation=cv2.INTER_AREA) # 重塑
if (frame_saveStyle == 'jpg'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame_new,
[int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])
if (frame_saveStyle == 'png'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame_new,
[int(cv2.IMWRITE_PNG_COMPRESSION), png_quality])
else:
print(f'帧格式有问题!')
return
else:
cv2.imwrite(f'./{frame_samePath}/{frame_num}.jpg', frame)
if (is_headSaveFrame): # 手动保存
if cv2.waitKey(20) & 0xFF == ord(frame_capKey): # 保存键
if (is_resizeFrame): # 重塑
w_resize = int(resize_frame[0] * resizeRatio_frame)
h_resize = int(resize_frame[1] * resizeRatio_frame)
frame_new = cv2.resize(frame, (w_resize, h_resize), interpolation = cv2.INTER_AREA)
cv2.imwrite(f'./{frame_samePath}/{frame_num}.jpg', frame_new)
if (frame_saveStyle == 'jpg'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame,
[int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])
if (frame_saveStyle == 'png'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame,
[int(cv2.IMWRITE_PNG_COMPRESSION), png_quality])
else:
print(f'帧格式有问题!')
return
if (is_headSaveFrame): # 手动保存
if cv2.waitKey(20) & 0xFF == ord(frame_capKey): # 保存键
if (is_resizeFrame): # 重塑
w_resize = int(
resize_frame[0] * resizeRatio_frame) # 重塑宽度
h_resize = int(
resize_frame[1] * resizeRatio_frame) # 重塑高度
frame_new = cv2.resize(
frame, (w_resize, h_resize), interpolation=cv2.INTER_AREA)
if (frame_saveStyle == 'jpg'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame_new,
[int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])
if (frame_saveStyle == 'png'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame_new,
[int(cv2.IMWRITE_PNG_COMPRESSION), png_quality])
else:
print(f'帧格式有问题!')
return
else:
cv2.imwrite(f'./{frame_samePath}/{frame_num}.jpg', frame)
if cv2.waitKey(20) & 0xFF == ord(quit_key): # 退出 ord字符转ASCII码
if (frame_saveStyle == 'jpg'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame,
[int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])
if (frame_saveStyle == 'png'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame,
[int(cv2.IMWRITE_PNG_COMPRESSION), png_quality])
else:
print(f'帧格式有问题!')
return
if cv2.waitKey(20) & 0xFF == ord(quit_key): # 退出 ord字符转ASCII码
break
print(f'一共处理了{frame_num}')
# 释放缓存
cap.release()
@ -96,11 +173,12 @@ def webcam_opencv(device_index, quit_key, is_autoSaveFrame, frame_saveDir, frame
else:
print(f'摄像头连接异常!')
print(f'程序结束!')
e_time = time.time() # 终止时间
print(f'用时:{round((e_time - s_time), 3)}秒, {round((e_time - s_time)/60, 3)}分, {round((e_time - s_time)/3600, 3)}小时')
if __name__ == '__main__':
# 参数
parse_args()
def main(args):
device_index = args.device
quit_key = args.quit
is_autoSaveFrame = args.is_autoSaveFrame
@ -111,12 +189,17 @@ if __name__ == '__main__':
resize_frame = args.resize_frame
is_resizeFrame = args.is_resizeFrame
resizeRatio_frame = args.resizeRatio_frame
frame_namePrefix = args.frame_namePrefix
frame_saveStyle = args.frame_saveStyle
jpg_quality = args.jpg_quality
png_quality = args.png_quality
# 判断快捷键冲突
if (quit_key == frame_capKey):
print(f'快捷键冲突!')
else:
# 调用webcam opencv
webcam_opencv(device_index, quit_key, is_autoSaveFrame, frame_saveDir, frame_nSave, is_headSaveFrame, frame_capKey, is_resizeFrame, resize_frame, resizeRatio_frame)
# 调用webcam opencv
webcam_opencv(device_index, quit_key, is_autoSaveFrame, frame_saveDir, frame_nSave,
is_headSaveFrame, frame_capKey, is_resizeFrame, resize_frame, resizeRatio_frame,
frame_namePrefix, frame_saveStyle, jpg_quality, png_quality)
print(f'程序结束!')
if __name__ == '__main__':
args = parse_args()
main(args)

View File

@ -1,205 +0,0 @@
# OpenCV Webcam Script v0.2
# 创建人:曾逸夫
# 创建时间2022-01-02
import cv2
from pathlib import Path
import argparse
import time
import os
import glob
import re
import os
def parse_args(known=False):
parser = argparse.ArgumentParser(description='OpenCV Webcam Script')
parser.add_argument('--device', '-dev', default=0,
type=int, help='device index for webcam')
parser.add_argument('--quit', '-q', default="q",
type=str, help='quit key for webcam')
parser.add_argument('--is_autoSaveFrame', '-isasf',
action='store_true', help='is auto save frame')
parser.add_argument('--is_headSaveFrame', '-ishsf',
action='store_true', help='is head save frame')
parser.add_argument('--is_resizeFrame', '-isrf',
action='store_true', help='is resize frame')
parser.add_argument('--frame_saveDir', '-fsd',
default="./WebcamFrame", type=str, help='save frame dir')
parser.add_argument('--frame_nSave', '-fns', default=1,
type=int, help='n frames save a frame (auto save frame)')
parser.add_argument('--frame_capKey', '-fck', default="a",
type=str, help='frame capture key (head save frame)')
parser.add_argument('--resize_frame', '-rf',
default=[640, 480], type=int, nargs='+', help='resize frame save')
parser.add_argument('--resizeRatio_frame', '-rrf',
default=1.0, type=float, help='resize ratio frame save')
parser.add_argument('--frame_namePrefix', '-fnp',
default="frame", type=str, help='frame name prefix')
parser.add_argument('--frame_saveStyle', '-fss',
default="jpg", type=str, help='frame save style')
parser.add_argument('--jpg_quality', '-jq',
default=95, type=int, help='frame save jpg quality (0-100) default 95')
parser.add_argument('--png_quality', '-pq',
default=3, type=int, help='frame save jpg quality (0-9) default 3')
args = parser.parse_known_args()[0] if known else parser.parse_args()
return args
# 保存路径管理
def increment_path(path, exist_ok=False, sep='', mkdir=False):
# 引用https://github.com/ultralytics/yolov5/blob/master/utils/general.py
path = Path(path) # os-agnostic
if path.exists() and not exist_ok:
suffix = path.suffix
path = path.with_suffix('')
dirs = glob.glob(f"{path}{sep}*") # similar paths
matches = [re.search(rf"%s{sep}(\d+)" % path.stem, d) for d in dirs]
i = [int(m.groups()[0]) for m in matches if m] # indices
n = max(i) + 1 if i else 2 # increment number
path = Path(f"{path}{sep}{n}{suffix}") # update path
dir = path if path.suffix == '' else path.parent # directory
if not dir.exists() and mkdir:
dir.mkdir(parents=True, exist_ok=True) # make directory
return path
# webcam opencv
def webcam_opencv(device_index, quit_key, is_autoSaveFrame, frame_saveDir, frame_nSave, is_headSaveFrame,
frame_capKey, is_resizeFrame, resize_frame, resizeRatio_frame, frame_namePrefix, frame_saveStyle,
jpg_quality, png_quality):
if (quit_key == frame_capKey): # 判断快捷键冲突
print(f'快捷键冲突! 程序结束!')
return
s_time = time.time() # 起始时间
cap = cv2.VideoCapture(device_index) # 连接设备
frame_width = cap.get(3) # 宽度
frame_height = cap.get(4) # 高度
fps = cap.get(5) # 帧率
print(f'宽度:{frame_width}, 高度:{frame_height} FPS{fps}')
success, _ = cap.read() # 读取设备
if success:
print(f'摄像头连接成功!')
if is_autoSaveFrame or is_headSaveFrame:
# 帧保存路径管理
frame_samePath = increment_path(
Path(f"{frame_saveDir}") / "frames", exist_ok=False) # 增量运行
frame_samePath.mkdir(parents=True, exist_ok=True) # 创建目录
frame_num = 0 # 帧数
while(1):
ret, frame = cap.read() # 捕获画面
frame_num += 1
print(f'{frame_num}')
cv2.imshow("capture", frame) # 显示画面
# print(frame.shape) # h,w,c
if (is_autoSaveFrame): # 自动保存
if (frame_num % frame_nSave == 0): # 每隔n帧保存一次
if (is_resizeFrame): # resize frame
w_resize = int(
resize_frame[0] * resizeRatio_frame) # 重塑宽度
h_resize = int(
resize_frame[1] * resizeRatio_frame) # 重塑高度
frame_new = cv2.resize(
frame, (w_resize, h_resize), interpolation=cv2.INTER_AREA) # 重塑
if (frame_saveStyle == 'jpg'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame_new,
[int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])
if (frame_saveStyle == 'png'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame_new,
[int(cv2.IMWRITE_PNG_COMPRESSION), png_quality])
else:
print(f'帧格式有问题!')
return
else:
if (frame_saveStyle == 'jpg'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame,
[int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])
if (frame_saveStyle == 'png'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame,
[int(cv2.IMWRITE_PNG_COMPRESSION), png_quality])
else:
print(f'帧格式有问题!')
return
if (is_headSaveFrame): # 手动保存
if cv2.waitKey(20) & 0xFF == ord(frame_capKey): # 保存键
if (is_resizeFrame): # 重塑
w_resize = int(
resize_frame[0] * resizeRatio_frame) # 重塑宽度
h_resize = int(
resize_frame[1] * resizeRatio_frame) # 重塑高度
frame_new = cv2.resize(
frame, (w_resize, h_resize), interpolation=cv2.INTER_AREA)
if (frame_saveStyle == 'jpg'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame_new,
[int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])
if (frame_saveStyle == 'png'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame_new,
[int(cv2.IMWRITE_PNG_COMPRESSION), png_quality])
else:
print(f'帧格式有问题!')
return
else:
if (frame_saveStyle == 'jpg'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame,
[int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])
if (frame_saveStyle == 'png'):
cv2.imwrite(
f'./{frame_samePath}/{frame_namePrefix}-{frame_num}.{frame_saveStyle}', frame,
[int(cv2.IMWRITE_PNG_COMPRESSION), png_quality])
else:
print(f'帧格式有问题!')
return
if cv2.waitKey(20) & 0xFF == ord(quit_key): # 退出 ord字符转ASCII码
break
print(f'一共处理了{frame_num}')
# 释放缓存
cap.release()
cv2.destroyAllWindows()
else:
print(f'摄像头连接异常!')
print(f'程序结束!')
e_time = time.time() # 终止时间
print(f'用时:{round((e_time - s_time), 3)}秒, {round((e_time - s_time)/60, 3)}分, {round((e_time - s_time)/3600, 3)}小时')
def main(args):
device_index = args.device
quit_key = args.quit
is_autoSaveFrame = args.is_autoSaveFrame
is_headSaveFrame = args.is_headSaveFrame
frame_saveDir = args.frame_saveDir
frame_nSave = args.frame_nSave
frame_capKey = args.frame_capKey
resize_frame = args.resize_frame
is_resizeFrame = args.is_resizeFrame
resizeRatio_frame = args.resizeRatio_frame
frame_namePrefix = args.frame_namePrefix
frame_saveStyle = args.frame_saveStyle
jpg_quality = args.jpg_quality
png_quality = args.png_quality
# 调用webcam opencv
webcam_opencv(device_index, quit_key, is_autoSaveFrame, frame_saveDir, frame_nSave,
is_headSaveFrame, frame_capKey, is_resizeFrame, resize_frame, resizeRatio_frame,
frame_namePrefix, frame_saveStyle, jpg_quality, png_quality)
if __name__ == '__main__':
args = parse_args()
main(args)