概要¶
讲解了使用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)
ref
http://www.1zlab.com/wiki/python-opencv-tutorial/opencv-image-cut-select-roi/