圖像切割與ROI¶
概要¶
講解了使用OpenCV的SelectROI函數, 裁剪圖片獲取圖片的局部(ROI)
keywords ROI SelectROI 切割 索引
SelectROI函數介紹¶
selectROI
這個函數封裝在opencv拓展包xfeature2d
里面, 如果opencv是你自己編譯的要注意, 編譯的時候要添加拓展選項.
關鍵函數就這么一行代碼.
# Select ROI rect = cv2.selectROI("image", img, showCrosshair, fromCenter)
參數解釋
-
"image"
: winName 窗口名稱 -
img
: 目標想要裁剪的圖像 -
showCrosshair
: 是否顯示網格 -
True
顯示網格 -
False
只有矩形 -
fromCenter
: -
True
第一次選中的點為矩形的中心. -
False
第一次選中的點為矩形的左上角.
返回的是一個tuple值, 代表矩形區域. 分別代表矩形左上角坐標 (x, y) 與矩形寬度w
跟高度h
(x, y, w, h) = rect
切片的時候一定要注意, 第一維指的是行數, 第二維度指的是列數.
imCrop = img[y : y+h, x:x+w]
使用過程¶
第一步我們要選中這個矩形區域.
接下來我們來確認是否選中.
如果你要重新選擇, 需要在別的地方點擊一下.
如果確認的話, 按Enter
回車 或者Blank
空格鍵.
如果撤銷選擇, 按c
鍵.
這就是我們最終獲取的ROI區域的圖片.
源代碼¶
src/select_roi_demo.py
''' 回車或者空格確認選擇 c鍵 撤銷選擇 ''' import numpy as np import cv2 # 設定文件路徑 img_path = './screenshot.png' # Read image img = cv2.imread(img_path) # 創建一個窗口 cv2.namedWindow("image", flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) cv2.namedWindow("image_roi", flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO) cv2.imshow("image", img) # 是否顯示網格 showCrosshair = True # 如果為Ture的話 , 則鼠標的其實位置就作為了roi的中心 # False: 從左上角到右下角選中區域 fromCenter = False # Select ROI rect = cv2.selectROI("image", img, showCrosshair, fromCenter) print("選中矩形區域") (x, y, w, h) = rect # Crop image imCrop = img[y : y+h, x:x+w] # Display cropped image cv2.imshow("image_roi", imCrop) cv2.imwrite("image_roi.png", imCrop) cv2.waitKey(0)