在 Fedora Linux 上使用 OpenCV(一)
封面圖片選自文森特·梵高的《星空》,公共領域,通過維基共享資源發布
技術世界每天都在變化,對計算機視覺、人工智慧和機器學習的需求也在增加。讓計算機和手機能夠看到周圍環境的技術被稱為 計算機視覺。這個重新創造人眼的工作始於 50 年代。從那時起,計算機視覺技術有了長足的發展。計算機視覺已經通過不同的應用進入了我們的手機。這篇文章將介紹 Fedora Linux 上的 OpenCV。
什麼是 OpenCV?
OpenCV( 開源計算機視覺庫 )是一個開源的計算機視覺和機器學習軟體庫。OpenCV 的建立是為了給計算機視覺應用提供一個通用的基礎設施,並加速機器感知在商業產品中的應用。它有超過 2500 種優化後的演算法,其中包括一套全面的經典和最先進的計算機視覺和機器學習演算法。這些演算法可用於檢測和識別人臉、識別物體、對視頻中的人類行為進行分類,並建立標記,將其與增強現實疊加等等。
在 Fedora Linux 上安裝 OpenCV
要開始使用 OpenCV,請從 Fedora Linux 倉庫中安裝它:
$ sudo dnf install opencv opencv-contrib opencv-doc python3-opencv python3-matplotlib python3-numpy
注意: 在 Fedora Silverblue 或 CoreOS 上,Python 3.9 是核心提交的一部分。用以下方法安裝 OpenCV 和所需工具:
rpm-ostree install opencv opencv-doc python3-opencv python3-matplotlib python3-numpy
接下來,在終端輸入以下命令,以驗證 OpenCV 是否已經安裝:
$ python
Python 3.9.6 (default, Jul 16 2021, 00:00:00)
[GCC 11.1.1 20210531 (Red Hat 11.1.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2 as cv
>>> print( cv.__version__ )
4.5.2
>>> exit()
當你輸入 print
命令時,應該顯示當前的 OpenCV 版本,如上圖所示。這表明 OpenCV 和 Python-OpenCV 庫已經成功安裝。
此外,如果你想用 Jupyter Notebook 做筆記和寫代碼,並了解更多關於數據科學工具的信息,請查看早期的 Fedora Magazine 文章:Fedora 中的 Jupyter 和數據科學。
開始使用 OpenCV
安裝完成後,使用 Python 和 OpenCV 庫載入一個樣本圖像(按 S
鍵以 png 格式保存圖像的副本並完成程序):
$ cp /usr/share/opencv4/samples/data/starry_night.jpg .
$ python starry_night.py
starry_night.py
的內容:
import cv2 as cv
import sys
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
if img is None:
sys.exit("Could not read the image.")
cv.imshow("Display window", img)
k = cv.waitKey(0)
if k == ord("s"):
cv.imwrite("starry_night.png", img)
通過在 cv.imread
函數中添加參數 0
,對圖像進行灰度處理,如下所示。
img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)
這些是一些可以用於 cv.imread
函數的第二個參數的替代值:
cv2.IMREAD_GRAYSCALE
或0
:以灰度模式載入圖像。cv2.IMREAD_COLOR** 或
1`:以彩色模式載入圖像。圖像中的任何透明度將被移除。這是默認的。cv2.IMREAD_UNCHANGED** 或
-1`:載入未經修改的圖像。包括 alpha 通道。
使用 OpenCV 顯示圖像屬性
圖像屬性包括行、列和通道的數量、圖像數據的類型、像素的數量等等。假設你想訪問圖像的形狀和它的數據類型。你可以這樣做:
import cv2 as cv
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
print("Image size is", img.shape)
print("Data type of image is", img.dtype)
Image size is (600, 752, 3)
Data type of image is uint8
print(f"Image 2D numpy array n {img}")
Image 2D numpy array
[[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]
...
img.shape
:返回一個行數、列數和通道數的元組(如果是彩色圖像)。img.dtype
:返回圖像的數據類型。
接下來用 Matplotlib 顯示圖像:
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)
plt.imshow(img)
plt.show()
發生了什麼?
該圖像是作為灰度圖像讀入的,但是當使用 Matplotlib 的 imshow
函數時,它不一定會以灰度顯示。這是因為 imshow
函數默認使用不同的顏色映射。要指定使用灰度顏色映射,請將 imshow
函數的第二個參數設置為 cmap='gray'
,如下所示:
plt.imshow(img,cmap='gray')
這個問題在以彩色模式打開圖片時也會發生,因為 Matplotlib 期望圖片為 RGB(紅、綠、藍)格式,而 OpenCV 則以 BGR(藍、綠、紅)格式存儲圖片。為了正確顯示,你需要將 BGR 圖像的通道反轉。
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
fig, (ax1, ax2) = plt.subplots(1,2)
ax1.imshow(img)
ax1.set_title('BGR Colormap')
ax2.imshow(img[:,:,::-1])
ax2.set_title('Reversed BGR Colormap(RGB)')
plt.show()
分割和合併顏色通道
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
b,g,r = cv.split(img)
fig,ax = plt.subplots(2,2)
ax[0,0].imshow(r,cmap='gray')
ax[0,0].set_title("Red Channel");
ax[0,1].imshow(g,cmap='gray')
ax[0,1].set_title("Green Channel");
ax[1,0].imshow(b,cmap='gray')
ax[1,0].set_title("Blue Channel");
# Merge the individual channels into a BGR image
imgMerged = cv.merge((b,g,r))
# Show the merged output
ax[1,1].imshow(imgMerged[:,:,::-1])
ax[1,1].set_title("Merged Output");
plt.show()
cv2.split
:將一個多通道數組分割成幾個單通道數組。cv2.merge
:將幾個數組合併成一個多通道數組。所有的輸入矩陣必須具有相同的大小。
注意: 白色較多的圖像具有較高的顏色密度。相反,黑色較多的圖像,其顏色密度較低。在上面的例子中,紅色的密度是最低的。
轉換到不同的色彩空間
cv2.cvtColor
函數將一個輸入圖像從一個顏色空間轉換到另一個顏色空間。在 RGB 和 BGR 色彩空間之間轉換時,應明確指定通道的順序(RGB2BGR
或 BGR2RGB
)。注意,OpenCV 中的默認顏色格式通常被稱為 RGB,但它實際上是 BGR(位元組是相反的)。 因此,標準(24 位)彩色圖像的第一個位元組將是一個 8 位藍色分量,第二個位元組是綠色,第三個位元組是紅色。然後第四、第五和第六個位元組將是第二個像素(藍色、然後是綠色,然後是紅色),以此類推。
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.show()
更多信息
關於 OpenCV 的更多細節可以在在線文檔中找到。
感謝閱讀。
via: https://fedoramagazine.org/use-opencv-on-fedora-linux-part-1/
作者:Onuralp SEZER 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive