2014-05-23 11 views
5

Sto usando la ricerca selettiva qui: http://koen.me/research/selectivesearch/ Ciò fornisce possibili aree di interesse in cui un oggetto potrebbe essere. Voglio fare un po 'di elaborazione e mantenere solo alcune delle regioni, e quindi rimuovere le caselle di delimitazione duplicate per avere una raccolta finale di scatole di delimitazione. Per eliminare le regioni di caselle di delimitazione indesiderate/duplicate, sto utilizzando la funzione grouprectangles di opencv per l'eliminazione.python opencv TypeError: layout dell'array di output incompatibile con cv :: Mat

Una volta che ho le regioni interessanti Matlab dal "algoritmo di ricerca selettivo" nel link qui sopra, ho salvare i risultati in un file .mat e poi recuperarli in un programma di pitone, in questo modo:

import scipy.io as sio 
inboxes = sio.loadmat('C:\\PATH_TO_MATFILE.mat') 
candidates = np.array(inboxes['boxes']) 
# candidates is 4 x N array with each row describing a bounding box like this: 
# [rowBegin colBegin rowEnd colEnd] 
# Now I will process the candidates and retain only those regions that are interesting 
found = [] # This is the list in which I will retain what's interesting 
for win in candidates: 
    # doing some processing here, and if some condition is met, then retain it: 
    found.append(win) 

# Now I want to store only the interesting regions, stored in 'found', 
# and prune unnecessary bounding boxes 

boxes = cv2.groupRectangles(found, 1, 2) # But I get an error here 

L'errore è:

boxes = cv2.groupRectangles(found, 1, 2) 
TypeError: Layout of the output array rectList is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels) 

Cosa c'è di sbagliato? Ho fatto qualcosa di molto simile in un altro pezzo di codice che non ha dato errori. Questo è stato il codice senza errori:

inboxes = sio.loadmat('C:\\PATH_TO_MY_FILE\\boxes.mat') 
boxes = np.array(inboxes['boxes']) 
pruned_boxes = cv2.groupRectangles(boxes.tolist(), 100, 300) 

L'unica differenza che posso vedere è che boxes era una matrice NumPy che ho poi convertito in un elenco. Ma nel mio codice problematico, found è già un elenco.

risposta

4

La soluzione era quella di convertire i found prima a una matrice NumPy, e poi a recovert in un elenco:

found = np.array(found) 
boxes = cv2.groupRectangles(found.tolist(), 1, 2) 
21

La mia soluzione era semplicemente quello di chiedere una copia della matrice originale ... (dio & Gary Bradski sa perché ...)

im = dbimg[i] 
bb = boxes[i] 
m = im.transpose((1, 2, 0)).astype(np.uint8).copy() 
pt1 = (bb[0],bb[1]) 
pt2 = (bb[0]+bb[2],bb[1]+bb[3]) 
cv2.rectangle(m,pt1,pt2,(0,255,0),2) 
+3

semplicemente copiando la matrice ha lavorato per me per un errore simile pure. –

+0

Posso confermare anche questo, non sembra esserci alcuna differenza visibile, tho. – Pwnna

+0

Questa soluzione ha funzionato per un errore simile prodotto dalla funzione cv2.ellipse() – DanGoodrick

0

Opencv sembra avere problemi di disegno per NumPy matrici che hanno il tipo di dati np.int64, che è il tipo di dati predefinito restituito da metodi come np.array e 01.233.:

>>> canvas = np.full((256, 256, 3), 255) 
>>> canvas 
array([[255, 255, 255], 
     [255, 255, 255], 
     [255, 255, 255]]) 
>>> canvas.dtype 
dtype('int64') 
>>> cv2.rectangle(canvas, (0, 0), (2, 2), (0, 0, 0)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels) 

La soluzione è quello di convertire l'array np.int32 prima:

>>> cv2.rectangle(canvas.astype(np.int32), (0, 0), (2, 2), (0, 0, 0)) 
array([[ 0, 0, 0], 
     [ 0, 255, 0], 
     [ 0, 0, 0]], dtype=int32)