Ubuntu虛擬機里使用USB攝像頭獲取圖像¶
概要¶
在這一講里, 阿凱將會帶大家在virtualbox中運行opencv的程序, 并且讀取usb攝像頭的圖像。
在運行程序之前, 你需要在VirtualBox上安裝對應的拓展包. 然后, 阿凱還詳細講解了opencv中調用VideoCapture獲取圖像并展示在窗口的程序. 通過這篇文章的操作, 你可以檢測你的USB設備是否可以在虛擬機里正常讀取, 另外, 測試你配置的opencv開發環境是否正常.
keywords Ubuntu 虛擬機 USB設備 掛載
不能讀取USB設備的尷尬境地¶
首先你得有一個USB攝像頭, 請不要問阿凱USB攝像頭的選型。 能用就好, 最好免驅動。
我們點開VirtualBox的該虛擬機的管理頁中的usb設備一欄中, 可以看到從usb1.0 到usb3.0我們統統不能選擇。
打開usb攝像頭的軟件
cheese
我們看到也是黑漆漆的一片, 并沒有圖像讀取出來。
VirtualBox拓展插件的安裝¶
原來, 如果要使用USB設備, 我們需要安裝VirtualBox的拓展包。
拓展包的版本必須跟你的VirtualBox的版本一致。
那么, 如何查看自己的VirtualBox的版本呢?
運行VirtualBox, 在菜單欄里選幫助, 點擊關于VirtualBox
查看你當前的版本。
我們到官網上去下載拓展包。
https://www.virtualbox.org/wiki/Downloads
如果你用的VirtualBox的版本是5.2.6的話,直接下載首頁的下載鏈接。
如果是5.1版本的, 需要跳轉一下。
5.1版本下載鏈
https://www.virtualbox.org/wiki/Download_Old_Builds_5_1
找到拓展包Extension Package
如下圖所示。
下載后, 點擊即運行。
安裝如果正常的話,就是這樣的。
你得一直往下翻協議, 知道你可以點擊我接受
.
選擇USB攝像頭¶
拓展包安裝成功之后, 重啟虛擬機。
然后在設備里面,選擇你需要的攝像頭設備。 (之前是沒有的, 安裝拓展才會顯示出來)
創建一個腳本測試¶
這里, 不要求大家看懂所有的語句, 可以運行, 測試你的usb設備可以正常讀取, 然后opencv安裝正常, 那么說明就ok的。
阿凱配好的Ubuntu環境, 工程文件在Desktop上, 可以直接打開。
工程文件里面的SampleCollect.py
就是采集圖像的程序。
另外, 如果你是另外單獨創建這個文件的話, 請另外再創建一個叫samples
的文件夾。
SampleCollect.py
''' 獲取部分測試樣例 存放在./samples文件夾下. ''' import numpy as np import cv2 # 如果你選了多個攝像頭的話, 需要設定VideoCapture序號, 1 or 0 or else。 # 0 : camera on my laptop # 1 : usb camera cap = cv2.VideoCapture(1) # 這里可以設置畫面的寬度跟高度 # cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) # cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # 圖像采集計數 img_count = 1 while(True): # Capture frame-by-frame # 逐幀獲取畫面 # ret 畫面是否獲取成功 # True 獲取成功 # False 獲取失敗 ret, frame = cap.read() # 轉變為灰度圖 # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 展示圖片 # 這里的'frame' 指代的是窗口名稱為fram #cv2.imshow('frame', frame) # 鏡像翻轉, 你可能不需要 cv2.flip(frame, -1) # 獲取圖片的行數 列數, 與通道數 (rows,cols,channels) = frame.shape # 這里我旋轉了一下圖像, 因為我采集過來是橫著的,所以需要旋轉90度 M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1) dst = cv2.warpAffine(frame, M, (cols,rows)) # 顯示最終畫面。 cv2.imshow('frame', dst) # 等待按鍵按下, 最多等待1ms key = cv2.waitKey(1) # 如果按鍵等于q (小寫q) if key == ord('q'): # 退出程序 break elif key == ord('c'): # 如果按鍵是c 說明需要捕捉畫面 cv2.imwrite("{}.png".format(img_count), dst) # 畫面計數+1 img_count += 1 # 程序退出的時候 # 釋放VideoCapture cap.release() # 關閉所有窗口 cv2.destroyAllWindows()
說明, 如果要退出的話, 需要按小寫q
.
如果你按小寫q
還是沒有反應, 點擊一下opencv的窗口(任意一個) 然后按q
就好了。
成功獲取圖像¶
顯示效果