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

Область интересов 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. Может кто-нибудь предложить, как это сделать?

Спасибо

4b9b3361

Ответ 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 может не работать со старыми версиями