• 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()
    

    要点记录:

    1. 当前版本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)
    
    1. 帧宽和高默认为640x480(这是窗口的大小),画面比例为显示器分辨率,例如我的显示器分辨率为1920x1080,则摄像头画面以640x360的大小显示在窗口中央,并用黑边填充上下部分,摄像头画面长宽比似乎无法被改变
    2. read得到的帧(frame )可以视为普通的图像来处理,本质上这个程序就是不断read一张图片并显示在窗口上,因此可以使用opencv有关图像处理的各种函数对frame进行操作并显示,我这里就是使用这个原理裁剪frame,使摄像头画面显示成正方形
    3. 前置摄像头获取的画面是非镜面的,即左手会出现在画面的右侧,此处使用flip进行水平镜像处理
  • 相关阅读:
    bzoj 4897 天赋 有向图的矩阵数定理
    bzoj 4621 Tc605 思想+dp
    bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
    bzoj 4455 [Zjoi2016]小星星 树形dp&容斥
    获取Android设备无线和以太网MAC地址
    Java WebSocket库:https://github.com/TooTallNate/Java-WebSocket
    UsbManager, UsbDevice的简单示例
    Android开发之开机自动启动应用
    使用Microsoft Office 2007将文档转换为PDF
    C/C++实现删除字符串的首尾空格
  • 原文地址:https://www.cnblogs.com/sssaltyfish/p/10656765.html
Copyright © 2020-2023  润新知