概要

讲解了使用OpenCV的SelectROI函数, 裁剪图片获取图片的局部(ROI)
keywords ROI SelectROI 切割 索引

SelectROI函数介绍

selectROI这个函数封装在opencv拓展包xfeature2d里面, 如果opencv是你自己编译的要注意, 编译的时候要添加拓展选项.
关键函数就这么一行代码.

  1. # Select ROI
  2. rect = cv2.selectROI("image", img, showCrosshair, fromCenter)

参数解释

  • “image” : winName 窗口名称
  • img : 目标想要裁剪的图像
  • showCrosshair : 是否显示网格
  • True 显示网格
  • False 只有矩形
  • fromCenter:
  • True 第一次选中的点为矩形的中心.
  • False 第一次选中的点为矩形的左上角.

返回的是一个tuple值, 代表矩形区域. 分别代表矩形左上角坐标 (x, y) 与矩形宽度w跟高度h

  1. (x, y, w, h) = rect

切片的时候一定要注意, 第一维指的是行数, 第二维度指的是列数.

  1. imCrop = img[y : y+h, x:x+w]

使用过程

第一步我们要选中这个矩形区域.
image.png
接下来我们来确认是否选中.
如果你要重新选择, 需要在别的地方点击一下.
如果确认的话, 按Enter回车 或者Blank空格键.
如果撤销选择, 按c键.
image.png
这就是我们最终获取的ROI区域的图片.
image.png

源代码

src/select_roi_demo.py

  1. '''
  2. 回车或者空格确认选择
  3. c键 撤销选择
  4. '''
  5. import numpy as np
  6. import cv2
  7. # 设定文件路径
  8. img_path = './screenshot.png'
  9. # Read image
  10. img = cv2.imread(img_path)
  11. # 创建一个窗口
  12. cv2.namedWindow("image", flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)
  13. cv2.namedWindow("image_roi", flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)
  14. cv2.imshow("image", img)
  15. # 是否显示网格
  16. showCrosshair = True
  17. # 如果为Ture的话 , 则鼠标的其实位置就作为了roi的中心
  18. # False: 从左上角到右下角选中区域
  19. fromCenter = False
  20. # Select ROI
  21. rect = cv2.selectROI("image", img, showCrosshair, fromCenter)
  22. print("选中矩形区域")
  23. (x, y, w, h) = rect
  24. # Crop image
  25. imCrop = img[y : y+h, x:x+w]
  26. # Display cropped image
  27. cv2.imshow("image_roi", imCrop)
  28. cv2.imwrite("image_roi.png", imCrop)
  29. cv2.waitKey(0)

ref
http://www.1zlab.com/wiki/python-opencv-tutorial/opencv-image-cut-select-roi/