def letterbox_image(img,w,h): if((float)(w/img_w))<((float)(h/img_h)): new_w = w new_h = (img_h*w)//img_w # 整除 else: new_w = (img_w*h)//img_h new_h = h img_resized = img.resize((new_w,new_h),PIL_Image.BILINEAR) boxed = PIL_Image.new('RGB',(w,h),(127,127,127)) box1 = (0,0,new_w,new_h) boxed.paste(img_resized.crop(box1),((w-new_w)//2,(h-new_h)//2)) return boxed
时间: 2024-03-16 20:46:07 浏览: 92
这个函数的作用是将一张图片按照指定的宽度和高度进行缩放,并将其嵌入到一个指定大小的画布中心。从代码来看,这个函数的实现方式是合理的。但是,如果要考虑性能优化,可以使用Pillow库提供的thumbnail()函数进行图片缩放,可以更快地完成图片的缩放操作。此外,在嵌入到画布中心时,可以使用更简单的方式,如下所示:
```
boxed.paste(img_resized, ((w-new_w)//2, (h-new_h)//2))
```
这样可以减少代码量,提高代码的可读性。
相关问题
def yolo_meminout(frame_in,img_w,img_h,frame_out): ## image preprocess start start_time = time.time() start_time_total = start_time img_boxed = letterbox_image(frame_in,416,416) # img_boxed.save("./pictures/pictrue_boxed.jpg") img_array_3_416_416 = image_to_array_1dim(img_boxed,416,416) input_tmp_img = float32_int(img_array_3_416_416) end_time = time.time() image_preprocess = end_time - start_time # image preprocess end ## load image to memory(DRAM) start start_time = time.time() np.copyto(img_base_buffer[0:259584],input_tmp_img) end_time = time.time() load_image_to_memory = end_time - start_time
这段代码是用来进行图像预处理和将图像加载到内存中的,其中使用了一些自定义的函数,如letterbox_image和image_to_array_1dim。可以看出,图像被缩放到了416x416的大小,并且被转换为了一维的float32类型数组。然后,这个数组被拷贝到了内存中。这个函数的返回值不清楚,可能是预处理和加载所用的时间。
def button_image_open(self): print('button_image_open') name_list = [] img_name, _ = QtWidgets.QFileDialog.getOpenFileName( self, "打开图片", "", "*.jpg;;*.png;;All Files(*)") if not img_name: return img = cv2.imread(img_name) print(img_name) showimg = img with torch.no_grad(): img = letterbox(img, new_shape=self.opt.img_size)[0] # Convert # BGR to RGB, to 3x416x416 img = img[:, :, ::-1].transpose(2, 0, 1) img = np.ascontiguousarray(img) img = torch.from_numpy(img).to(self.device) img = img.half() if self.half else img.float() # uint8 to fp16/32 img /= 255.0 # 0 - 255 to 0.0 - 1.0 if img.ndimension() == 3: img = img.unsqueeze(0) # Inference pred = self.model(img, augment=self.opt.augment)[0] # Apply NMS pred = non_max_suppression(pred, self.opt.conf_thres, self.opt.iou_thres, classes=self.opt.classes, agnostic=self.opt.agnostic_nms) print(pred) # Process detections for i, det in enumerate(pred): if det is not None and len(det): # Rescale boxes from img_size to im0 size det[:, :4] = scale_coords( img.shape[2:], det[:, :4], showimg.shape).round() for *xyxy, conf, cls in reversed(det): label = '%s %.2f' % (self.names[int(cls)], conf) name_list.append(self.names[int(cls)]) plot_one_box(xyxy, showimg, label=label, color=self.colors[int(cls)], line_thickness=10)
这是一个用于打开图片并进行目标检测的函数,使用了OpenCV和PyTorch进行图像处理和模型推理。具体流程如下:
1. 使用QtWidgets.QFileDialog打开一个图片选择对话框,选中需要检测的图片。
2. 使用OpenCV的cv2.imread函数读取所选图片。
3. 对读取的图片进行预处理,包括调整图片大小、转换颜色空间、归一化等操作,使其符合模型输入要求。
4. 使用PyTorch进行模型推理,得到目标检测结果。
5. 对检测结果进行处理,包括将检测框坐标还原到原始图片尺寸、绘制检测框、输出检测结果等操作。
6. 返回检测到的目标类别列表。
阅读全文