Как скопировать область изображения с помощью opencv в python?
Я пытаюсь реализовать программное обеспечение для распознавания номерных знаков, используя идеи http://iamabhik.wordpress.com/category/opencv/.
Я реализовал расположение пластины, используя opencv в python, используя "import cv2". Он работает нормально, и теперь мне нужно скопировать область пластины на другое изображение, чтобы выполнить сегментацию символов, а затем часть OCR (возможно, используя нейронную сеть).
Я обнаружил, что функция GetSubRect() копирует или изолирует часть изображения, но, похоже, она не доступна в python. Есть ли альтернатива? Функции ROI также не реализованы.
Есть ли обновленная документация интерфейса python для opencv?
Я собрал opencv из репозитория svn (ревизия 7239) в среде Debian wheezy/sid.
Не стесняйтесь предлагать альтернативные методы/идеи для решения этой проблемы.
Спасибо заранее.
Ответы
Ответ 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 может не работать со старыми версиями