zoukankan      html  css  js  c++  java
  • opencv-python读取摄像头

    1获取普通USB相机

    #-*- coding: UTF-8 -*-
    
    
    import numpy as np # 引入numpy 用于矩阵运算
    import cv2 # 引入opencv库函数
    
    ## VideCapture里面的序号
    # 0 : 默认为笔记本上的摄像头(如果有的话) / USB摄像头 webcam
    # 1 : USB摄像头2
    # 2 :USB摄像头3 以此类推
    # -1:代表最新插入的USB设备 
    
    # 创建一个video capture的实例
    cap = cv2.VideoCapture(0)
    
    # 查看Video Capture是否已经打开
    print("摄像头是否已经打开 ? {}".format(cap.isOpened()))
    
    ## 设置画面的尺寸
    # 画面宽度设定为 1920
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
    # 画面高度度设定为 1080
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
    
    ## 创建一个名字叫做 “image_win” 的窗口
    # 窗口属性 flags
    #   * WINDOW_NORMAL:窗口可以放缩
    #   * WINDOW_KEEPRATIO:窗口缩放的过程中保持比率
    #   * WINDOW_GUI_EXPANDED: 使用新版本功能增强的GUI窗口
    cv2.namedWindow('image_win',flags=cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO | cv2.WINDOW_GUI_EXPANDED)
    
    # 图像计数 从1开始
    img_count = 1
    
    # 帮助信息
    helpInfo = '''
    =======阿凯贴心小助手=======
    提示-按键前需要选中当前画面显示的窗口
    
    按键Q: 退出程序
    按键C: Capture 拍照
    '''
    print(helpInfo)
    while(True):
        ## 逐帧获取画面
        # 如果画面读取成功 ret=True,frame是读取到的图片对象(numpy的ndarray格式)
        ret, frame = cap.read()
    
        if not ret:
            # 如果图片没有读取成功
            print("图像获取失败,请按照说明进行问题排查")
            ## 读取失败?问题排查
            # **驱动问题** 有的摄像头可能存在驱动问题,需要安装相关驱动,或者查看摄像头是否有UVC免驱协议
            # **接口兼容性问题** 或者USB2.0接口接了一个USB3.0的摄像头,也是不支持的。
            # **设备挂载问题** 摄像头没有被挂载,如果是虚拟机需要手动勾选设备
            # **硬件问题** 在就是检查一下USB线跟电脑USB接口
            break
    
        ## 颜色空间变换
        # 将BGR彩图变换为灰度图
        # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
        ## 图片镜像
        # * 水平翻转 flipCode = 1
        # * 垂直翻转 flipCode = 0
        # * 同时水平翻转与垂直翻转 flipCode = -1
        # 
        # flipCode = -1
        # frame = cv2.flip(frame, flipCode)
    
        # 更新窗口“image_win”中的图片
        cv2.imshow('image_win',frame)
    
        # 等待按键事件发生 等待1ms
        key = cv2.waitKey(1)
        if key == ord('q'):
            # 如果按键为q 代表quit 退出程序
            print("程序正常退出...Bye 不要想我哦")
            break
        elif key == ord('c'):
            ## 如果c键按下,则进行图片保存
            # 写入图片 并命名图片为 图片序号.png
            cv2.imwrite("{}.png".format(img_count), frame)
            print("截图,并保存为  {}.png".format(img_count))
            # 图片编号计数自增1
            img_count += 1
    
    # 释放VideoCapture
    cap.release()
    # 销毁所有的窗口
    cv2.destroyAllWindows()
    

      

    2获取树莓派官方摄像头

    https://noahzhy.github.io/2018/01/17/%E9%80%9A%E8%BF%87-OpenCV-%E5%92%8C-Python-%E8%AE%BF%E9%97%AE%E6%A0%91%E8%8E%93%E6%B4%BE%E7%9B%B8%E6%9C%BA/

    sudo raspi-config
    

      使用箭头键向下滚动到选项5:启用相机,按回车键启用相机,然后向下箭头至Finish按钮,再次按Enter。最后,你需要重新启动你的 Raspberry Pi 才能使配置生效。

    第三步:测试相机模块

    raspistill -o output.jpg
    

      

    第四步:安装 picamera

    pip install "picamera[array]"
    

      

    注意:我指定了 picamera[array] 而不是 picamera

    当操作 picamera 模块中的方法来和相机交互时,如果我们需要使用 OpenCV,我们需要使用 array 子模块。在 Python 中,OpenCV 的图像格式为 Numpy arrays——而 array 子模块允许我从树莓派相机模块中获取 Numpy arrays。

    第五步:使用 Python 和 OpenCV 访问 Raspberry Pi 的单个图像

    现在,开始编写代码!

    # import the necessary packages
    from picamera.array import PiRGBArray
    from picamera import PiCamera
    import time
    import cv2
     
    # initialize the camera and grab a reference to the raw camera capture
    camera = PiCamera()
    rawCapture = PiRGBArray(camera)
     
    # allow the camera to warmup
    time.sleep(0.1)
     
    # grab an image from the camera
    camera.capture(rawCapture, format="bgr")
    image = rawCapture.array
     
    # display the image on screen and wait for a keypress
    cv2.imshow("Image", image)
    cv2.waitKey(0)
    

      

    第2-5行代码表示导入相关的包。

    第8行代码表示初始化 PiCamera 对象,第9行代码表示获取对原始捕获组件的引用。 这个 rawCapture 对象特别有用,因为:

    1. 可以直接访问相机流。
    2. 避免了压缩流为 JPEG 格式的时间,因为我们最终得到的是 OpenCV 图像格式。
      我强烈推荐在树莓派相机上使用 PiRGBArray 函数——因为它的性能值得一试。

    接下来在第12行,我们 sleep 2秒——为了预热相机模块,必须这样做。

    第15行我们从相机上捕获了一张图片,保存在 rawCapture 对象上,并且明确图像颜色排列为 BGR 而不是 RGB——这是因为 OpenCV 的图像在 Python 中的格式为 BGR 而不是 RGB。这很重要,不注意这个很可能会产生错误的结果。

    最后,第19和第20行展示捕获了的图片。

    第六步:使用 Python 和 OpenCV 访问 Raspberry Pi 的视频流

    好的,现在我们已经学会了如何从 Raspberry Pi 相机中获取单个图像。那么视频流呢?

    你可能会猜想,我们将在这里使用 cv2.VideoCapture 函数——但实际上我建议不要这样做。 把 cv2.VideoCapture 与 Raspberry Pi 配合使用并不是一个好的体验(你需要安装额外的驱动程序),而你通常应该会避免使用它。 另外,当我们可以使用 picamera 模块轻松访问原始视频流时,为什么我们还要去使用 cv2.VideoCapture 函数呢?

    让我们继续看看如何访问视频流。打开一个新文件,命名为 test_video.py,然后插入以下代码:

    # import the necessary packages
    from picamera.array import PiRGBArray
    from picamera import PiCamera
    import time
    import cv2
     
    # initialize the camera and grab a reference to the raw camera capture
    camera = PiCamera()
    camera.resolution = (640, 480)
    camera.framerate = 32
    rawCapture = PiRGBArray(camera, size=(640, 480))
     
    # allow the camera to warmup
    time.sleep(0.1)
     
    # capture frames from the camera
    for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
        # grab the raw NumPy array representing the image, then initialize the timestamp
        # and occupied/unoccupied text
        image = frame.array
     
        # show the frame
        cv2.imshow("Frame", image)
        key = cv2.waitKey(1) & 0xFF
     
        # clear the stream in preparation for the next frame
        rawCapture.truncate(0)
     
        # if the `q` key was pressed, break from the loop
        if key == ord("q"):
            break
    

      

    正如你所看到的,Raspberry Pi 相机的视频流正在被 OpenCV 读取,然后显示在屏幕上!此外,Raspberry Pi 相机在以 32 FPS 的速度访问画面时不会出现滞后现象。 当然,我们并没有对单个帧进行任何处理,但是正如我在博客文章中所展示的那样,即使在处理每个帧时,Pi 2 也可以很容易地保持 24-32 FPS。

    原文:https://www.pyim

  • 相关阅读:
    623. Add One Row to Tree 将一行添加到树中
    771. Jewels and Stones 珠宝和石头
    216. Combination Sum III 组合总数三
    384. Shuffle an Array 随机播放一个数组
    382. Linked List Random Node 链接列表随机节点
    向github项目push代码后,Jenkins实现其自动构建
    centos下安装Jenkins
    python提取批量文件内的指定内容
    批处理实现:批量为文件添加注释
    python抓取每期双色球中奖号码,用于分析
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/13410305.html
Copyright © 2011-2022 走看看