OpenCV Python中的兴趣区域
我正在尝试使用opencv的python库获取图像的一部分(也就是感兴趣区域,简称ROI)。我使用的opencv版本是2.4.3。不过,当我尝试调用这个接口时
cv2.SetImageROI
却出现了这个错误
AttributeError: 'module' object has no attribute 'SetImageROI'
而且查看文档后发现,这个接口似乎是一个旧版的python函数。
http://docs.opencv.org/2.4.3/search.html?q=setimageroi我不太确定在这个版本的opencv中该如何获取ROI。有没有人能建议我该怎么做呢?
谢谢
3 个回答
6
正如在文档中提到的,关于你收到的错误信息,你需要先导入合适的模块,然后再调用SetImageROI()
方法:
import cv
cv.SetImageROI(imag, rect)
23
这里有一个关于如何从图片中选择感兴趣区域(ROI)的可视化示例。
-------------------------------------------
| |
| (x1, y1) w |
| ------------------------ |
| | | |
| | | |
| | ROI | h |
| | | |
| | | |
| | | |
| ------------------------ |
| (x2, y2) |
| |
| |
| |
-------------------------------------------
我们把(0,0)
看作是图片的左上角,x轴是从左到右,y轴是从上到下。如果我们有(x1,y1)
作为ROI的左上角,(x2,y2)
作为右下角,我们可以用Numpy的切片功能来裁剪图片,方法是:
ROI = image[y1:y2, x1:x2]
不过通常我们不会直接有右下角的坐标。在大多数情况下,我们更可能会得到ROI的边界框(x,y,w,h)
的坐标,这些坐标是通过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 2.2版本以来,Numpy数组被简单地用来显示图片。这种用Numpy切片提取ROI的方法在旧版本中可能无法使用。
41
好的,经过进一步分析,我意识到cv2已经支持numpy数组结构,所以不再需要单独的API了,整个图像可以直接在数组里进行操作。
比如:
img = cv2.imread('image.png')
img = img[c1:c1+25,r1:r1+25]
这里c1是左侧列的像素位置,r1是对应的行位置。而img现在包含了在这些像素范围内指定的图像,称为感兴趣区域(ROI)。
编辑:这里解释得很好,如何在Python中使用opencv复制图像区域?