40

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

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

我发现 GetSubRect() 函数可以复制或隔离图像的一部分,但它似乎在 python 中不可用。有替代方案吗?ROI 功能似乎也没有实现。

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

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

随意提出解决此问题的替代方法/想法。

提前致谢。

4

3 回答 3

69

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]

那是您的图像投资回报率。

所以选择适合你的。

于 2012-01-31T18:37:51.907 回答
23

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

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

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

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

但通常我们不会有右下角的顶点。在典型情况下,我们将遍历可以找到矩形 ROI 坐标的轮廓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 切片方法可能不适用于旧版本

于 2019-10-01T03:33:18.810 回答
7

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

r = cv2.boundingRect(pts)
cv2.imwrite('roi.png', im[r[0]:r[0]+r[2], r[1]:r[1]+r[3]])
于 2012-06-12T14:39:28.920 回答