[雪峰磁針石部落格]pythonopencv3例項(物件識別和擴增實境)1-影像幾何轉換
在本章中,我們將學習如何應用酷的幾何效果到影像。 知識點
- 如何安裝OpenCV-Python
- 如何讀取,顯示和儲存影像
- 如何轉換到多個顏色空間
- 如何應用幾何變換,例如平移,旋轉,和縮放
- 如何使用仿射和投影變換來應用幾何效果
本書英文版本:OpenCV 3.x with Python By Example 2nd 2018.pdf
更多opencv相關書籍:最佳人工智慧影像處理工具OpenCV書籍下載
安裝OpenCV-Python
- 安裝
本教程基於python3,ubuntu 16,在windows環境可能可以執行。
Linux
#!python
pip3 install opencv-python
Windows
#!python
pip install opencv-python
-
文件:
[官網](http://docs.opencv.org/) [opencv-python官方文件](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html)
讀取顯示和儲存圖片
01_reading_image.py 讀取顯示圖片
import cv2
img = cv2.imread(`./images/input.jpg`)
cv2.imshow(`Input image`, img)
cv2.waitKey()
02_saving_image.py 儲存為灰度圖
import cv2
gray_img = cv2.imread(`images/input.jpg`, cv2.IMREAD_GRAYSCALE)
cv2.imshow(`Grayscale`, gray_img)
cv2.imwrite(`images/output.jpg`, gray_img)
cv2.waitKey()
轉換格式
03_convert_image_format.py
In [1]: import cv2
In [2]: print([x for x in dir(cv2) if x.startswith(`COLOR_`)])
[`COLOR_BAYER_BG2BGR`, `COLOR_BAYER_BG2BGRA`, `COLOR_BAYER_BG2BGR_EA`, `COLOR_BAYER_BG2BGR_VNG`, `COLOR_BAYER_BG2GRAY`, `COLOR_BAYER_BG2RGB`, `COLOR_BAYER_BG2RGBA`, `COLOR_BAYER_BG2RGB_EA`, `COLOR_BAYER_BG2RGB_VNG`, `COLOR_BAYER_GB2BGR`, `COLOR_BAYER_GB2BGRA`, `COLOR_BAYER_GB2BGR_EA`, `COLOR_BAYER_GB2BGR_VNG`, `COLOR_BAYER_GB2GRAY`, `COLOR_BAYER_GB2RGB`, `COLOR_BAYER_GB2RGBA`, `COLOR_BAYER_GB2RGB_EA`, `COLOR_BAYER_GB2RGB_VNG`, `COLOR_BAYER_GR2BGR`, `COLOR_BAYER_GR2BGRA`, `COLOR_BAYER_GR2BGR_EA`, `COLOR_BAYER_GR2BGR_VNG`, `COLOR_BAYER_GR2GRAY`, `COLOR_BAYER_GR2RGB`, `COLOR_BAYER_GR2RGBA`, `COLOR_BAYER_GR2RGB_EA`, `COLOR_BAYER_GR2RGB_VNG`, `COLOR_BAYER_RG2BGR`, `COLOR_BAYER_RG2BGRA`, `COLOR_BAYER_RG2BGR_EA`, `COLOR_BAYER_RG2BGR_VNG`, `COLOR_BAYER_RG2GRAY`, `COLOR_BAYER_RG2RGB`, `COLOR_BAYER_RG2RGBA`, `COLOR_BAYER_RG2RGB_EA`, `COLOR_BAYER_RG2RGB_VNG`, `COLOR_BGR2BGR555`, `COLOR_BGR2BGR565`, `COLOR_BGR2BGRA`, `COLOR_BGR2GRAY`, `COLOR_BGR2HLS`, `COLOR_BGR2HLS_FULL`, `COLOR_BGR2HSV`, `COLOR_BGR2HSV_FULL`, `COLOR_BGR2LAB`, `COLOR_BGR2LUV`, `COLOR_BGR2Lab`, `COLOR_BGR2Luv`, `COLOR_BGR2RGB`, `COLOR_BGR2RGBA`, `COLOR_BGR2XYZ`, `COLOR_BGR2YCR_CB`, `COLOR_BGR2YCrCb`, `COLOR_BGR2YUV`, `COLOR_BGR2YUV_I420`, `COLOR_BGR2YUV_IYUV`, `COLOR_BGR2YUV_YV12`, `COLOR_BGR5552BGR`, `COLOR_BGR5552BGRA`, `COLOR_BGR5552GRAY`, `COLOR_BGR5552RGB`, `COLOR_BGR5552RGBA`, `COLOR_BGR5652BGR`, `COLOR_BGR5652BGRA`, `COLOR_BGR5652GRAY`, `COLOR_BGR5652RGB`, `COLOR_BGR5652RGBA`, `COLOR_BGRA2BGR`, `COLOR_BGRA2BGR555`, `COLOR_BGRA2BGR565`, `COLOR_BGRA2GRAY`, `COLOR_BGRA2RGB`, `COLOR_BGRA2RGBA`, `COLOR_BGRA2YUV_I420`, `COLOR_BGRA2YUV_IYUV`, `COLOR_BGRA2YUV_YV12`, `COLOR_BayerBG2BGR`, `COLOR_BayerBG2BGRA`, `COLOR_BayerBG2BGR_EA`, `COLOR_BayerBG2BGR_VNG`, `COLOR_BayerBG2GRAY`, `COLOR_BayerBG2RGB`, `COLOR_BayerBG2RGBA`, `COLOR_BayerBG2RGB_EA`, `COLOR_BayerBG2RGB_VNG`, `COLOR_BayerGB2BGR`, `COLOR_BayerGB2BGRA`, `COLOR_BayerGB2BGR_EA`, `COLOR_BayerGB2BGR_VNG`, `COLOR_BayerGB2GRAY`, `COLOR_BayerGB2RGB`, `COLOR_BayerGB2RGBA`, `COLOR_BayerGB2RGB_EA`, `COLOR_BayerGB2RGB_VNG`, `COLOR_BayerGR2BGR`, `COLOR_BayerGR2BGRA`, `COLOR_BayerGR2BGR_EA`, `COLOR_BayerGR2BGR_VNG`, `COLOR_BayerGR2GRAY`, `COLOR_BayerGR2RGB`, `COLOR_BayerGR2RGBA`, `COLOR_BayerGR2RGB_EA`, `COLOR_BayerGR2RGB_VNG`, `COLOR_BayerRG2BGR`, `COLOR_BayerRG2BGRA`, `COLOR_BayerRG2BGR_EA`, `COLOR_BayerRG2BGR_VNG`, `COLOR_BayerRG2GRAY`, `COLOR_BayerRG2RGB`, `COLOR_BayerRG2RGBA`, `COLOR_BayerRG2RGB_EA`, `COLOR_BayerRG2RGB_VNG`, `COLOR_COLORCVT_MAX`, `COLOR_GRAY2BGR`, `COLOR_GRAY2BGR555`, `COLOR_GRAY2BGR565`, `COLOR_GRAY2BGRA`, `COLOR_GRAY2RGB`, `COLOR_GRAY2RGBA`, `COLOR_HLS2BGR`, `COLOR_HLS2BGR_FULL`, `COLOR_HLS2RGB`, `COLOR_HLS2RGB_FULL`, `COLOR_HSV2BGR`, `COLOR_HSV2BGR_FULL`, `COLOR_HSV2RGB`, `COLOR_HSV2RGB_FULL`, `COLOR_LAB2BGR`, `COLOR_LAB2LBGR`, `COLOR_LAB2LRGB`, `COLOR_LAB2RGB`, `COLOR_LBGR2LAB`, `COLOR_LBGR2LUV`, `COLOR_LBGR2Lab`, `COLOR_LBGR2Luv`, `COLOR_LRGB2LAB`, `COLOR_LRGB2LUV`, `COLOR_LRGB2Lab`, `COLOR_LRGB2Luv`, `COLOR_LUV2BGR`, `COLOR_LUV2LBGR`, `COLOR_LUV2LRGB`, `COLOR_LUV2RGB`, `COLOR_Lab2BGR`, `COLOR_Lab2LBGR`, `COLOR_Lab2LRGB`, `COLOR_Lab2RGB`, `COLOR_Luv2BGR`, `COLOR_Luv2LBGR`, `COLOR_Luv2LRGB`, `COLOR_Luv2RGB`, `COLOR_M_RGBA2RGBA`, `COLOR_RGB2BGR`, `COLOR_RGB2BGR555`, `COLOR_RGB2BGR565`, `COLOR_RGB2BGRA`, `COLOR_RGB2GRAY`, `COLOR_RGB2HLS`, `COLOR_RGB2HLS_FULL`, `COLOR_RGB2HSV`, `COLOR_RGB2HSV_FULL`, `COLOR_RGB2LAB`, `COLOR_RGB2LUV`, `COLOR_RGB2Lab`, `COLOR_RGB2Luv`, `COLOR_RGB2RGBA`, `COLOR_RGB2XYZ`, `COLOR_RGB2YCR_CB`, `COLOR_RGB2YCrCb`, `COLOR_RGB2YUV`, `COLOR_RGB2YUV_I420`, `COLOR_RGB2YUV_IYUV`, `COLOR_RGB2YUV_YV12`, `COLOR_RGBA2BGR`, `COLOR_RGBA2BGR555`, `COLOR_RGBA2BGR565`, `COLOR_RGBA2BGRA`, `COLOR_RGBA2GRAY`, `COLOR_RGBA2M_RGBA`, `COLOR_RGBA2RGB`, `COLOR_RGBA2YUV_I420`, `COLOR_RGBA2YUV_IYUV`, `COLOR_RGBA2YUV_YV12`, `COLOR_RGBA2mRGBA`, `COLOR_XYZ2BGR`, `COLOR_XYZ2RGB`, `COLOR_YCR_CB2BGR`, `COLOR_YCR_CB2RGB`, `COLOR_YCrCb2BGR`, `COLOR_YCrCb2RGB`, `COLOR_YUV2BGR`, `COLOR_YUV2BGRA_I420`, `COLOR_YUV2BGRA_IYUV`, `COLOR_YUV2BGRA_NV12`, `COLOR_YUV2BGRA_NV21`, `COLOR_YUV2BGRA_UYNV`, `COLOR_YUV2BGRA_UYVY`, `COLOR_YUV2BGRA_Y422`, `COLOR_YUV2BGRA_YUNV`, `COLOR_YUV2BGRA_YUY2`, `COLOR_YUV2BGRA_YUYV`, `COLOR_YUV2BGRA_YV12`, `COLOR_YUV2BGRA_YVYU`, `COLOR_YUV2BGR_I420`, `COLOR_YUV2BGR_IYUV`, `COLOR_YUV2BGR_NV12`, `COLOR_YUV2BGR_NV21`, `COLOR_YUV2BGR_UYNV`, `COLOR_YUV2BGR_UYVY`, `COLOR_YUV2BGR_Y422`, `COLOR_YUV2BGR_YUNV`, `COLOR_YUV2BGR_YUY2`, `COLOR_YUV2BGR_YUYV`, `COLOR_YUV2BGR_YV12`, `COLOR_YUV2BGR_YVYU`, `COLOR_YUV2GRAY_420`, `COLOR_YUV2GRAY_I420`, `COLOR_YUV2GRAY_IYUV`, `COLOR_YUV2GRAY_NV12`, `COLOR_YUV2GRAY_NV21`, `COLOR_YUV2GRAY_UYNV`, `COLOR_YUV2GRAY_UYVY`, `COLOR_YUV2GRAY_Y422`, `COLOR_YUV2GRAY_YUNV`, `COLOR_YUV2GRAY_YUY2`, `COLOR_YUV2GRAY_YUYV`, `COLOR_YUV2GRAY_YV12`, `COLOR_YUV2GRAY_YVYU`, `COLOR_YUV2RGB`, `COLOR_YUV2RGBA_I420`, `COLOR_YUV2RGBA_IYUV`, `COLOR_YUV2RGBA_NV12`, `COLOR_YUV2RGBA_NV21`, `COLOR_YUV2RGBA_UYNV`, `COLOR_YUV2RGBA_UYVY`, `COLOR_YUV2RGBA_Y422`, `COLOR_YUV2RGBA_YUNV`, `COLOR_YUV2RGBA_YUY2`, `COLOR_YUV2RGBA_YUYV`, `COLOR_YUV2RGBA_YV12`, `COLOR_YUV2RGBA_YVYU`, `COLOR_YUV2RGB_I420`, `COLOR_YUV2RGB_IYUV`, `COLOR_YUV2RGB_NV12`, `COLOR_YUV2RGB_NV21`, `COLOR_YUV2RGB_UYNV`, `COLOR_YUV2RGB_UYVY`, `COLOR_YUV2RGB_Y422`, `COLOR_YUV2RGB_YUNV`, `COLOR_YUV2RGB_YUY2`, `COLOR_YUV2RGB_YUYV`, `COLOR_YUV2RGB_YV12`, `COLOR_YUV2RGB_YVYU`, `COLOR_YUV420P2BGR`, `COLOR_YUV420P2BGRA`, `COLOR_YUV420P2GRAY`, `COLOR_YUV420P2RGB`, `COLOR_YUV420P2RGBA`, `COLOR_YUV420SP2BGR`, `COLOR_YUV420SP2BGRA`, `COLOR_YUV420SP2GRAY`, `COLOR_YUV420SP2RGB`, `COLOR_YUV420SP2RGBA`, `COLOR_YUV420p2BGR`, `COLOR_YUV420p2BGRA`, `COLOR_YUV420p2GRAY`, `COLOR_YUV420p2RGB`, `COLOR_YUV420p2RGBA`, `COLOR_YUV420sp2BGR`, `COLOR_YUV420sp2BGRA`, `COLOR_YUV420sp2GRAY`, `COLOR_YUV420sp2RGB`, `COLOR_YUV420sp2RGBA`, `COLOR_mRGBA2RGBA`]
04_image_color_split.py
import cv2
img = cv2.imread(`./images/input.jpg`, cv2.IMREAD_COLOR)
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
y,u,v = cv2.split(yuv_img)
cv2.imshow(`Grayscale image`, gray_img)
cv2.imshow(`Y channel`, y)
cv2.imshow(`U channel`, u)
cv2.imshow(`V channel`, v)
cv2.waitKey()
合併影像色帶
05_image_color_merge.py
import cv2
img = cv2.imread(`./images/input.jpg`, cv2.IMREAD_COLOR)
g,b,r = cv2.split(img)
gbr_img = cv2.merge((g,b,r))
rbr_img = cv2.merge((r,b,r))
cv2.imshow(`Original`, img)
cv2.imshow(`GRB`, gbr_img)
cv2.imshow(`RBR`, rbr_img)
cv2.waitKey()
移動translation
06_image_translation.py
import cv2
import numpy as np
img = cv2.imread(`images/input.jpg`)
num_rows, num_cols = img.shape[:2]
translation_matrix = np.float32([ [1,0,70], [0,1,110] ])
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols + 70, num_rows + 110))
translation_matrix = np.float32([ [1,0,-30], [0,1,-50] ])
img_translation = cv2.warpAffine(img_translation, translation_matrix, (num_cols + 70 + 30, num_rows + 110 + 50))
cv2.imshow(`Translation`, img_translation)
cv2.waitKey()
旋轉
07_image_rotation.py
import cv2
import numpy as np
img = cv2.imread(`images/input.jpg`)
num_rows, num_cols = img.shape[:2]
translation_matrix = np.float32([ [1,0,70], [0,1,110] ])
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols + 70, num_rows + 110))
translation_matrix = np.float32([ [1,0,-30], [0,1,-50] ])
img_translation = cv2.warpAffine(img_translation, translation_matrix, (num_cols + 70 + 30, num_rows + 110 + 50))
cv2.imshow(`Translation`, img_translation)
cv2.waitKey()
縮放
08_image_scaling.py
import cv2
img = cv2.imread(`images/input.jpg`)
img_scaled = cv2.resize(img,None,fx=1.2, fy=1.2, interpolation = cv2.INTER_LINEAR)
cv2.imshow(`Scaling - Linear Interpolation`, img_scaled)
img_scaled = cv2.resize(img,None,fx=1.2, fy=1.2, interpolation = cv2.INTER_CUBIC)
cv2.imshow(`Scaling - Cubic Interpolation`, img_scaled)
img_scaled = cv2.resize(img,(450, 400), interpolation = cv2.INTER_AREA)
cv2.imshow(`Scaling - Skewed Size`, img_scaled)
cv2.waitKey()
仿射變換
09_affine_transformation.py
import cv2
import numpy as np
img = cv2.imread(`images/input.jpg`)
rows, cols = img.shape[:2]
src_points = np.float32([[0,0], [cols-1,0], [0,rows-1]])
dst_points = np.float32([[0,0], [int(0.6*(cols-1)),0], [int(0.4*(cols-1)),rows-1]])
affine_matrix = cv2.getAffineTransform(src_points, dst_points)
img_output = cv2.warpAffine(img, affine_matrix, (cols,rows))
cv2.imshow(`Input`, img)
cv2.imshow(`Output`, img_output)
cv2.waitKey()
射影變換
10_projective_transformation.py
import cv2
import numpy as np
img = cv2.imread(`images/input.jpg`)
rows, cols = img.shape[:2]
src_points = np.float32([[0,0], [cols-1,0], [0,rows-1], [cols-1,rows-1]])
dst_points = np.float32([[0,0], [cols-1,0], [int(0.33*cols),rows-1], [int(0.66*cols),rows-1]])
projective_matrix = cv2.getPerspectiveTransform(src_points, dst_points)
img_output = cv2.warpPerspective(img, projective_matrix, (cols,rows))
cv2.imshow(`Input`, img)
cv2.imshow(`Output`, img_output)
cv2.waitKey()
影像變形
11_image_warping.py
import numpy as np
import math
img = cv2.imread(`images/input.jpg`, cv2.IMREAD_GRAYSCALE)
rows, cols = img.shape
#####################
# Vertical wave
img_output = np.zeros(img.shape, dtype=img.dtype)
for i in range(rows):
for j in range(cols):
offset_x = int(25.0 * math.sin(2 * 3.14 * i / 180))
offset_y = 0
if j+offset_x < rows:
img_output[i,j] = img[i,(j+offset_x)%cols]
else:
img_output[i,j] = 0
cv2.imshow(`Input`, img)
cv2.imshow(`Vertical wave`, img_output)
#####################
# Horizontal wave
img_output = np.zeros(img.shape, dtype=img.dtype)
for i in range(rows):
for j in range(cols):
offset_x = 0
offset_y = int(16.0 * math.sin(2 * 3.14 * j / 150))
if i+offset_y < rows:
img_output[i,j] = img[(i+offset_y)%rows,j]
else:
img_output[i,j] = 0
cv2.imshow(`Horizontal wave`, img_output)
#####################
# Both horizontal and vertical
img_output = np.zeros(img.shape, dtype=img.dtype)
for i in range(rows):
for j in range(cols):
offset_x = int(20.0 * math.sin(2 * 3.14 * i / 150))
offset_y = int(20.0 * math.cos(2 * 3.14 * j / 150))
if i+offset_y < rows and j+offset_x < cols:
img_output[i,j] = img[(i+offset_y)%rows,(j+offset_x)%cols]
else:
img_output[i,j] = 0
cv2.imshow(`Multidirectional wave`, img_output)
#####################
# Concave effect
img_output = np.zeros(img.shape, dtype=img.dtype)
for i in range(rows):
for j in range(cols):
offset_x = int(128.0 * math.sin(2 * 3.14 * i / (2*cols)))
offset_y = 0
if j+offset_x < cols:
img_output[i,j] = img[i,(j+offset_x)%cols]
else:
img_output[i,j] = 0
cv2.imshow(`Concave`, img_output)
cv2.waitKey()
參考資料
- 討論qq群144081101 591302926 567351477 釘釘免費群21745728
- 本文最新版本地址
- 本文涉及的python測試開發庫 謝謝點贊!
- 本文相關海量書籍下載
相關文章
- [雪峰磁針石部落格]tesseractOCR識別工具及pytesseract
- [雪峰磁針石部落格]2018最佳python編輯器和IDEPythonIDE
- [雪峰磁針石部落格]介面測試面試題面試題
- [雪峰磁針石部落格]multi-mechanize效能測試工具
- [雪峰磁針石部落格]2018最佳ssh免費登陸工具
- [雪峰磁針石部落格]pythontkinter圖形工具樣式作業Python
- [雪峰磁針石部落格]python計算機視覺深度學習2影像基礎Python計算機視覺深度學習
- [雪峰磁針石部落格]python包管理工具:Conda和pip比較Python
- [雪峰磁針石部落格]python庫介紹-argparse:命令列選項及引數解析Python命令列
- [雪峰磁針石部落格]python應用效能監控工具簡介Python
- [雪峰磁針石部落格]pythonGUI工具書籍下載-持續更新PythonNGUI
- [雪峰磁針石部落格]可愛的python測試開發庫Python
- [雪峰磁針石部落格]計算機視覺opcencv工具深度學習快速實戰1人臉識別計算機視覺深度學習
- [雪峰磁針石部落格]python標準模組介紹-string:文字常量和模板Python
- [雪峰磁針石部落格]2019-Python最佳資料科學工具庫Python資料科學
- [雪峰磁針石部落格]python爬蟲cookbook1爬蟲入門Python爬蟲
- [雪峰磁針石部落格]使用jython進行dubbo介面及ngrinder效能測試
- [雪峰磁針石部落格]資料倉儲快速入門教程1簡介
- [雪峰磁針石部落格]軟體自動化測試初學者忠告
- [雪峰磁針石部落格]Bokeh資料視覺化工具1快速入門視覺化
- [雪峰磁針石部落格]使用python3和flask構建RESTfulAPI(介面測試服務)PythonFlaskRESTAPI
- [雪峰磁針石部落格]python計算機視覺深度學習1簡介Python計算機視覺深度學習
- [雪峰磁針石部落格]pythonGUI作業:tkinter控制元件改變背景色PythonNGUI控制元件
- [雪峰磁針石部落格]滲透測試簡介1滲透測試簡介
- [雪峰磁針石部落格]大資料Hadoop工具python教程9-Luigi工作流大資料HadoopPythonUI
- [雪峰磁針石部落格]flask構建自動化測試平臺1-helloFlask
- [雪峰磁針石部落格]flask構建自動化測試平臺3-模板Flask
- [雪峰磁針石部落格]python人工智慧作業:Windows使用SAPI和tkinter用不到40行實現文字轉語音工具Python人工智慧WindowsAPI
- [雪峰磁針石部落格]web開發工具flask中文英文書籍下載-持續更新WebFlask
- [雪峰磁針石部落格]軟體測試專家工具包1web測試Web
- [雪峰磁針石部落格]python網路作業:使用python的socket庫實現ICMP協議的pingPython協議
- [雪峰磁針石部落格]資料分析工具pandas快速入門教程4-資料匯聚
- [雪峰磁針石部落格]flask構建自動化測試平臺7-新增google地圖FlaskGo地圖
- [雪峰磁針石部落格]計算機視覺opcencv工具深度學習快速實戰2opencv快速入門計算機視覺深度學習OpenCV
- [雪峰磁針石部落格]selenium自動化測試工具python筆試面試專案實戰5鍵盤操作Python筆試面試
- [雪峰磁針石部落格]Python經典面試題:用3種方法實現堆疊和佇列並示例實際應用場景Python面試題佇列
- [雪峰磁針石部落格]python3.7極速入門教程1安裝:Linux(Ubuntu18.04)及Windows上安裝AnacondaPythonLinuxUbuntuWindows
- 例項物件和函式物件的區別物件函式