感兴趣区域的OpenCV Python技术

22
我正在尝试使用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。请问有人能提供一些解决方法吗?

谢谢。

3个回答

41

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

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

c1表示左侧列的像素位置,r1表示对应的行位置。现在img将具有ROI中指定像素的图像。

编辑: 在这里非常好地解释了,如何使用Python中的OpenCV复制图像区域?


请查看@Abid Rahman K的回答:https://dev59.com/rWox5IYBdhLWcg3wnllI - Ann Orlova
那似乎在解释上更全面。谢谢。 - Ajay Nair
1
@AjayNair 如果感兴趣的区域是一个旋转的矩形,你会如何进行裁剪? - annena
这里是文档文章,相比于某些原因的答案,更清晰地解释了 http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#image-roi - gabbar0x
2
这里索引的顺序可能是错误的 - 我认为默认的Numpy索引顺序是先行再列。 - Andrew W
注意!顺序错误!请参考以下示例ROI = image[y1:y2,x1:x2] - 首先是行范围,然后是列范围。 - Valentin H

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 v2.2以来,Numpy数组被天然地用于显示图像。这种使用Numpy切片方法提取ROI的方式可能无法与旧版本兼容。


6

根据文档所述,针对您收到的错误信息,您需要导入适当的模块,然后调用SetImageROI()方法。

import cv
cv.SetImageROI(imag, rect)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接