2016-12-14 91 views
1

我正在处理图像中的对象检测,并使用主图像上滑动窗口的矢量化图像切片数组。我想将所有窗口大小调整为小尺寸,以传递到对象检测器。不幸的是我发现,当我使用opencv resize函数时,它只能在我停止工作之前,一次性将其传递给它的一小部分图像调整大小。opencv调整大小函数是否存在最大数组大小限制?

在下面的代码的最后一行中,有两行指定一次尝试调整大小的窗口数量。对于给定的窗口大小,它可以与512一起使用,并且以513窗口失败。如果调整大小函数中存在最大数组大小限制,这将是3481600和3488400数组值之间的差异。

我一直没有找到任何引用调整大小函数的大小限制的opencv文档,但有任何人遇到这个问题?

在已知的矢量化图像切片收缩容量较大的不同模块中是否还有其他的调整大小函数?

我目前的工作是循环调整图像大小,使其大小比实验确定的最大数组大小小。

任何意见/智慧感谢!

import cv2 
import numpy as np 

img = cv2.imread('best_of_hope_kolosser_water_snow.jpg') 
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 


## ---- these would normally be function arguments for this module ------- 
window_size = np.resize(np.array([int(100/1.45),100]),(1,2)) 
w = 0 
strX_wPerc = 1/6 
strY_wPerc = 1/6 
data_patch_size = (30,46) 
## ---- end of; locally defining function arguments for module -------- 

## ---- sliding window params ----- 
win_w = window_size[w,0] 
win_h = window_size[w,1] 
strideX = int(window_size[w,0]*strX_wPerc) 
strideY = int(window_size[w,1]*strY_wPerc) 
## ---------------------------------- 

print('img shape: ', img.shape) 
# ^^ prints: img shape: (1200, 1920) 

## -------- sliding window vectorization steps -------------------------- 
num_vert_windows = len(np.arange(0,img.shape[0]-window_size[w,1],strideY)) # number of vertical windows that will be created 
indx = np.arange(0,img.shape[0]-window_size[w,1],strideY)[:,None]+np.arange(window_size[w,1]) # index that will be broadcasted across image 
vertical_windows = img[indx] # array of windows win_h tall and the full width of the image 

vertical_windows = np.transpose(vertical_windows,(0,2,1)) # transpose to prep for broadcasting 
num_horz_windows = len(np.arange(0,vertical_windows.shape[1]-window_size[w,0],strideX)) # number of horizontal windows that will be created 
indx = np.arange(0,vertical_windows.shape[1]-window_size[w,0],strideX)[:,None]+np.arange(window_size[w,0]) # index for broadcasting across vertical windows 
all_windows = vertical_windows[0:vertical_windows.shape[0],indx] # array of all the windows 
## -------- end of, sliding window vectorization ------------------------ 

total_windows = num_vert_windows*num_horz_windows 
all_windows = np.transpose(all_windows,(3,2,1,0)) # rearrange for resizing and intuitive indexing 
all_windows = np.resize(all_windows,(window_size[w,1],window_size[w,0],total_windows)) # resize to stack all windows 

print('sliding windows height:',all_windows.shape[0],', width:',all_windows.shape[1],', number of windows:',all_windows.shape[2]) 
# ^^ prints: sliding windows height: 100 , width: 68 , number of windows: 11661 

##num_windows_to_resize = all_windows.shape[2] # ideally this would resize them all at once 
num_windows_to_resize = 512 # 513 fails 
small_windows = cv2.resize(all_windows[:,:,0:num_windows_to_resize],data_patch_size,0,0,cv2.INTER_AREA) 

print('final windows (height, width, # windows):',small_windows.shape) 
# ^^ if resizing less than 513 windows, prints: final windows (height, width, # windows): (46, 30, 512) 
# ^^ if resizing more than 512 windows, prints: final windows (height, width, # windows): (46, 30) 

回答

1

我想弄清楚,你所要求的,可以概括为以下

>>> cv2.resize(np.zeros([1200,1920,512]), (30,46)).shape 
(46,30,512) 
>>> cv2.resize(np.zeros([1200,1920,513]), (30,46)).shape 
(46,30) 

那么,为什么第一行重新调整所有通道,而第二行似乎导致只有1个通道?

我发现默认情况下,OpenCV在单个图像中不支持超过512个通道。如在cvdef.h

#define CV_CN_MAX  512 

定义所以会发生什么是,cv2.resize输入被减少到只有第一通道。不建议更改最大频道,如下所述:http://answers.opencv.org/question/46296/increase-the-maximum-amount-of-channels-in-cvmat/ 因此,不幸的是,您需要分批调整大小。

+0

感谢iamai解释问题。我可能会寻找另一条缩小这些切片的路径,因为我没有意识到opencv正在将我的索引输入解释为颜色通道。 也谢谢你把我的问题弄清楚了。我是否应该编辑我的问题,以便它只包含您陈述的重要部分,或者保留原样? – Scout2013