openCV

OpenCV的全稱是Open Source Computer Vision Library,是一個跨平台的電腦視覺庫。OpenCV是由英特爾公司發起並參與開發,以BSD授權條款授權發行,可以在商業和研究領域中免費使用。OpenCV可用於開發即時的圖像處理、電腦視覺以及圖型識別程式。 OpenCV是當今最知名、也最被廣泛採用的影像處理函式庫,主要以C++開發設計,被泛用於各個影像處理的領域,可以用來讀取儲存圖片、視訊、矩陣運算、統計、影像處理等,更可用在物體追蹤、人臉辨識、紋理分析、動態視訊的影像處理等領域,C++, Python, Java皆可使用OpenCV的Library。
  1. Raspberry Pi安裝OpenCV

    
    sudo apt-get install libopencv-dev  
    
    on Ubuntu: sudo apt-get install python3-opencv
    
    在linux的shell中輸入: 
    pip install Opencv-python
    即可開始安裝。
    
    

    A.安裝 OpenCV 相關軟體。 步驟 1:先安裝好作業系統。
    可參考 安裝Linux 在Raspberry Pi4。
    步驟2:更新當前安裝的軟體。
    $ sudo apt-get update
    $ sudo apt-get upgrate
    步驟3:安裝 OpenCV 編譯所需的軟體。
    $ sudo apt-get install cmake build-essential pkg-config git
    步驟4:安裝常用圖像和視頻格式的支援軟體。
    $ sudo apt-get install libjpeg-dev libtiff-dev libjasper-dev libpng-dev libwebp-dev libopenexr-dev
    $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libdc1394–22-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
    步驟5:安裝 OpenCV 界面所需的軟體。
    $ sudo apt-get install libgtk-3-dev libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
    步驟6:安裝提高 OpenCV 運行速度的軟體。
    $ sudo apt-get install libatlas-base-dev liblapacke-dev gfortran
    步驟7:安裝 HDF5軟體。
    $ sudo apt-get install libhdf5-dev libhdf5–103
    步驟8:安裝 Python。
    $ sudo apt-get install python3-dev python3-pip python3-numpy
  2. opencv的基本指令:圖片檔案的讀、寫和顯示

  3. import cv2
    # 讀取image.jpg圖檔
    img = cv2.imread('image.png')
    # 以灰階的格式讀進圖形檔案
    img_gray = cv2.imread('image.png' , cv2.IMREAD_GRAYSCALE)
    # 彩色圖片轉為灰階圖片
    img2=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # imshow 立即在視窗中展示圖片
    cv2.imshow('Image1', img)
    cv2.imshow('Image2', img_gray)
    cv2.imshow('Image3', img2)
    # 等待鍵盤輸入任何鍵就執行下面的指令(關閉所有視窗)
    cv2.waitKey(0)
    # 關閉所有視窗
    cv2.destroyAllWindows()
    # 將灰階的圖片寫入一個新的檔案
    cv2.imwrite('image_gray.png', img_gray)
    
    
    #---------------- 移除所有註解後的原始程式------------
    import cv2
    img = cv2.imread('image.png')
    img_gray = cv2.imread('image.png' , cv2.IMREAD_GRAYSCALE)
    img2=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imshow('Image1', img)
    cv2.imshow('Image2', img_gray)
    cv2.imshow('Image3', img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    cv2.imwrite('image_gray.png', img_gray)
    
       image.png




  4. img is numpy array

  5. import cv2
    import numpy
    img = cv2.imread('image.png')
    print(type(img))
    print(img.shape)
    img_gray = cv2.imread('image.png' , cv2.IMREAD_GRAYSCALE)
    print(type(img_gray))
    print(img_gray.shape)
    (Lx,Ly)=img_gray.shape
    print(Lx,Ly)
    for i in range(0,Lx,10):
        for j in range(0,Ly,10):
                print(i,j,img[i][j][0],img[i][j][1],img[i][j][2])
    

    
    (160, 202, 3)
    
    (160, 202)
    160 202
    0 0 255 255 255
    0 40 255 255 255
    0 80 255 255 255
    0 120 255 255 255
    0 160 255 255 255
    0 200 255 255 255
    40 0 255 255 255
    40 40 255 255 255
    40 80 232 162 0
    40 120 232 162 0
    40 160 255 255 255
    40 200 255 255 255
    80 0 255 255 255
    80 40 255 255 255
    80 80 232 162 0
    80 120 232 162 0
    80 160 255 255 255
    80 200 255 255 255
    120 0 255 255 255
    120 40 255 255 255
    120 80 0 0 0
    120 120 0 0 0
    120 160 255 255 255
    120 200 255 255 255
    



  6. 改變ndarray當中的數值就改變了圖片的樣貌

  7. 請注意x, y的陣列指標與圖形的方向剛好互換。
    import cv2
    import numpy
    img = cv2.imread('image.png')
    print(type(img))
    print(img.shape)
    img_gray = cv2.imread('image.png' , cv2.IMREAD_GRAYSCALE)
    print(type(img_gray))
    print(img_gray.shape)
    (Lx,Ly)=img_gray.shape
    print(Lx,Ly)
    for i in range(0,Lx):
        for j in range(0,Ly):
            #將畫素中的顏色換成紅色,因此會產生一條"直"的紅線
            if(j>80 and j<100):
                img[i][j][0]=0
                img[i][j][1]=0
                img[i][j][2]=255
    cv2.imshow('img red',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    
    (160, 202, 3)
    
    (160, 202)
    160 202
    
    



  8. 利用numpy array擷取圖片的部分窗格+將不同的圖片合併成一個新的圖片

  9. import cv2
    import numpy as np
    img = cv2.imread("image.png")  
    (Lx,Ly)=(img.shape[0],img.shape[1])
    Lx2=int(Lx/2); Ly2=int(Ly/2)
    # 擷取部分的窗格
    img1=img[0:Lx2,0:Ly2]
    img2=img[Lx2:Lx,Ly2:Ly]
    print(img.shape,img1.shape,img2.shape)
    vstack=np.vstack((img1,img2))
    cv2.imshow('img', img)
    cv2.imshow('img1', img1)
    cv2.imshow('img2', img2)
    cv2.imshow('img1,2 vstack', vstack)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    (160, 202, 3) (80, 101, 3) (80, 101, 3)
    
    



  10. cv+np stack

  11. numpy array 的 merge (合併)
    使用 vertical stack : vstack 垂直合併兩個 array
    使用 horizontal stack : hstack 水平合併兩個 array
    [Python+OpenCV] 垂直vconcat 和水平hconcat 影像拼接。
    
    import cv2
    import numpy as np
    img = cv2.imread("image.png")  #read-in an image file
    # 擷取部分的窗格
    img1=img[0:50,0:50]
    img2=img[50:100,0:50]
    img3=img[0:50,50:100]
    img4=img[50:100,50:100]
    print(img.shape,img1.shape,img2.shape)
    tmp1=np.vstack((img1,img2))
    tmp2=np.vstack((img3,img4))
    tmp=np.hstack((tmp1,tmp2))
    cv2.imshow('img1', img1)
    cv2.imshow('img2', img2)
    cv2.imshow('tmp1', tmp1)
    cv2.imshow('tmp2', tmp2)
    cv2.imshow('tmp', tmp)
    #  vconcat 垂影像拼接跟 hconcat 水平影像拼接
    image_v = cv2.vconcat([img2, tmp2])
    print(tmp1.shape,tmp.shape,image_v.shape)
    cv2.imshow('imgv', image_v)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    
    



  12. 直接控制numpy array當中的數值來畫方形

    • imwrite("file", img)
    • # 寫入不同圖檔格式
      cv2.imwrite('output.png', img)
      cv2.imwrite('output.tiff', img)
      
      # 設定 JPEG 圖片品質為 90(可用值為 0 ~ 100)
      cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 90])
      # 設定 PNG 壓縮層級為 5(可用值為 0 ~ 9)
      cv2.imwrite('output.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 5])
      
      我們可以利用numpy的陣列畫出我們想要的圖形。
      
    import numpy as np
    import cv2
    L=40
    (x,y)=(L,L)
    print(x,y,x*y)
    new=np.ones((x,y))
    new=new*255
    print(new.shape)
    for i in range(2):
        for j in range(x): new[j][i]=0;  
    for i in range(y-2,y):
        for j in range(x): new[j][i]=0;   
    for j in range(2):
        for i in range(y): new[j][i]=0;   
    for j in range(x-2,x):
        for i in range(y): new[j][i]=0;   
    cv2.imwrite('cvnp-g1.png', new)
    
    40 40 1600
    (40, 40)
      
    



  13. 直接控制numpy array當中的數值來畫方形和圓形

    • imwrite("file", img)
    import numpy as np
    import cv2
    L=80
    (x,y)=(L,L)
    print(x,y,x*y)
    new=np.ones((x,y))
    new=new*255
    print(new.shape)
    for i in range(2):
        for j in range(x): new[j][i]=0;  
    for i in range(y-2,y):
        for j in range(x): new[j][i]=0;   
    for j in range(2):
        for i in range(y): new[j][i]=0;   
    for j in range(x-2,x):
        for i in range(y): new[j][i]=0;   
    R=L/4; NC=400
    t=np.arange(0,2*np.pi,2*np.pi/NC)
    x=L/2+R*(np.cos(t))
    y=L/2+R*(np.sin(t))
    ix=x.astype(int)
    iy=y.astype(int)
    for i in range(len(t)):
        print(i,t[i],ix[i],iy[i])
        new[ix[i]][iy[i]]=125
    cv2.imwrite('cvnp-g1.png', new)
    
    40 40 1600
    (40, 40)
      
    



  14. 圖片中加入直線可以使用 cv2.line 函數

  15. import numpy as np
    import cv2
    # 建立一張 512x512 的 RGB 圖片(黑色)
    img = np.zeros((256, 256, 3), np.uint8)
    # 將圖片用淺灰色 (200, 200, 200) 填滿
    img.fill(200)
    # 在圖片上畫一條紅色的對角線,寬度為 5 px
    cv2.line(img, (0, 0), (255, 255), (0, 0, 255), 5)
    # 顯示圖片
    cv2.imshow('My Image', img)
    cv2.imwrite('cv2line.png', img)
    # 按下任意鍵則關閉所有視窗
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    
     
    
  16. openCV的畫圖函數-範例

  17. import numpy as np
    import cv2
    img = np.zeros((256, 256, 3), np.uint8)
    img.fill(200)
    
    # 在圖片上畫一條紅色的對角線,寬度為 5 px
    # cv2.line(影像, 開始座標, 結束座標, 顏色, 線條寬度)
    cv2.line(img, (0, 0), (255, 255), (0, 0, 255), 5)
    
    #cv2.rectangle(影像, 頂點座標, 對向頂點座標, 顏色, 線條寬度)
    cv2.rectangle(img, (20, 60), (120, 160), (0, 255, 0), 2)
    
    #cv2.circle(影像, 圓心座標, 半徑, 顏色, 線條寬度)
    cv2.circle(img,(90, 210), 30, (0, 255, 255), 3)
    cv2.circle(img,(140, 170), 15, (255, 0, 0), -1)
    
    cv2.ellipse(img, (180, 200), (25, 55), 45, 0, 360, (205, 0, 255), 2)
    cv2.ellipse(img, (180, 200), (20, 50), 45, 0, 180, (255, 0, 255), -1)
    cv2.putText(img, 'ov05.py', (10, 40), cv2.FONT_HERSHEY_SIMPLEX,
     1, (0, 0, 0), 1, cv2.LINE_AA)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    



  18. openCV+matplot

  19. 在python程式中我們可以把從圖片檔案讀進來,再用matplotlib畫圖,結合成一個新的圖片,再寫入寫出至檔案之中。
    mport numpy as np
    import cv2
    from matplotlib import pyplot as plt
    # 使用 OpenCV 讀取圖檔
    img_bgr = cv2.imread('square-color.png')
    cv2.imshow('colorful', img_bgr)
    while True:
        if cv2.waitKey(0) & 0xFF == 27: cv2.destroyAllWindows(); break
        (X,Y,Z)=img_bgr.shape
        print(img_bgr.shape)
        t=np.linspace(0,4*np.pi,100)
        x=X/2+X/10*np.cos(t)
        y=Y/3+Y/10*np.sin(t)
        # 將 BGR 圖片轉為 RGB 圖片
        #img_rgb = img_bgr[:,:,::-1]
        # 或是這樣亦可
        img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
        # 使用 Matplotlib 顯示圖片
        plt.imshow(img_bgr)
        plt.plot(x,y,'r-',lw=3)
        plt.xlabel('x', fontsize=15)
        plt.show()
    



  20. 匯入的圖形與畫圖函數結合

  21. import numpy as np
    import cv2
    # 圖片檔案讀入
    img=cv2.imread('image.png')
    # 在圖片上畫一條紅色的對角線,寬度為 5 px
    cv2.line(img, (0, 0), (255, 255), (0, 0, 255), 5)
    cv2.rectangle(img, (20, 60), (120, 160), (0, 255, 0), 2)
    cv2.circle(img,(90, 210), 30, (0, 255, 255), 3)
    cv2.ellipse(img, (180, 200), (25, 55), 45, 0, 360, (205, 0, 255), 2)
    cv2.putText(img,'ov06.py',(40, 80),cv2.FONT_HERSHEY_SIMPLEX,1,(0, 0, 0),1,cv2.LINE_AA)
    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    cv2.imwrite('ov06.png',img)
    

從numpy.array得知圖片中的顏色

# coding=big5
# Python program to use openCV functions
import cv2
src = cv2.imread("square-1.png")  #read-in an image file
gray = cv2.imread("square-1.png",cv2.IMREAD_GRAYSCALE)  #convert it to a gray scale
print(type(src))
print(len(src))
print(src.shape)
(x,y,z)=src.shape
print((x,y,z))
for i in range(0,x,4):
    if(src[i][50][0] > 233 ): cc='White'
    elif(src[i][50][0] > 163 and src[i][50][2] < 220 ): cc='BLUE'
    else: cc='Black'
    print(i,50,src[i][50][0],src[i][50][1],src[i][50][2], cc)

160
(160, 202, 3)
(160, 202, 3)
0 50 255 255 255 White
4 50 255 255 255 White
8 50 255 255 255 White
12 50 255 255 255 White
16 50 255 255 255 White
20 50 255 255 255 White
24 50 255 255 255 White
28 50 255 255 255 White
32 50 0 0 0 Black
36 50 0 0 0 Black
40 50 232 162 0 BLUE
44 50 232 162 0 BLUE
48 50 232 162 0 BLUE
52 50 232 162 0 BLUE
56 50 232 162 0 BLUE
60 50 232 162 0 BLUE
64 50 232 162 0 BLUE
68 50 232 162 0 BLUE
72 50 232 162 0 BLUE
76 50 232 162 0 BLUE
80 50 232 162 0 BLUE
84 50 232 162 0 BLUE
88 50 232 162 0 BLUE
92 50 232 162 0 BLUE
96 50 232 162 0 BLUE
100 50 232 162 0 BLUE
104 50 232 162 0 BLUE
108 50 232 162 0 BLUE
112 50 232 162 0 BLUE
116 50 232 162 0 BLUE
120 50 0 0 0 Black
124 50 0 0 0 Black
128 50 255 255 255 White
132 50 255 255 255 White
136 50 255 255 255 White
140 50 255 255 255 White
144 50 255 255 255 White
148 50 255 255 255 White
152 50 255 255 255 White
156 50 255 255 255 White



matplotlib example codes
import matplotlib.pyplot as plt 
x=[1,2,3,4,5,6]
y=[4,3,5,6,7,4]
fig=plt.figure()
subplot1=fig.add_subplot(2,1,1)
subplot1.plot(x, y)
subplot2=fig.add_subplot(2,1,2)
subplot2.text(0.3, 0.5, '2nd Subplot')
fig.suptitle("Add subplots to a figure")
plt.show()

########################################

import numpy as np
array = np.full(5,7)
print(array)


import numpy as np
array = np.empty(5, dtype = int)
array.fill(7)
print(array)


import numpy as np
array = np.empty(5, dtype = int)
for i in range(5):
    array[i] = 7
print(array)



##################################################


print(array)
n 中將 NumPy 陣列儲存為影象

import numpy as np
from PIL import Image
array = np.arange(0, 737280, 1, np.uint8)
array = np.reshape(array, (1024, 720))
print(array.shape)
im = Image.fromarray(array)
im.save("tmp6-pil.png")


import matplotlib.pyplot as plt
import numpy as np
array = np.arange(0, 737280, 1, np.uint8)
array = np.reshape(array, (1024, 720))
plt.imsave('tmp6-mat.png', array)


import cv2
import numpy as np
array = np.arange(0, 737280, 1, np.uint8)
array.fill(155)
array = np.reshape(array, (1024, 720))






##################################################









  • TTTT