I'm using the selective search here: http://koen.me/research/selectivesearch/
This gives possible regions of interest where an object might be. I want to do some processing and retain only some of the regions, and then remove duplicate bounding boxes to have a final neat collection of bounding boxes. To discard unwanted/duplicated bounding boxes regions, I'm using the grouprectangles
function of opencv for pruning.
Once I get the interesting regions from Matlab from the "selective search algorithm" in the link above, I save the results in a .mat
file and then retrieve them in a python program, like this:
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
The error is:
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)
What's wrong? I did something very similar in another piece of code which gave no errors. This was the error-free code:
inboxes = sio.loadmat('C:\\PATH_TO_MY_FILE\\boxes.mat')
boxes = np.array(inboxes['boxes'])
pruned_boxes = cv2.groupRectangles(boxes.tolist(), 100, 300)
The only difference I can see is that boxes
was a numpy array which I then converted to a list. But in my problematic code, found
is already a list.
My own solution was simply to ask a copy of original array...(god & gary bradski knows why...)
The solution was to convert
found
first to a numpy array, and then to recovert it into a list:Just for the sake of completeness, it seems that many of us have used the solution of Etienne Perot above, minus
.copy()
. Converting the array type to int is enough. For example, when using the Hough transform:Only then could the data be plotted out using
plt.imshow()
Opencv appears to have issues drawing to numpy arrays that have the data type
np.int64
, which is the default data type returned by methods such asnp.array
andnp.full
:The solution is to convert the array to
np.int32
first:Another reason may be that the array is not contiguous. Making it contiguous would also solve the issue
image = np.ascontiguousarray(image, dtype=np.uint8)