Regiunea de interes opencv python (Programare, Python, Imagine, Opencv, Procesarea Imaginilor, Roi)

Ajay Nair a intrebat.

Încerc să obțin o regiune a unei imagini (ROI) folosind opencv python. Versiunea de opencv utilizată este 2.4.3. Cu toate acestea, atunci când încerc să apelez la API

cv2.SetImageROI

aceasta returnează următoarea eroare

AttributeError: 'module' object has no attribute 'SetImageROI'

De asemenea, verificând documentația, pare să sugereze că această API este o funcție python veche.http://docs.opencv.org/2.4.3/search.html?q=setimageroi

Nu sunt sigur cum să obțin ROI folosind această versiune actuală de opencv în python. Ar putea cineva să îmi sugereze cum să procedez în acest sens?

Mulțumesc

3 răspunsuri
Ajay Nair

Bine, La o analiză suplimentară a realizat că cv2, deoarece a fost de sprijinire a structurii de matrice numpy, nu mai este nevoie de un API, întreaga imagine poate fi manipulată în matricea însăși. ex:

img = cv2.imread('image.png')
img = img[c1:c1+25,r1:r1+25]

Aici c1 este locația pixelului coloanei din partea stângă, iar r1 este locația corespunzătoare a rândului. Iar img are acum imaginea specificată în interiorul pixelilor ca ROI.

EDIT: Foarte bine explicat aici, Cum să copiați o regiune de imagine folosind opencv în python?

Comentarii

  • Uitați-vă și la răspunsul lui @Abid Rahman K aici : stackoverflow.com/questions/9084609/… -.  > Por Ann Orlova.
  • Asta pare mai cuprinzător în explicație. Mulțumesc –  > Por Ajay Nair.
  • @AjayNair Cum ați putea decupla dacă regiunea de interes este un dreptunghi rotit? –  > Por Annena.
  • Iată articolul de documentație unde este mai clar decât răspunsul din anumite motive docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/… –  > Por bholagabbar.
  • Ordinea indicilor ar putea fi greșită aici – cred că ordinea implicită a indicilor Numpy este rânduri apoi coloane –  > Por Andrew W.
nathancy

Iată o vizualizare pentru selectarea unui ROI dintr-o imagine

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

Luați în considerare (0,0) ca fiind colțul din stânga-sus al imaginii, cu direcția x de la stânga la dreapta și direcția y de sus în jos. Dacă avem (x1,y1) ca fiind partea de sus-stânga și (x2,y2) ca vertexul dreapta-jos al unui ROI, putem folosi Numpy slicing pentru a tăia imaginea cu:

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

Dar, în mod normal, nu vom avea vertexul din dreapta jos. În cazuri obișnuite, cel mai probabil vom avea caseta de delimitare a ROI-ului (x,y,w,h) obținute din cv2.boundingRect() la iterația prin contururi

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]

Începând cu OpenCV v2.2, array-urile Numpy sunt utilizate în mod naiv pentru a afișa imagini. Este posibil ca această metodă de feliere Numpy pentru a extrage ROI să nu funcționeze cu versiunile mai vechi

utilizator4584333

După cum se menționează în documentația, și în ceea ce privește mesajul de eroare pe care l-ați primit, mai degrabă trebuie să importați modulul corespunzător și apoi să apelați SetImageROI() metoda :

import cv
cv.SetImageROI(imag, rect)