如何在python中使用opencv复制图像区域?

时间:2012-01-31 18:04:13

标签: python opencv

我正在尝试使用http://iamabhik.wordpress.com/category/opencv/中的想法来实现车牌识别软件。

我使用“import cv2”在python中使用opencv实现了板位置。它工作正常,现在我需要将板块区域复制到另一个图像来进行字符分割,然后是OCR部分(可能使用神经网络)。

我发现GetSubRect()函数可以复制或隔离部分图像,但它似乎在python中不可用。还有其他选择吗? ROI功能似乎也没有实现。

是否有关于opencv的python接口的最新文档?

我在Debian wheezy / sid环境中从svn存储库(版本7239)编译了opencv。

随意提出替代方法/想法来解决这个问题。

提前致谢。

3 个答案:

答案 0 :(得分:50)

cv.GetSubRect和ROI函数都可以在Python中使用,但是在旧的import cv模式或import cv2.cv中。如果你比较熟悉,可以使用cv2.cv.GetSubRect()cv2.cv.SetImageROI

另一方面,由于新cv2中的numpy集成,在没有这些功能的情况下设置ROI很简单。

如果(x1,y1)和(x2,y2)是你获得的板的两个相对顶点,那么只需使用函数:

roi = gray[y1:y2, x1:x2]

这是您的图片投资回报率。

所以选择适合你的任何东西。

答案 1 :(得分:5)

示例:如果您有几点,并且想要复制区域包含其

r = cv2.boundingRect(pts)
cv2.imwrite('roi.png', im[r[0]:r[0]+r[2], r[1]:r[1]+r[3]])

答案 2 :(得分:3)

这是从图像中裁剪ROI的可视化

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

(0,0)视为图像的左上角,以x方向从左至右,将y方向从上至下。如果我们将(x1,y1)作为ROI的左上角,并将(x2,y2)作为ROI的右下角,则可以使用Numpy切片来裁剪图像:

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

但是通常我们不会有右下角的顶点。在典型情况下,我们将遍历可以使用cv2.boundingRect()找到矩形ROI坐标的轮廓。此外,如果我们想节省多个投资回报率,我们可以保留一个计数器

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

ROI_number = 0
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    ROI = image[y:y+h, x:x+w]
    cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
    ROI_number += 1

自OpenCV v2.2起,Numpy数组被幼稚地用于显示图像。这种用于提取ROI的Numpy切片方法可能不适用于旧版本