Example #1
0
	def getFeatures(self, image, inithann, scale_adjust=1.0):
		extracted_roi = [0,0,0,0]   #[int,int,int,int]
		roi=list(self._roi)
		cx = roi[0] + roi[2]/2  #float
		cy = roi[1] + roi[3]/2  #float

		if(inithann):
			padded_w = roi[2] * self.padding
			padded_h = roi[3] * self.padding

			if(self.template_size > 1):
				if(padded_w >= padded_h):
					self._scale = padded_w / float(self.template_size)
				else:
					self._scale = padded_h / float(self.template_size)
				self._tmpl_sz[0] = int(padded_w / self._scale)
				self._tmpl_sz[1] = int(padded_h / self._scale)
			else:
				self._tmpl_sz[0] = int(padded_w)
				self._tmpl_sz[1] = int(padded_h)
				self._scale = 1.

			if(self._hogfeatures):
				self._tmpl_sz[0] = int(self._tmpl_sz[0]) // (2*self.cell_size) * 2*self.cell_size + 2*self.cell_size
				self._tmpl_sz[1] = int(self._tmpl_sz[1]) // (2*self.cell_size) * 2*self.cell_size + 2*self.cell_size
			else:
				self._tmpl_sz[0] = int(self._tmpl_sz[0]) // 2 * 2
				self._tmpl_sz[1] = int(self._tmpl_sz[1]) // 2 * 2

		extracted_roi[2] = int(scale_adjust * self._scale * self._tmpl_sz[0])
		extracted_roi[3] = int(scale_adjust * self._scale * self._tmpl_sz[1])
		extracted_roi[0] = int(cx - extracted_roi[2]//2)
		extracted_roi[1] = int(cy - extracted_roi[3]//2)

		z = subwindow(image, extracted_roi, cv2.BORDER_REPLICATE)
		if(z.shape[1]!=self._tmpl_sz[0] or z.shape[0]!=self._tmpl_sz[1]):
			tmplsz=map(int,self._tmpl_sz)
			tmplsz=list(tmplsz)
			z = cv2.resize(z, tuple(tmplsz))

		if(self._hogfeatures):
			mapp = {'sizeX':0, 'sizeY':0, 'numFeatures':0, 'map':0}
			mapp = fhog.getFeatureMaps(z, self.cell_size, mapp)
			mapp = fhog.normalizeAndTruncate(mapp, 0.2)
			mapp = fhog.PCAFeatureMaps(mapp)
			self.size_patch = list(map(int, [mapp['sizeY'], mapp['sizeX'], mapp['numFeatures']]))
			FeaturesMap = mapp['map'].reshape((self.size_patch[0]*self.size_patch[1], self.size_patch[2])).T   # (size_patch[2], size_patch[0]*size_patch[1])
		else:
			if(z.ndim==3 and z.shape[2]==3):
				FeaturesMap = cv2.cvtColor(z, cv2.COLOR_BGR2GRAY)   # z:(size_patch[0], size_patch[1], 3)  FeaturesMap:(size_patch[0], size_patch[1])   #np.int8  #0~255
			elif(z.ndim==2):
				FeaturesMap = z   #(size_patch[0], size_patch[1]) #np.int8  #0~255
			FeaturesMap = FeaturesMap.astype(np.float32) / 255.0 - 0.5
			self.size_patch = [z.shape[0], z.shape[1], 1]

		if(inithann):
			self.createHanningMats()  # createHanningMats need size_patch

		FeaturesMap = self.hann * FeaturesMap
		return FeaturesMap
Example #2
0
    def get_scale_sample(self, image):
        xsf = None
        for i in range(self.n_scales):
            # Size of subwindow waiting to be detect
            patch_width = self.base_width * self.scaleFactors[i] * self.currentScaleFactor
            patch_height = self.base_height * self.scaleFactors[i] * self.currentScaleFactor

            cx = self._roi[0] + self._roi[2] / 2.
            cy = self._roi[1] + self._roi[3] / 2.

            # Get the subwindow
            im_patch = extractImage(image, cx, cy, patch_width, patch_height)
            if self.scale_model_width > im_patch.shape[1]:
                im_patch_resized = cv2.resize(im_patch, (self.scale_model_width, self.scale_model_height), None, 0, 0, 1)
            else:
                im_patch_resized = cv2.resize(im_patch, (self.scale_model_width, self.scale_model_height), None, 0, 0, 3)

            mapp = {'sizeX': 0, 'sizeY': 0, 'numFeatures': 0, 'map': 0}
            mapp = fhog.getFeatureMaps(im_patch_resized, self.cell_size, mapp)
            mapp = fhog.normalizeAndTruncate(mapp, 0.2)
            mapp = fhog.PCAFeatureMaps(mapp)

            if i == 0:
                totalSize = mapp['numFeatures'] * mapp['sizeX'] * mapp['sizeY']
                xsf = np.zeros((totalSize, self.n_scales))

            # Multiply the FHOG results by hanning window and copy to the output
            FeaturesMap = mapp['map'].reshape((totalSize, 1))
            FeaturesMap = self.s_hann[0][i] * FeaturesMap
            xsf[:, i] = FeaturesMap[:, 0]

        return fftd(xsf, False, True)
Example #3
0
    def getFeatures(self, image, inithann, scale_adjust=1.):
        #print('getFeatures')
        extracted_roi = [0, 0, 0, 0]
        cx = self._roi[0] + self._roi[2] / 2
        cy = self._roi[1] + self._roi[3] / 2

        if inithann:
            padded_w = self._roi[2] * self.padding
            padded_h = self._roi[3] * self.padding

            if self.template_size > 1:
                # 把最大的边缩小到96,_scale是缩小比例
                # _tmpl_sz是滤波模板的大小也是裁剪下的PATCH大小
                if padded_w >= padded_h:
                    self._scale = padded_w / float(self.template_size)
                else:
                    self._scale = padded_h / float(self.template_size)
                self._tmpl_sz[0] = int(padded_w / self._scale)
                self._tmpl_sz[1] = int(padded_h / self._scale)
            else:
                self._tmpl_sz[0] = int(padded_w)
                self._tmpl_sz[1] = int(padded_h)
                self._scale = 1.

            if self._hogfeatures:
                self._tmpl_sz[0] = int(self._tmpl_sz[0]) // (2 * self.cell_size) * 2 * self.cell_size + 2 * self.cell_size
                self._tmpl_sz[1] = int(self._tmpl_sz[1]) // (2 * self.cell_size) * 2 * self.cell_size + 2 * self.cell_size
            else:
                self._tmpl_sz[0] = int(self._tmpl_sz[0]) // 2 * 2
                self._tmpl_sz[1] = int(self._tmpl_sz[1]) // 2 * 2

        # 选取从原图中扣下的图片位置大小
        extracted_roi[2] = int(scale_adjust * self._scale * self._tmpl_sz[0] * self.currentScaleFactor)
        extracted_roi[3] = int(scale_adjust * self._scale * self._tmpl_sz[1] * self.currentScaleFactor)

        extracted_roi[0] = int(cx - extracted_roi[2] / 2)
        extracted_roi[1] = int(cy - extracted_roi[3] / 2)
        #print('extracted_roi: ', extracted_roi)

        # z是当前帧被裁剪下的搜索区域, 基于extracted_roi获取(预测区域)
        z = subwindow(image, extracted_roi, cv2.BORDER_REPLICATE)
        # print('subwindow, select in z: ', z.shape)
        if self.cnn_multilayer == 0: # use frame_diff in multi_KCF
            if type(self.pre_frame) == type(z): # get inter-frame difference
                self.pre_frame = subwindow(self.pre_frame, extracted_roi, cv2.BORDER_REPLICATE)
                self.frame_diff = np.sum(abs(z - self.pre_frame)) / (z.shape[0]*z.shape[1])
            self.pre_frame = image

        if z.shape[1] != self._tmpl_sz[0] or z.shape[0] != self._tmpl_sz[1]: # 缩小到tmpl_sz
            z = cv2.resize(z, (self._tmpl_sz[0],self._tmpl_sz[1]))
        # print('resize z to tmpl_sz: ', z.shape)
        
        if self._hogfeatures:
            mapp = {'sizeX': 0, 'sizeY': 0, 'numFeatures': 0, 'map': 0}
            mapp = fhog.getFeatureMaps(z, self.cell_size, mapp)
            mapp = fhog.normalizeAndTruncate(mapp, 0.2)
            mapp = fhog.PCAFeatureMaps(mapp)
            # size_patch为列表,保存裁剪下来的特征图的【长,宽,通道】
            self.size_patch = list(map(int, [mapp['sizeY'], mapp['sizeX'], mapp['numFeatures']]))
            FeaturesMap = mapp['map'].reshape((self.size_patch[0] * self.size_patch[1], self.size_patch[2])).T # (size_patch[2], size_patch[0]*size_patch[1])

        elif self._cnnfeatures:
            FeaturesMap = self.get_feat(z)
            if self.multi_gray: # test multi_channel features
                FeaturesMap = FeaturesMap / 255.0 - 0.5
                self.size_patch = [FeaturesMap.shape[0], FeaturesMap.shape[1], FeaturesMap.shape[2]]
            else:
                if type(FeaturesMap) == type([]): # fill self.size_patch
                    self.size_patch = [FeaturesMap[0].shape[0], FeaturesMap[0].shape[1], FeaturesMap[0].shape[2]]
                    self.cnn_multidepth = [FeaturesMap[0].shape[2],FeaturesMap[1].shape[2],FeaturesMap[2].shape[2]]
                    #print('get multi cnn featMap: ', FeaturesMap[0].shape, self.cnn_multidepth)
                else:
                    #print('get single cnn featMap: ', FeaturesMap.shape)
                    # write self.size_patch by FeaturesMap.shape
                    self.size_patch = [FeaturesMap.shape[0], FeaturesMap.shape[1], FeaturesMap.shape[2]]
        else: # 将RGB图变为单通道灰度图
            if z.ndim == 3 and z.shape[2] == 3:
                FeaturesMap = cv2.cvtColor(z, cv2.COLOR_BGR2GRAY)
                if self.SAVE_feat:
                    path_gray = save_path + 'gray' + str(self.count) + '.jpg'
                    cv2.imwrite(path_gray, FeaturesMap)
            elif z.ndim == 2:
                FeaturesMap = z
            #print(FeaturesMap.shape)
            
            # 从此FeatureMap从-0.5到0.5
            FeaturesMap = FeaturesMap.astype(np.float32) / 255.0 - 0.5
            # size_patch为列表,保存裁剪下来的特征图的[长,宽,1]
            self.size_patch = [z.shape[0], z.shape[1], 1]
            self.count += 1
 
        if inithann:
            self.createHanningMats()

        #FeaturesMap = FeaturesMap.astype(np.float32) / 255.0 - 0.5
        if type(FeaturesMap) == type([]):
            for i in range(len(FeaturesMap)):
                FeaturesMap[i] = self.hann[i] * FeaturesMap[i]
        else:
            # print('add hann: ', self.hann.shape, '\n')
            FeaturesMap = self.hann * FeaturesMap # 加汉宁窗(cosine)减少频谱泄露
        return FeaturesMap
    def getFeatures(self, image, inithann, scale_adjust=1.):
        extracted_roi = [0, 0, 0, 0]
        cx = self._roi[0] + self._roi[2] / 2
        cy = self._roi[1] + self._roi[3] / 2
 
        if inithann:
            padded_w = self._roi[2] * self.padding
            padded_h = self._roi[3] * self.padding
 
            if self.template_size > 1:
                # 把最大的边缩小到96,_scale是缩小比例
                # _tmpl_sz是滤波模板的大小也是裁剪下的PATCH大小
                if padded_w >= padded_h:
                    self._scale = padded_w / float(self.template_size)
                else:
                    self._scale = padded_h / float(self.template_size)
                self._tmpl_sz[0] = int(padded_w / self._scale)
                self._tmpl_sz[1] = int(padded_h / self._scale)
            else:
                self._tmpl_sz[0] = int(padded_w)
                self._tmpl_sz[1] = int(padded_h)
                self._scale = 1.
 
            if self._hogfeatures:
                self._tmpl_sz[0] = int(self._tmpl_sz[0]) // (2 * self.cell_size) * 2 * self.cell_size + 2 * self.cell_size
                self._tmpl_sz[1] = int(self._tmpl_sz[1]) // (2 * self.cell_size) * 2 * self.cell_size + 2 * self.cell_size
            else:
                self._tmpl_sz[0] = int(self._tmpl_sz[0]) // 2 * 2
                self._tmpl_sz[1] = int(self._tmpl_sz[1]) // 2 * 2
 
        # 选取从原图中扣下的图片位置大小
        extracted_roi[2] = int(scale_adjust * self._scale * self._tmpl_sz[0] * self.currentScaleFactor)
        extracted_roi[3] = int(scale_adjust * self._scale * self._tmpl_sz[1] * self.currentScaleFactor)

        extracted_roi[0] = int(cx - extracted_roi[2] / 2)
        extracted_roi[1] = int(cy - extracted_roi[3] / 2)

        # z是当前帧被裁剪下的搜索区域
        z = subwindow(image, extracted_roi, cv2.BORDER_REPLICATE)
        if z.shape[1] != self._tmpl_sz[0] or z.shape[0] != self._tmpl_sz[1]: # 缩小到96
            z = cv2.resize(z, tuple(self._tmpl_sz))
 
        if self._hogfeatures:
            mapp = {'sizeX': 0, 'sizeY': 0, 'numFeatures': 0, 'map': 0}
            mapp = fhog.getFeatureMaps(z, self.cell_size, mapp)
            mapp = fhog.normalizeAndTruncate(mapp, 0.2)
            mapp = fhog.PCAFeatureMaps(mapp)
            # size_patch为列表,保存裁剪下来的特征图的【长,宽,通道】
            self.size_patch = list(map(int, [mapp['sizeY'], mapp['sizeX'], mapp['numFeatures']]))
            FeaturesMap = mapp['map'].reshape((self.size_patch[0] * self.size_patch[1], self.size_patch[2])).T # (size_patch[2], size_patch[0]*size_patch[1])

        else: # 将RGB图变为单通道灰度图
            if z.ndim == 3 and z.shape[2] == 3:
                FeaturesMap = cv2.cvtColor(z, cv2.COLOR_BGR2GRAY)
            elif z.ndim == 2:
                FeaturesMap = z
            
            # 从此FeatureMap从-0.5到0.5
            FeaturesMap = FeaturesMap.astype(np.float32) / 255.0 - 0.5
            # size_patch为列表,保存裁剪下来的特征图的【长,宽,1】
            self.size_patch = [z.shape[0], z.shape[1], 1]
 
        if inithann:
            self.createHanningMats()
 
        FeaturesMap = self.hann * FeaturesMap # 加汉宁(余弦)窗减少频谱泄露
        return FeaturesMap
Example #5
0
    def getFeatures(self,
                    image,
                    inithann,
                    scale_adjustx=1.0,
                    scale_adjusty=1.0):
        extracted_roi = [0, 0, 0, 0]  # [int,int,int,int]
        cx = self._roi[0] + self._roi[2] / 2  # float
        cy = self._roi[1] + self._roi[3] / 2  # float

        if inithann:
            padded_w = self._roi[2] * self.padding
            padded_h = self._roi[3] * self.padding

            if (self.template_size > 1):
                if (padded_w >= padded_h):
                    self._scalex = padded_w / float(self.template_size)
                else:
                    self._scaley = padded_h / float(self.template_size)
                self._tmpl_sz[0] = int(padded_w / self._scalex)
                self._tmpl_sz[1] = int(padded_h / self._scaley)
            else:
                self._tmpl_sz[0] = int(padded_w)
                self._tmpl_sz[1] = int(padded_h)
                self._scalex = 1.
                self._scaley = 1.

            if (self._hogfeatures):
                self._tmpl_sz[0] = int(self._tmpl_sz[0]) / (
                    2 *
                    self.cell_size) * 2 * self.cell_size + 2 * self.cell_size
                self._tmpl_sz[1] = int(self._tmpl_sz[1]) / (
                    2 *
                    self.cell_size) * 2 * self.cell_size + 2 * self.cell_size
            else:
                self._tmpl_sz[0] = int(self._tmpl_sz[0]) / 2 * 2
                self._tmpl_sz[1] = int(self._tmpl_sz[1]) / 2 * 2

        extracted_roi[2] = int(scale_adjustx * self._scalex * self._tmpl_sz[0])
        extracted_roi[3] = int(scale_adjusty * self._scaley * self._tmpl_sz[1])
        extracted_roi[0] = int(cx - extracted_roi[2] / 2)
        extracted_roi[1] = int(cy - extracted_roi[3] / 2)

        z = subwindow(image, extracted_roi, cv2.BORDER_REPLICATE)
        if (z.shape[1] != self._tmpl_sz[0] or z.shape[0] != self._tmpl_sz[1]):
            z = cv2.resize(z, tuple(np.array(self._tmpl_sz).astype(np.uint8)))

        if (self._hogfeatures):
            mapp = {'sizeX': 0, 'sizeY': 0, 'numFeatures': 0, 'map': 0}
            mapp = fhog.getFeatureMaps(z, self.cell_size, mapp)
            mapp = fhog.normalizeAndTruncate(mapp, 0.2)
            mapp = fhog.PCAFeatureMaps(mapp)
            self.size_patch = list(
                map(int, [mapp['sizeY'], mapp['sizeX'], mapp['numFeatures']]))
            FeaturesMap = mapp['map'].reshape(
                (self.size_patch[0] * self.size_patch[1], self.size_patch[2]
                 )).T  # (size_patch[2], size_patch[0]*size_patch[1])
            # t1 = time.time()
            # colormap = im2color(z, 1, self.size_patch[1], self.size_patch[0])
            # FeaturesMap = np.array(FeaturesMap.tolist() + colormap.tolist())
            # t2 = time.time()
            # self.size_patch[2] += 11
        else:
            if (z.ndim == 3 and z.shape[2] == 3):
                # z:(size_patch[0], size_patch[1], 3)  FeaturesMap:(size_patch[0], size_patch[1])   #np.int8  #0~255
                FeaturesMap = cv2.cvtColor(z, cv2.COLOR_BGR2HSV)[:, :, 0]
            elif (z.ndim == 2):
                FeaturesMap = z  # (size_patch[0], size_patch[1]) #np.int8  #0~255
            FeaturesMap = FeaturesMap.astype(np.float32) / 255.0 - 0.5
            self.size_patch = [z.shape[0], z.shape[1], 1]

        if (inithann):
            self.createHanningMats()  # createHanningMats need size_patch

        FeaturesMap = self.hann * FeaturesMap
        return FeaturesMap
Example #6
0
    def getFeatures(self, image, inithann, scale_adjust=1.0):
        extracted_roi = [0, 0, 0, 0]  # [int,int,int,int]
        print("11111111111111 = ", self._roi)
        # _roi = [0,0,0,0]
        # for item in self._roi:
        # print("item = ", item)

        # print("11111111111111111 ",self._roi)
        cx = self._roi[0] + self._roi[2] / 2
        # float 0123分别是左上角的坐标Xy,以及矩形的长和宽
        cy = self._roi[1] + self._roi[3] / 2  # float

        if (inithann):
            padded_w = self._roi[2] * self.padding
            padded_h = self._roi[3] * self.padding
            print("self.padding = ", self.padding)
            print("self._roi[ = ", self._roi)

            if (self.template_size >
                    1):  # template_size?? #把最大的边缩小到96,_scale是缩小比例
                # _tmpl_sz是滤波模板的大小也是裁剪下的PATCH大小
                print("padded_w = ", padded_w)
                print("padded_h = ", padded_h)
                if (padded_w >= padded_h):
                    self._scale = padded_w / float(self.template_size)
                else:
                    self._scale = padded_h / float(self.template_size)
                print("self._scale = ", self._scale)
                self._tmpl_sz[0] = int(padded_w / self._scale)  # ??
                self._tmpl_sz[1] = int(padded_h / self._scale)
            else:
                self._tmpl_sz[0] = int(padded_w)
                self._tmpl_sz[1] = int(padded_h)
                self._scale = 1.

            if (self._hogfeatures):
                self._tmpl_sz[0] = int(
                    (self._tmpl_sz[0]) /
                    (2 *
                     self.cell_size)) * 2 * self.cell_size + 2 * self.cell_size
                self._tmpl_sz[1] = int(
                    (self._tmpl_sz[1]) /
                    (2 *
                     self.cell_size)) * 2 * self.cell_size + 2 * self.cell_size
            else:
                self._tmpl_sz[0] = int(self._tmpl_sz[0]) / 2 * 2  # ??
                self._tmpl_sz[1] = int(self._tmpl_sz[1]) / 2 * 2

        extracted_roi[2] = int(scale_adjust * self._scale *
                               self._tmpl_sz[0])  # 选取从原图中扣下的图片位置大小
        extracted_roi[3] = int(scale_adjust * self._scale * self._tmpl_sz[1])
        extracted_roi[0] = int(cx - extracted_roi[2] / 2)
        extracted_roi[1] = int(cy - extracted_roi[3] / 2)

        z = subwindow(image, extracted_roi,
                      cv2.BORDER_REPLICATE)  # z是当前帧被裁剪下的搜索区域
        if (z.shape[1] != self._tmpl_sz[0]
                or z.shape[0] != self._tmpl_sz[1]):  # 缩小到96
            self._tmpl_sz[0] = int(self._tmpl_sz[0])
            self._tmpl_sz[1] = int(self._tmpl_sz[1])
            print("self._tmpl_sz = ", self._tmpl_sz)
            z = cv2.resize(z, tuple(self._tmpl_sz))

        if (self._hogfeatures):
            mapp = {'sizeX': 0, 'sizeY': 0, 'numFeatures': 0, 'map': 0}
            mapp = fhog.getFeatureMaps(z, self.cell_size, mapp)
            mapp = fhog.normalizeAndTruncate(mapp, 0.2)
            mapp = fhog.PCAFeatureMaps(mapp)

            print("sizeY = ", mapp['sizeY'])
            print("sizeX = ", mapp['sizeX'])
            print("numFeatures = ", mapp['numFeatures'])
            self.size_patch = map(
                int, [mapp['sizeY'], mapp['sizeX'], mapp['numFeatures']])
            # size_patch为列表,保存裁剪下来的特征图的【长,宽,通道】
            self.size_patch = list(self.size_patch)
            FeaturesMap = mapp['map'].reshape(
                (self.size_patch[0] * self.size_patch[1], self.size_patch[2]
                 )).T  # (size_patch[2], size_patch[0]*size_patch[1])
        else:
            if (z.ndim == 3 and z.shape[2] == 3):  # 三维且第三维长度为3??  三通道,也就是RGB图像
                FeaturesMap = cv2.cvtColor(z, cv2.COLOR_BGR2GRAY)
                # z:(size_patch[0], size_patch[1], 3)  FeaturesMap:(size_patch[0], size_patch[1])
                # #np.int8  #0~255
            elif (z.ndim == 2):
                FeaturesMap = z  # (size_patch[0], size_patch[1]) #np.int8  #0~255
            FeaturesMap = FeaturesMap.astype(np.float32) / 255.0 - 0.5
            # 从此FeatureMap从-0.5到0.5
            self.size_patch = [z.shape[0], z.shape[1],
                               1]  # size_patch为列表,保存裁剪下来的特征图的【长,宽,1】

        if (inithann):
            self.createHanningMats()  # createHanningMats need size_patch

        FeaturesMap = self.hann * FeaturesMap  # 加汉宁(余弦)窗减少频谱泄露
        return FeaturesMap
Example #7
0
    def getFeatures(self, image, inithann, scale_adjust=1.0):
        """
		提取窗口特征
		//步骤:
		//1.根据给定的框框找到合适的框框
		//2.提取HOG特征
		//3.对特征进行归一化和截断
		//4.对特征进行PCA降维
		//5.创建一个常数阵,对所有特征根据cell的位置进行加权
		:param image: 输入图像
		:param inithann: 是否使用汉宁窗
		:param scale_adjust: 调整因子
		:return: 返回提取到的特征
		"""
        extracted_roi = [0, 0, 0, 0]  # 用于提取特征的窗口
        cx = self._roi[0] + self._roi[2] / 2
        cy = self._roi[1] + self._roi[3] / 2

        if inithann:  # 初始化汉宁窗,只在第一帧的时候执行一次
            padded_w = self._roi[2] * self.padding
            padded_h = self._roi[3] * self.padding

            if self.template_size > 1:  # 按照长宽比修改_tmpl长宽大小,保证长边为96
                if padded_w >= padded_h:
                    self._scale = padded_w / float(self.template_size)
                else:
                    self._scale = padded_h / float(self.template_size)
                self._tmpl_sz[0] = int(padded_w / self._scale)
                self._tmpl_sz[1] = int(padded_h / self._scale)
            else:
                self._tmpl_sz[0] = int(padded_w)
                self._tmpl_sz[1] = int(padded_h)
                self._scale = 1.

            if self._hogfeatures:  # 设置_tmpl_sz的长宽:向上取原来长宽的最小2*cell_size倍
                self._tmpl_sz[0] = int(self._tmpl_sz[0]) // (
                    2 *
                    self.cell_size) * 2 * self.cell_size + 2 * self.cell_size
                self._tmpl_sz[1] = int(self._tmpl_sz[1]) // (
                    2 *
                    self.cell_size) * 2 * self.cell_size + 2 * self.cell_size
            else:
                self._tmpl_sz[0] = int(self._tmpl_sz[0]) // 2 * 2
                self._tmpl_sz[1] = int(self._tmpl_sz[1]) // 2 * 2

        extracted_roi[2] = int(scale_adjust * self._scale *
                               self._tmpl_sz[0])  # 检测区域大小
        extracted_roi[3] = int(scale_adjust * self._scale * self._tmpl_sz[1])
        extracted_roi[0] = int(cx - extracted_roi[2] / 2)  # 检测区域的左上角坐标
        extracted_roi[1] = int(cy - extracted_roi[3] / 2)

        z = tools.subwindow(image, extracted_roi,
                            cv2.BORDER_REPLICATE)  # 提取目标区域像素,超边界则做填充
        if z.shape[1] != self._tmpl_sz[0] or z.shape[0] != self._tmpl_sz[1]:

            z = cv2.resize(z, tuple(self._tmpl_sz))  # 按照比例缩小边界大小

        if self._hogfeatures:  # 提取HOG特征点
            mapp = {'sizeX': 0, 'sizeY': 0, 'numFeatures': 0, 'map': 0}
            mapp = fhog.getFeatureMaps(z, self.cell_size, mapp)
            mapp = fhog.normalizeAndTruncate(mapp, 0.2)  # 对HOG特征归一化和截断
            mapp = fhog.PCAFeatureMaps(mapp)  # PCA降维
            self.size_patch = list(
                map(int, [mapp['sizeY'], mapp['sizeX'], mapp['numFeatures']]))
            FeaturesMap = mapp['map'].reshape(
                (self.size_patch[0] * self.size_patch[1],
                 self.size_patch[2])).T
        else:
            if z.ndim == 3 and z.shape[2] == 3:
                FeaturesMap = cv2.cvtColor(
                    z, cv2.COLOR_BGR2GRAY)  # 如果图像时三通道则转换为灰度图
            elif z.ndim == 2:
                FeaturesMap = z
            FeaturesMap = FeaturesMap.astype(np.float32) / 255.0 - 0.5
            self.size_patch = [z.shape[0], z.shape[1], 1]

        if inithann:
            self.createHanningMats()

        FeaturesMap = self.hann * FeaturesMap
        return FeaturesMap