2014-05-23 13 views
5

Tôi đang sử dụng tìm kiếm chọn lọc tại đây: http://koen.me/research/selectivesearch/ Điều này cho phép các vùng có thể quan tâm đối tượng có thể ở đâu. Tôi muốn thực hiện một số xử lý và chỉ giữ lại một số vùng, sau đó loại bỏ các hộp giới hạn trùng lặp để có một tập hợp các hộp giới hạn gọn gàng cuối cùng. Để loại bỏ các vùng hộp giới hạn không mong muốn/trùng lặp, tôi đang sử dụng hàm grouprectangles của opencv để cắt tỉa.python opencv TypeError: Bố cục của mảng đầu ra không tương thích với cv :: Mat

Khi tôi nhận được các khu vực thú vị từ Matlab từ "thuật toán tìm kiếm chọn lọc" trong liên kết trên, tôi tiết kiệm được các kết quả trong một tập tin .mat và sau đó lấy chúng trong một chương trình python, như thế này:

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ỗi này là:

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) 

Có vấn đề gì? Tôi đã làm điều gì đó rất giống với một đoạn mã khác không có lỗi. Đây là mã lỗi miễn phí:

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

Sự khác biệt duy nhất tôi có thể thấy là boxes là một mảng NumPy mà tôi sau đó chuyển đổi vào một danh sách. Nhưng trong mã có vấn đề của tôi, found đã là một danh sách.

Trả lời

4

Giải pháp là để chuyển đổi found đầu tiên vào một mảng NumPy, và sau đó đến recovert nó thành một danh sách:

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

giải pháp riêng của tôi chỉ đơn giản là yêu cầu một bản sao của mảng ban đầu ... (thần & gary bradski biết tại sao ...)

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

chỉ đơn giản là sao chép mảng làm việc cho tôi vì một lỗi tương tự là tốt. –

+0

Có thể xác nhận điều này là tốt, có vẻ như không có sự khác biệt có thể nhìn thấy, tho. – Pwnna

+0

Giải pháp này làm việc cho một lỗi tương tự được tạo ra bởi hàm cv2.ellipse() – DanGoodrick

0

OpenCV dường như đã vấn đề vẽ để numPy mảng có kiểu dữ liệu np.int64, đó là kiểu dữ liệu mặc định trở lại bằng các phương pháp như np.array và 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) 

Giải pháp là để chuyển đổi mảng để np.int32 đầu tiên:

>>> 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) 
Các vấn đề liên quan