Python+OpenCV调用摄像头实现手势识别图片批量采集与预处理

认真发呆
认真发呆
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍利用Python和OpenCV库调用摄像头,实现手势识别训练所需图片的批量连续采集。通过设置视频属性、实时裁剪画面为正方形及水平镜像翻转,自动将采集到的图像统一格式并保存,提高数据采集效率。

Python+OpenCV摄像头调用与图片采集背景

在深度学习项目中,若需开发手势识别应用,通常需要大量采集手势图像以进行模型训练。为了简化流程,希望实现快速连续采集图片,并在采集过程中自动将图像统一处理为标准格式。为此,可以使用Python结合OpenCV库调用摄像头,在捕获图像的同时完成格式化处理。

具体实现代码如下:

完整采集与处理代码实现


import cv2
import os

print("=============================================")
print("= 热键(请在摄像头的窗口使用):       =")
print("= z: 更改存储目录             =")
print("= x: 拍摄图片               =")
print("= q: 退出                 =")
print("=============================================")
print()
class_name = input("请输入存储目录:")
while os.path.exists(class_name):
  class_name = input("目录已存在!请输入存储目录:")
os.mkdir(class_name)

index = 1
cap = cv2.VideoCapture(0)
width = 640
height = 480
w = 360
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)

crop_w_start = (width-w)//2
crop_h_start = (height-w)//2

print(width, height)

while True:
  # get a frame
  ret, frame = cap.read()
  # show a frame
  frame = frame[crop_h_start:crop_h_start+w, crop_w_start:crop_w_start+w]
  frame = cv2.flip(frame,1,dst=None)
  cv2.imshow("capture", frame)

  input = cv2.waitKey(1) & 0xFF

  if input == ord('z'):
    class_name = input("请输入存储目录:")
    while os.path.exists(class_name):
      class_name = input("目录已存在!请输入存储目录:")
    os.mkdir(class_name)
  elif input == ord('x'):
    cv2.imwrite("%s/%d.jpeg" % (class_name, index),
          cv2.resize(frame, (224, 224), interpolation=cv2.INTER_AREA))
    print("%s: %d 张图片" % (class_name, index))
    index += 1
  if input == ord('q'):
    break

    
cap.release()
cv2.destroyAllWindows()

关键步骤记录如下:

在当前版本的opencv-python(如3.4.3.18)中,摄像头相关属性通过cv2.XXXX访问,获取和设置函数分别如下(以帧的宽度和高度为例):

摄像头属性获取与设置方法


# 获取
width = int(videoCapture.get(cv2.CV_CAP_PROP_FRAME_WIDTH)
height = int(videoCapture.get(cv2.CV_CAP_PROP_FRAME_HEIGHT)
# 设置
cv2.VideoCapture(0).set(cv2.CAP_PROP_FRAME_WIDTH, width)
cv2.VideoCapture(0).set(cv2.CAP_PROP_FRAME_HEIGHT, height)

画面比例调整与正方形裁剪处理

帧的宽度和高度默认值为640x480(即窗口显示大小)。画面比例取决于显示器分辨率,例如若显示器分辨率为1920x1080,则摄像头画面以640x360的大小居中显示在窗口中,上下部分用黑边填充。需要注意的是,摄像头画面的长宽比似乎无法直接更改。

通过read获取的帧(frame)可视为普通图像进行处理。该程序的核心逻辑是不断读取图片并在窗口中显示,因此可以利用OpenCV提供的图像处理函数对frame进行操作后再显示。本文利用此原理对frame进行裁剪,使摄像头画面显示为正方形。

前置摄像头镜像翻转处理

前置摄像头获取的画面是非镜像的,即左手会出现在画面右侧。此处使用flip函数进行水平镜像处理,以符合视觉习惯。

以上即为本文的全部内容,希望对读者有所帮助,也欢迎大家继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表