我正在尝试使用http://iamabhik.wordpress.com/category/opencv/中的想法来实现车牌识别软件。
我使用“import cv2”在python中使用opencv实现了板位置。它工作正常,现在我需要将板块区域复制到另一个图像来进行字符分割,然后是OCR部分(可能使用神经网络)。
我发现GetSubRect()函数可以复制或隔离部分图像,但它似乎在python中不可用。还有其他选择吗? ROI功能似乎也没有实现。
是否有关于opencv的python接口的最新文档?
我在Debian wheezy / sid环境中从svn存储库(版本7239)编译了opencv。
随意提出替代方法/想法来解决这个问题。
提前致谢。
答案 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切片方法可能不适用于旧版本