Как скопировать область изображения, используя opencv в python?

Я пытаюсь реализовать программное обеспечение для распознавания номерных знаков, используя идеи из http://iamabhik.wordpress.com/category/opencv/.

Я реализовал расположение пластины, используя opencv в python, используя "import cv2". Это работает нормально, и теперь мне нужно скопировать область планшета на другое изображение, чтобы выполнить сегментацию символов, а затем часть OCR (возможно, с использованием нейронной сети).

Я нашел функцию GetSubRect() для копирования или изоляции части изображения, но она не доступна в python. Есть ли альтернатива? Функции ROI также не реализованы.

Есть ли актуальная документация по интерфейсу python для opencv?

Я скомпилировал opencv из репозитория svn (редакция 7239) в среде Debian wheezy/sid.

Не стесняйтесь предлагать альтернативные методы / идеи для решения этой проблемы.

Заранее спасибо.

2 ответа

Обе функции cv.GetSubRect и ROI доступны в Python, но в старых import cv режим или import cv2.cv, т.е. использовать cv2.cv.GetSubRect() или же cv2.cv.SetImageROI если вы знакомы с ними.

С другой стороны, легко установить ROI без этих функций из-за сложной интеграции в новом cv2.

Если (x1,y1) и (x2,y2) являются двумя противоположными вершинами полученной вами пластины, то просто используйте функцию:

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

это ваш имидж ROI.

Так что выбирайте то, что вам подходит.

Вот визуализация для обрезки ROI из изображения

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

Рассмотреть возможность (0,0)как левый верхний угол изображения с направлением слева направо по оси X и сверху вниз по оси Y. Если у нас есть(x1,y1) как вверху слева и (x2,y2) в качестве нижней правой вершины области интереса мы можем использовать Numpy-срез для обрезки изображения с помощью:

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

Но обычно у нас не будет правой нижней вершины. В типичных случаях мы будем повторять контуры, где прямоугольные координаты области интереса могут быть найдены с помощью cv2.boundingRect(). Кроме того, если мы хотим сохранить несколько рентабельности инвестиций, мы могли бы вести счетчик

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 наивно используются для отображения изображений. Этот метод нарезки Numpy для извлечения ROI может не работать со старыми версиями

Пример: если у вас мало точек, и вы хотите скопировать регион содержит

r = cv2.boundingRect(pts)
cv2.imwrite('roi.png', im[r[0]:r[0]+r[2], r[1]:r[1]+r[3]])
Другие вопросы по тегам