1. 程式人生 > >初識OpenCV 練習筆記整理--學習八。【幾何變換】

初識OpenCV 練習筆記整理--學習八。【幾何變換】

# 幾何變換
"""
目標:
    學習對影象進行各種幾何變換,例如移動,旋轉,仿射變換等。
    將要學到的函式有:cv2.getPerspectiveTransForm.

    變換:
        OpenCV提供了兩個變換函式,cv2.warpAffine和cv2.warpPerspective,使用這兩個函式你可以實現所有型別的變換。
        cv2.warpAffine接受的引數是2x3的變換矩陣,而cv2.warpPerspective接受的引數是3x3的變換矩陣。
"""
# 第一擴充套件縮放 2018-11-1 19:32
"""
擴充套件縮放只是改變影象的尺寸大小。OpenCV提供的函式cv2.resize()可以實現這個功能。影象的尺寸可以自己動手設定,你也可以指定縮放因子。
在縮放的時候我們推薦使用cv2.INTER_AREA,在擴充套件的時我們推薦使用cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR.你可以使用下面任意一種方法改變影象的尺寸。
"""
import cv2
import numpy as np

img = cv2.imread('./66.jpg')
res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)  # 第一種方式改變圖片的大小
height, width = img.shape[:2]
print(height)
# res = cv2.resize(img, (2 * width, 2 * height), interpolation=cv2.INTER_CUBIC)  # 第二種改變圖片大小的方式
cv2.imshow('image', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 第二小節 平移 2018-11-1 20:03
import cv2
import numpy as np

cap = cv2.VideoCapture(r'D:\WeChat_20181022093320.mp4')

while 1:
    # 獲取每一幀
    ret, frame = cap.read()
    # 轉換到 HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  # 轉換到hsv值
    # 設定藍色的閾值
    lower_blue = np.array([100, 110, 100])
    upper_blue = np.array([0, 0, 0])
    # 根據閾值構建掩模
    mask = cv2.inRange(hsv, lower_blue,
                       upper_blue)  # 就是將低於lower_blue和高於upper_blue的部分分別變成0,lower_blue~upper_blue之間的值變成
    # 對原影象和掩模進行位運算255
    res = cv2.bitwise_and(frame, frame, mask=mask)
    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)
    cv2.imshow('res', res)
    k = cv2.waitKey(0)
    if k == 27:
        break

cv2.destroyAllWindows()
import cv2
import numpy as np

img = cv2.imread('./66.jpg')
rows, cols = img.shape[:2]

M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.6)  # 引數依次代表意思 旋轉中心,旋轉角度, 旋轉後的縮放因子
dst = cv2.warpAffine(img, M, (2 * cols, 2 * rows))  # 第三個引數是輸出影象的尺寸中心
while 1:
    cv2.imshow('img', dst)
    if cv2.waitKey(10) & 0xFF == 27:
        break
cv2.destroyAllWindows()
# 仿射變換 2018/11/5 9:48
"""
在仿射變換中,原圖中所有的平行線在結果影象中同樣平行。為了建立這個矩陣我們需要重原圖中找到三個點以及他們在輸出影象中的位置。
然後cv2.getAffineTransform 會建立一個2x3的矩陣,最後這個矩陣會被傳給函式cv2.warpAffine
"""
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('./66.jpg')
rows, cols, ch = img.shape
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])
M = cv2.getAffineTransform(pts1, pts2)
# dst = cv2.warpAffine(img, M, (cols, rows))
# plt.subplot(121)
# plt.subplot(121, , plt.title('Output'))
# plt.show()
plt.imshow(img)

以上總結後邊看的時候可能現在的註釋會是錯的。以後改正。