zoukankan      html  css  js  c++  java
  • 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进行水平镜像处理
  • 相关阅读:
    php
    php数据排序---array_multisort
    IOS 线程描述
    IOS 进程描述
    IOS 强指针(strong)和弱指针(weak)
    IOS autosizing(设置控件的固定位置大小)
    IOS UIActivityIndicatorView动画
    IOS UIImageView的帧动画
    IOS Block动画
    IOS UIView动画(封装动画)
  • 原文地址:https://www.cnblogs.com/sssaltyfish/p/10656765.html
Copyright © 2011-2022 走看看