Python+OpenCV调用摄像头实现手势识别图片批量采集与预处理
本文介绍利用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函数进行水平镜像处理,以符合视觉习惯。
以上即为本文的全部内容,希望对读者有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













