Как скопировать область изображения, используя 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]])