import argparse import glob, cv2, os, pdb, time, sys sys.path.append('utils') sys.path.append('network/core') import numpy as np import torch from network.core.raft import RAFT from network.core.utils import flow_viz from network.core.utils.utils import InputPadder from floder.config import cfg #from utils.retrieval_feature import AntiFraudFeatureDataset DEVICE = 'cuda' pre_area = 0 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # 定义膨胀结构元素 kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 2)) # 定义腐蚀结构元素 def load_image(imfile): #img = np.array(Image.open(imfile)).astype(np.uint8) img = np.array(imfile).astype(np.uint8) img = torch.from_numpy(img).permute(2, 0, 1).float() return img[None].to(DEVICE) def viz(img, flo): img = img[0].permute(1,2,0).cpu().numpy() flo = flo[0].permute(1,2,0).cpu().numpy() flo = flow_viz.flow_to_image(flo) return flo def raft_init_model(args): model = torch.nn.DataParallel(RAFT(args)) model.load_state_dict(torch.load(args.model)) model = model.module model.to(DEVICE) model.eval() return model def vanalysis(model, imgsList): imfile1, imfile2 = None,None re = [] with torch.no_grad(): for nn, frame in enumerate(imgsList): #print('frame {}>>>{}'.format(nn, type(frame))) if frame.shape[0]>> {} coordination >>>{}'.format(result, coordination)) if not result is None: re.append(result) #cv2.imwrite('./imgs/tmpimgs/'+str(nn)+'.jpg', result) imfile1 = imfile2 return re[:10] # ——> list #def get_target(path, img, ori_img, nu, ori_mask, MASKIMG): def get_target(img, ori_img, MASKIMG): global pre_area img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, mask = cv2.threshold(img, 249, 255, cv2.THRESH_BINARY) mask_max_area, mask_max_contour = 0, 0 mask = cv2.bitwise_not(mask) mask_image = np.zeros((ori_img.shape[0], ori_img.shape[1], 1), np.uint8) if (cv2.__version__).split('.')[0] == '3': _, contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) else: contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) if len(contours)>100: return None, '_' for contour in contours: mask_area_now = cv2.contourArea(contour) if mask_area_now > mask_max_area: mask_max_area = mask_area_now mask_max_contour = contour if mask_max_area == 0 :return None, '_' #mask_max_area 目标位的面积 (x, y, w, h) = cv2.boundingRect(mask_max_contour) if (w*h)/(img.shape[0]*img.shape[1])>0.80: return None, '_' if min(w,h) <100 or max(w,h)>1000: return None, '_' coordination = [x, y, x + w, y + h] mask_image = cv2.fillPoly(mask_image, [mask_max_contour], (255)) if pre_area==0: pre_area = mask_max_area return None, '_' else: if abs(mask_max_area-pre_area)/pre_area > 0.4: pre_area = mask_max_area #print('abs:',abs(mask_max_area-pre_area)/pre_area) return None, '_' else: pre_area = mask_max_area A,B,C = mask_image, mask_image, mask_image mask_image = cv2.merge([A,B,C]) #该方法去除框外干扰 if not get_iou_ratio(mask_image, MASKIMG): return None, '_' show = cv2.bitwise_and(ori_img, mask_image) show = ori_img[coordination[1]:coordination[3], coordination[0]:coordination[2]] return show, coordination def get_iou_ratio(oimg, MASKIMG): mimg = cv2.imread(MASKIMG) iimg = cv2.bitwise_and(oimg, mimg) iimgarea = get_area(iimg) oimgarea = get_area(oimg) if iimgarea/oimgarea < 0.1: return False else: return True def get_area(img): kernel = np.ones((3, 3), dtype=np.uint8) img = cv2.dilate(img, kernel, 1) img = cv2.erode(img, kernel, 1) maxcontour, nu = 0,0 contours, _ = cv2.findContours(img[:,:,1] ,cv2.RETR_TREE , cv2.CHAIN_APPROX_NONE) if len(contours) == 0: return 0 for i in range(len(contours)): if maxcontour < len(contours[i]): maxcontour = len(contours[i]) nu = i area = cv2.contourArea(contours[nu]) return area if __name__ == '__main__': model = raft_init_model() from utils.tools import createNet import pdb #uuid_barcode = '6907992825762' imgslist = [] for imgname in os.listdir('test_imgs'): imgslist.append(cv2.imread(os.sep.join(['test_imgs', imgname]))) pdb.set_trace() analysis = vanalysis(model=model, video_path=imgslist) # analysis_video(model, video_path, result_path)