18

我正在尝试使用 opencv python 获取图像区域(ROI)。使用的opencv版本是2.4.3。但是,当我尝试调用 API

cv2.SetImageROI

它返回此错误

AttributeError: 'module' object has no attribute 'SetImageROI'

同样在检查文档时,它似乎暗示这个 api 是一个遗留的 python 函数。 http://docs.opencv.org/2.4.3/search.html?q=setimageroi

我不确定如何在 python 中使用当前版本的 opencv 来获得 ROI。有人可以建议如何去做吗?

谢谢

4

3 回答 3

38

好吧,进一步分析发现,cv2既然已经支持numpy数组结构,就不再需要任何API,整个图像都可以在数组本身中进行操作。例如:

img = cv2.imread('image.png')
img = img[c1:c1+25,r1:r1+25]

这里c1是左侧列像素位置,r1是对应的行位置。img 现在将像素内的图像指定为 ROI。

编辑:这里解释得很好,如何在 python 中使用 opencv 复制图像区域?

于 2013-03-15T06:32:34.770 回答
18

这是从图像中选择 ROI 的可视化

-------------------------------------------
|                                         | 
|    (x1, y1)      w                      |
|      ------------------------           |
|      |                      |           |
|      |                      |           | 
|      |         ROI          | h         |  
|      |                      |           |   
|      |                      |           |   
|      |                      |           |       
|      ------------------------           |   
|                           (x2, y2)      |    
|                                         |             
|                                         |             
|                                         |             
-------------------------------------------

考虑(0,0)图像的左上角,从左到右为 x 方向,从上到下为 y 方向。如果我们有一个 ROI(x1,y1)的左上角和(x2,y2)右下角顶点,我们可以使用 Numpy 切片来裁剪图像:

ROI = image[y1:y2, x1:x2]

但通常我们不会有右下角的顶点。在典型情况下,我们很可能会在迭代轮廓时(x,y,w,h)获得 ROI 的边界框坐标cv2.boundingRect()

cnts = cv2.findContours(grayscale_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    ROI = image[y:y+h, x:x+w]

从 OpenCV v2.2 开始,Numpy 数组被天真地用于显示图像。这种用于提取 ROI 的 Numpy 切片方法可能不适用于旧版本

于 2019-10-03T03:01:48.750 回答
5

文档中所述,关于您收到的错误消息,您需要导入适当的模块,然后调用SetImageROI()方法:

import cv
cv.SetImageROI(imag, rect)
于 2015-03-05T16:37:52.037 回答