Область интересов opencv python
Я пытаюсь получить область изображения (ROI), используя opencv python. Используемая версия opencv - 2.4.3. Однако, когда я пытаюсь вызвать API
cv2.SetImageROI
он возвращает мне ошибку
AttributeError: 'module' object has no attribute 'SetImageROI'
Также при проверке документации кажется, что это api - устаревшая функция python.
http://docs.opencv.org/2.4.3/search.html?q=setimageroi
Я не уверен, как сделать ROI, используя эту текущую версию opencv в python. Может кто-нибудь предложить, как это сделать?
Спасибо
Ответы
Ответ 1
Хорошо. В дальнейшем анализ понял, что cv2, поскольку он поддерживает структуру массива numpy, больше не требуется API, все изображение можно манипулировать в самом массиве.
например:
img = cv2.imread('image.png')
img = img[c1:c1+25,r1:r1+25]
Здесь c1 - местоположение пикселя столбца левой стороны, а r1 - соответствующая позиция строки. И img теперь имеет изображение, указанное в пикселях, как ROI.
EDIT:
Очень хорошо объяснено здесь, Как скопировать область изображения с помощью opencv в python?
Ответ 2
Как упомянуто в документации и что касается полученного сообщения об ошибке, вам скорее нужно импортировать соответствующий модуль и затем вызвать метод SetImageROI()
:
import cv
cv.SetImageROI(imag, rect)
Ответ 3
Вот визуализация для выбора ROI из изображения
-------------------------------------------
| |
| (x1, y1) w |
| ------------------------ |
| | | |
| | | |
| | ROI | h |
| | | |
| | | |
| | | |
| ------------------------ |
| (x2, y2) |
| |
| |
| |
-------------------------------------------
Рассмотрите (0,0)
как верхний левый angular изображения с слева направо в качестве направления x и сверху вниз в качестве направления y. Если у нас (x1,y1)
в качестве верхнего левого угла и (x2,y2)
в качестве нижнего правого угла ROI, мы можем использовать нарезку Numpy, чтобы обрезать изображение с помощью:
ROI = image[y1:y2, x1:x2]
Но обычно у нас не будет нижней правой вершины. В типичных случаях у нас, скорее всего, будут координаты ограничительной рамки ROI (x,y,w,h)
, полученные из cv2.boundingRect()
при итерации по контурам
cnts = cv2.findContours(grayscale_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
ROI = image[y:y+h, x:x+w]
Начиная с OpenCV v2.2, массивы Numpy наивно используются для отображения изображений. Этот метод нарезки Numpy для извлечения ROI может не работать со старыми версиями