From b00e6fe55dd4be42fc288243fd8cb586e604eaf8 Mon Sep 17 00:00:00 2001
From: 13339479676 <zyfiy1314@163.com>
Date: Sun, 2 Jan 2022 14:38:46 +0800
Subject: [PATCH] v2 update

---
 .gitignore           |   5 +-
 README.md            |  37 ++++++++++++++
 opencv_webcam_v02.py | 118 ++++++++++++++++++++++++++-----------------
 v02.md               |   8 ++-
 4 files changed, 121 insertions(+), 47 deletions(-)

diff --git a/.gitignore b/.gitignore
index 9ca7e38..8d0cd75 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,7 @@
 *.mp4
 *.avi
 .ipynb_checkpoints
-tutorial02.ipynb
\ No newline at end of file
+tutorial02.ipynb
+
+
+help_test.py
\ No newline at end of file
diff --git a/README.md b/README.md
index 7d16752..90d5531 100644
--- a/README.md
+++ b/README.md
@@ -171,3 +171,40 @@ python opencv_webcam.py -ishsf -isrf -rrf 0.5
 python opencv_webcam.py -fsd custom_dir -isasf # 以自动版为例
 ```
 
+
+
+#### 指令查询
+
+```shell
+python opencv_webcam_v02.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]
+
+OpenCV Webcam Script
+
+optional arguments:
+  -h, --help            show this help message and exit
+  --device DEVICE, -dev DEVICE
+                        device index for webcam
+  --quit QUIT, -q QUIT  quit key for webcam
+  --is_autoSaveFrame, -isasf
+                        is auto save frame
+  --is_headSaveFrame, -ishsf
+                        is head save frame
+  --is_resizeFrame, -isrf
+                        is resize frame
+  --frame_saveDir FRAME_SAVEDIR, -fsd FRAME_SAVEDIR
+                        save frame dir
+  --frame_nSave FRAME_NSAVE, -fns FRAME_NSAVE
+                        n frames save a frame (auto save frame)
+  --frame_capKey FRAME_CAPKEY, -fck FRAME_CAPKEY
+                        frame capture key (head save frame)
+  --resize_frame RESIZE_FRAME [RESIZE_FRAME ...], -rf RESIZE_FRAME [RESIZE_FRAME ...]
+                        resize frame save
+  --resizeRatio_frame RESIZERATIO_FRAME, -rrf RESIZERATIO_FRAME
+                        resize ratio frame save
+```
+
diff --git a/opencv_webcam_v02.py b/opencv_webcam_v02.py
index d1beae9..840668c 100644
--- a/opencv_webcam_v02.py
+++ b/opencv_webcam_v02.py
@@ -11,23 +11,35 @@ 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')
 
-# 保存路径管理 
+    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
@@ -47,47 +59,58 @@ 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) # 帧率
+    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)  # 重塑
+                        cv2.imwrite(
+                            f'./{frame_samePath}/{frame_num}.jpg', frame_new)
                     else:
-                        cv2.imwrite(f'./{frame_samePath}/{frame_num}.jpg', frame)
-            if (is_headSaveFrame): # 手动保存
-                if cv2.waitKey(20) & 0xFF == ord(frame_capKey): # 保存键
-                    if (is_resizeFrame): # 重塑
+                        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)
+                        frame_new = cv2.resize(
+                            frame, (w_resize, h_resize), interpolation=cv2.INTER_AREA)
+                        cv2.imwrite(
+                            f'./{frame_samePath}/{frame_num}.jpg', frame_new)
                     else:
-                        cv2.imwrite(f'./{frame_samePath}/{frame_num}.jpg', frame)
-            if cv2.waitKey(20) & 0xFF == ord(quit_key): # 退出 ord:字符转ASCII码
+                        cv2.imwrite(
+                            f'./{frame_samePath}/{frame_num}.jpg', frame)
+            if cv2.waitKey(20) & 0xFF == ord(quit_key):  # 退出 ord:字符转ASCII码
                 break
         print(f'一共处理了{frame_num}帧')
         # 释放缓存
@@ -96,11 +119,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
@@ -117,6 +141,10 @@ if __name__ == '__main__':
         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(device_index, quit_key, is_autoSaveFrame, frame_saveDir, frame_nSave,
+                      is_headSaveFrame, frame_capKey, is_resizeFrame, resize_frame, resizeRatio_frame)
 
-    print(f'程序结束!')
\ No newline at end of file
+
+if __name__ == '__main__':
+    args = parse_args()
+    main(args)
diff --git a/v02.md b/v02.md
index c21401a..52d0446 100644
--- a/v02.md
+++ b/v02.md
@@ -6,4 +6,10 @@
 
 ### 更新走势
 
-- `2022-01-02` 创建[Jupyter版](./tutorial.ipynb)
\ No newline at end of file
+- `2022-01-02` 创建[Jupyter版](./tutorial.ipynb)
+
+
+
+### 功能更新
+- 增加压缩质量
+- 视频帧重用名
\ No newline at end of file