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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM