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

  • 相关阅读:
    transitiondrawable ImageVIew切换动画
    Android硬件加速
    android PorterDuffXfermode ,PorterDuff.Mode 使用 以及Porter-Duff规则详解
    listview 打对号效果实现
    nrf52832 连接参数更新过程
    Makefile 学习记录一
    W25Q128BV W25Q128FV W25Q128JV 什么区别?
    lwip Packet buffers (PBUF) API 操作 集合
    NRF SDK 中 , C语言 的 一些骚操作 ,记录下
    lwip lwiperf 方法进行性能测试 4.5MB/S
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/13410305.html
Copyright © 2011-2022 走看看