我在这里使用选择性搜索:http://koen.me/research/selectivesearch/,这给出了对象可能所在的可能感兴趣的区域。我想做一些处理,只保留一些区域,然后删除重复的边界框,以获得最终的整齐的边界框集合。为了去掉不需要的/重复的边界框区域,我使用OpenCV的grouprectangles
函数进行修剪。
一旦我从上面链接中的“选择性搜索算法”中获得了来自Matlab的感兴趣的区域,我就将结果保存在一个.mat
文件中,然后在一个python程序中检索它们,如下所示:
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
错误是:
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)
怎么了?我在另一段代码中做了非常类似的事情,没有给出错误。这是没有错误的代码:
inboxes = sio.loadmat('C:\\PATH_TO_MY_FILE\\boxes.mat')
boxes = np.array(inboxes['boxes'])
pruned_boxes = cv2.groupRectangles(boxes.tolist(), 100, 300)
我能看到的唯一区别是boxes
是一个数字数组,然后我将其转换为列表。但在我的有问题的代码中,found
已经是一个列表。
6条答案
按热度按时间falq053o1#
我自己的解决方案就是索要一份原始阵列的副本……(上帝和加里·布拉德斯基知道为什么……)
0pizxfdo2#
另一个原因可能是数组不是连续的。将其设置为连续也可以解决问题
image = np.ascontiguousarray(image, dtype=np.uint8)
yyyllmsg3#
解决方案是首先将
found
转换为Numy数组,然后将其恢复为列表:kjthegm64#
OpenCV在绘制数据类型为
np.int64
(np.array
和np.full
等方法返回的默认数据类型)的Numy数组时似乎遇到了问题:解决方案是首先将数组转换为
np.int32
:disho6za5#
为了完整起见,似乎我们中的许多人都使用了上面的Etienne Perot的解,减去
.copy()
。将数组类型转换为int就足够了。例如,使用霍夫变换时:只有到那时,才能使用
plt.imshow()
绘制数据ttisahbt6#
在跑步时也遇到了同样的问题
IMAGE=cv2.putText(IMAGE,‘Text’,org,Font,FontScale,COLOR,Thickness,cv2.LINE_AA)
这对我很管用
Image=cv2.putText(Image.astype(np.uint8).Copy(),‘Text’,org,Font,FontScale,COLOR,Thickness,cv2.LINE_AA)