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

cur*_*mim 24 python opencv

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

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

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

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

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

免费提出替代方法/想法来解决这个问题.

提前致谢.

Abi*_*n K 53

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]
Run Code Online (Sandbox Code Playgroud)

那是你的形象投资回报率.

所以选择适合自己的东西.

  • @ user391339:这是一个numpy数组操作.所以它是行,列顺序.array [r] [c]给出元素,array [r1:r2,c1:c2]给出矩形.如果您使用OpenCV Rectangle,是的,它是x,y坐标. (3认同)
  • 好奇为什么它在y,x而不是x,y坐标?cv2.rectangle需要x,y ...直观地采用roi就像拿一个矩形 (2认同)

nat*_*ncy 18

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

-------------------------------------------
|                                         | 
|    (x1, y1)                             |
|      ------------------------           |
|      |                      |           |
|      |                      |           | 
|      |         ROI          |           |  
|      |                      |           |   
|      |                      |           |   
|      |                      |           |       
|      ------------------------           |   
|                           (x2, y2)      |    
|                                         |             
|                                         |             
|                                         |             
-------------------------------------------
Run Code Online (Sandbox Code Playgroud)

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

ROI = image[y1:y2, x1:x2]
Run Code Online (Sandbox Code Playgroud)

但通常我们不会有右下角的顶点。在典型情况下,我们将遍历轮廓,其中可以使用 找到矩形 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
Run Code Online (Sandbox Code Playgroud)

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


Xen*_*gem 6

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

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

  • 我认为它实际上是'r [1]:r [1] + r [3],r [0]:r [0] + r [2]`.因为boundingRect返回`r = [x,y,w,h]`而numpy语法需要`[y:y + h,x:x + w]` (15认同)