天天看點

PyOpenCV 基本操作 1. 圖檔加載、顯示和儲存2. 圖像顯示視窗建立與銷毀3. 圖檔寬、高、通道數擷取4. 圖像像素數目和圖像資料類型的擷取5. 生成指定大小的空圖像,  生成指定大小的空圖像6. 通路和操作圖像像素 7.  圖像三通道分離和合并8. 抓取攝像頭

目錄

1. 圖檔加載、顯示和儲存

2. 圖像顯示視窗建立與銷毀

3. 圖檔寬、高、通道數擷取

4. 圖像像素數目和圖像資料類型的擷取

5. 生成指定大小的空圖像,  生成指定大小的空圖像

6. 通路和操作圖像像素

7.  圖像三通道分離和合并

8. 抓取攝像頭

1. 圖檔加載、顯示和儲存

import cv2
# 生成圖檔
img = cv2.imread(r'C:\Users\Desktop\test1.jpg')
# 生成灰色圖檔
imgGrey = cv2.imread("1.jpg", 0)
#  展示原圖
cv2.imshow("img", img)
#  展示灰色圖檔
#cv2.imshow("imgGrey", imgGrey)
#  等待圖檔的關閉
cv2.waitKey(0)
# 儲存灰色圖檔
#cv2.imwrite("Copy.jpg", imgGrey)
           

2. 圖像顯示視窗建立與銷毀

    cv2.namedWindow(視窗名,屬性) 建立一個視窗,屬性—指定視窗大小模式:

    cv2.WINDOW_AUTOSIZE:根據圖像大小自動建立大小

    cv2.WINDOW_NORMAL:視窗大小可調整

    cv2.destoryAllWindows(視窗名) 删除任何建立的視窗

import cv2

# 生成圖檔

img = cv2.imread(r'C:\Users\Desktop\test1.jpg')

cv2.namedWindow("img", cv2.WINDOW_NORMAL)

cv2.imshow("img", img)

cv2.waitKey()

cv2.destroyAllWindows()
           

3. 圖檔寬、高、通道數擷取

img.shape 傳回圖像高(圖像矩陣的行數)、寬(圖像矩陣的列數)和通道數3個屬性組成的元組,若圖像是非彩色圖,則隻傳回高和寬組成的元組。

import cv2

img = cv2.imread(r'C:\Users\Desktop\test1.jpg')
imgGray = cv2.imread(r'C:\Users\Desktop\test1.jpg', 0)


print('****img*****)
print( img.shape)
print('width: ', img.shape[0])
print('heigh: ', img.shape[1])
print('channel: ', img.shape[2])


print('\n\n***imgGray**')
print(imgGray.shape)
print('width: ', imgGray.shape[0])
print('heigh: ', imgGray.shape[1])
print('channel: ', imgGray.shape[2])
           

4. 圖像像素數目和圖像資料類型的擷取

圖像矩陣img的size屬性和dtype分别對應圖像的像素總數目和圖像資料類型。一般情況下,圖像的資料類型是uint8。

import cv2

img = cv2.imread(r'C:\Users\Desktop\test1.jpg')

print('圖像類型: ', type(img))
print('圖像像素點數: ', img.size)
print('圖像像素灰階值類型:', img.dtype)
           

5. 生成指定大小的空圖像,  生成指定大小的空圖像

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\Desktop\test1.jpg')
imgZero = np.zeros(img.shape, np.uint8)
imgFix = np.zeros((300, 500, 3), np.uint8)

cv2.imshow("imgZero", imgZero)
cv2.imshow("imgFix", imgFix)
cv2.waitKey()
           

6. 通路和操作圖像像素

 OpenCV中圖像矩陣的順序是B、G、R。可以直接通過坐标位置通路和操作圖像像素。

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\Desktop\test1.jpg')

pixel_50_100 = img[50, 100]
#傳回3個值,分别是該像素點在BGR通道的值
print(pixel_50_100)


img[50, 100] = (0, 0, 255)

cv2.imshow("img", img)
cv2.waitKey()
           

分開通路圖像某一通道像素值也very友善

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\Desktop\test1.jpg')

img[0:100, 100:200, 0] = 255
img[100:200, 200:300, 1] = 255
img[200:300, 300:400, 2] = 255

cv2.imshow("img", img)
cv2.waitKey()
           

更改圖像某一矩形區域的像素值也很友善:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\Desktop\test1.jpg')
img[0:50, 1:100] = (0, 0, 255)

cv2.imshow("img", img)
cv2.waitKey()


           

7.  圖像三通道分離和合并

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\Desktop\test1.jpg')


b, g, r = cv2.split(img)

# b = cv2.split(img)[0]
# g = cv2.split(img)[1]
# r = cv2.split(img)[2]


merged = cv2.merge([b, g, r])

cv2.imshow("Blue", b)
cv2.imshow("Green", g)
cv2.imshow("Red", r)

cv2.imshow("Merged", merged)
cv2.waitKey()
           

8. 抓取攝像頭

import cv2
import numpy as np

cap  = cv2.VideoCapture(0)

for i in range(0, 19):
     print(cap.get(i)) 

while(1):
    ret, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower_blue = np.array([100, 47, 47])
    upper_blue = np.array([124, 255,255])

    mask = cv2.inRange(hsv, lower_blue, upper_blue) #藍色掩模
    res = cv2.bitwise_and(frame, frame, mask = mask)

    cv2.imshow(u"Capture", frame)
    cv2.imshow(u"mask", mask)
    cv2.imshow(u"res", res)

    key = cv2.waitKey(1)
    if key & 0xff == ord('q') or key == 27:
         print(frame.shape,ret)
         break

cap.release()
cv2.destroyAllWindows()