Linux中國

在 Fedora Linux 上使用 OpenCV(一)

封面圖片選自文森特·梵高的《星空》,公共領域,通過維基共享資源發布

技術世界每天都在變化,對計算機視覺、人工智慧和機器學習的需求也在增加。讓計算機和手機能夠看到周圍環境的技術被稱為 計算機視覺。這個重新創造人眼的工作始於 50 年代。從那時起,計算機視覺技術有了長足的發展。計算機視覺已經通過不同的應用進入了我們的手機。這篇文章將介紹 Fedora Linux 上的 OpenCV

什麼是 OpenCV

OpenCV 開源計算機視覺庫 Open Source Computer Vision Library )是一個開源的計算機視覺和機器學習軟體庫。OpenCV 的建立是為了給計算機視覺應用提供一個通用的基礎設施,並加速機器感知在商業產品中的應用。它有超過 2500 種優化後的演算法,其中包括一套全面的經典和最先進的計算機視覺和機器學習演算法。這些演算法可用於檢測和識別人臉、識別物體、對視頻中的人類行為進行分類,並建立標記,將其與增強現實疊加等等。

opencv.org – about

在 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_GRAYSCALE0:以灰度模式載入圖像。
  • 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 色彩空間之間轉換時,應明確指定通道的順序(RGB2BGRBGR2RGB)。注意,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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國