<button id="ssm6u"><optgroup id="ssm6u"></optgroup></button>
  • 跳轉至

    OpenCV讀入USB攝像頭拍攝的畫面

    概要

    本文演示了使用opencv從USB攝像頭讀取視頻流,并通過HighGUI實時顯示畫面。

    opencv讀取usb攝像頭的視頻流, 需要用到VideoCapture 類, 此文章提供了VideoCapture的基礎操作。如果你在操作過程中,攝像頭讀取失敗, 阿凱還為你提供了問題排查手冊。

    鏡頭焦距與光圈調節

    keywords USB攝像頭 圖像鏡像 視頻流讀取

    1.完整源代碼與演示效果

    OpenCV讀取視頻并通過HighGUI展示

    #-*- coding: UTF-8 -*-
    '''
    代碼功能描述
        從攝像頭逐幀(frame-by-frame)讀入圖片并通過HighGUI展示
    作者
        阿凱@1Z實驗室
    教程網站
        www.1z1b.com
    相關課程
    
        * 通過HIGH GUI展示圖片
    
        * 圖像基礎變換(仿射變換)
    '''
    
    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. VideoCapture的實例化與釋放

    opencv讀取usb攝像頭的視頻流, 需要用到VideoCapture 類。

    創建VideoCapture 對象的時候,我們需要傳入一個合適的攝像頭編號。

    編號參照上一篇文章:Ubuntu下查看USB攝像頭設備列表與視頻讀取

    ## VideCapture里面的序號
    # 0 : 默認為筆記本上的攝像頭(如果有的話) / USB攝像頭 webcam
    # 1 : USB攝像頭2
    # 2 :USB攝像頭3 以此類推
    # -1:代表最新插入的USB設備 
    
    # 創建一個video capture的實例
    cap = cv2.VideoCapture(0)
    

    在代碼最后,需要釋放VideoCapture

    # 釋放VideoCapture
    cap.release()
    

    3. VideoCapture屬性簡單設置

    VideoCapture一共有18個屬性可以查看或者修改。 一部分是讀取視頻流的, 另一部分是讀取視頻的。

    這里我們只用到了兩個基本的設定, 設定獲取圖像分辨率。

    阿凱查看手中的200萬寬動態攝像頭]的參數,查到攝像頭支持的最高分辨率是1920*1080, 所以我們設定參數的時候設成最大值,也就是最清晰的模式。

    ## 設置畫面的尺寸
    # 畫面寬度設定為 1920
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
    # 畫面高度度設定為 1080
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
    

    分辨率的設定會影響幀率,分辨率越大,幀率也就越低, 所以需要在兩者之間進行權衡。

    4. 讀入圖片read

    ## 逐幀獲取畫面
    # 如果畫面讀取成功 ret=True,frame是讀取到的圖片對象(numpy的ndarray格式)
    ret, frame = cap.read()
    

    根據ret我們可以知道圖片有沒有被正確讀入。

    如果失敗,我們可以選擇跳過(也有可能是圖片傳輸有損),或者直接退出程序。

    if not ret:
        # 如果圖片沒有讀取成功
        print("圖像獲取失敗,請按照說明進行問題排查")
        break
    

    5.攝像頭讀取失敗-問題排查

    如果你運行上文的源代碼的時候,出現報錯。

    你可以按照下面提供的思路自行檢查一下。

    1. 驅動問題 有的攝像頭可能存在驅動問題,需要安裝相關驅動,或者查看攝像頭是否具有UAC免驅協議.

    2. USB接口兼容性問題 或者USB2.0接口接了一個USB3.0的攝像頭,也是不支持的。

    3. 設備掛載問題 攝像頭沒有被掛載,如果是虛擬機需要手動勾選設備

    4. 硬件問題 在就是檢查一下USB線跟電腦USB接口

    5. 視頻壓縮格式的問題 部分視頻壓縮格式在OpenCV中不支持。

    如果還是沒有解決,可以在文章下方給我留言, 問題排查手冊會根據學員的反饋持續更新。

    6.HighGUI窗口與鍵盤事件

    HighGUI的部分,均可以在阿凱帶你玩轉OpenCV的基礎課程中學習。

    綜合實驗-窗口顯示圖像

    圖片保存

    具體包括:

    • 窗口創建命名與屬性設置

    • 窗口圖片更新

    • 鍵盤事件響應與事件監聽

    • 圖片保存

    • 窗口銷毀

    7.灰度圖

    視頻顯示黑白圖片

    圖片數據的基礎格式(BGR)與屬性,可以在打印圖像相關屬性 中查閱。

    圖片顏色空間變換,例如轉換為灰度圖(Grayscale), 需要借助 cvtColor 函數, 可以在色彩空間變換中學習。

    轉換代碼如下

    ## 顏色空間變換
    # 將BGR彩圖變換為灰度圖
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    

    8.圖片鏡像翻轉

    flip視頻鏡像顯示

    由于鏡頭的空間擺放方向的不同,可能需要對攝像頭拍攝的畫面進行鏡像操作。

    鏡像flip 屬于基本的2D仿射變換中的一種。

    ## 圖片鏡像
    # * 水平翻轉 flipCode = 1
    # * 垂直翻轉 flipCode = 0
    # * 同時水平翻轉與垂直翻轉 flipCode = -1
    # 
    flipCode = -1
    frame = cv2.flip(frame, flipCode)
    

    如果像要了解更多的2D仿射變換可以學習阿凱帶你玩轉OpenCV中的仿射變換簡介


    韩国精品无码一区二区三区,精品无码一区二区三区AV,欧洲丰满美熟女乱又伦AV,亚洲午夜久久久影院伊人