Подтвердить что ты не робот

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

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

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

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

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

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

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

это ваш ROI изображения.

Итак, выбирай, какой бы ты ни был.

Ответ 2

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

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

Ответ 3

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

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

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

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

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