本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

批量将yolo-v3检测结果在原图上画矩形框显示

在通过yolo-v3训练自己模型
操作参考: 训练模型
并得到测试结果将测试结果转化为一张图片对应一个txt检测结果的形式后
操作参考: 测试并转化测试结果

如果想要直观得查看检测结果需要将检测结果得矩形框叠加到原图上并保存,下面给出操作方法。

1、建立相关目录及文件

新建一个文件夹,命名:Draw_frame_in_picture。
在里面建立三个文件夹:

  1、test_results:来存放模型检测结果得txt文件
  2、save_image:用来存放画上矩形框后得图片
  3、raw_images:用来存放检测得原始图片

在里面建立 text_image_name_list.txt 文件 :文件中会通过代码写入检测图片得名称(不带后缀)
在里面建立 Draw_frame_in_picture.py 文件:在里面编辑批量画框操作得代码
在这里插入图片描述

2、导入相关文件

将原始检测图片复制到raw_images文件夹中
在这里插入图片描述
将检测结果复制到test_results文件夹中
在这里插入图片描述
此部分一定要图片与检测结果一一对应。

3、编辑代码

直接粘贴如下代码即可
注意配置开头部分四个路径

#coding:utf-8
import cv2
import os
#全局变量进行路径配置
text_results_folder ='/home/tukrin/zhl/Draw_frame_in_picture/test_results/'  #检测结果存放文件夹test_results路径
raw_images_folder = '/home/tukrin/zhl/Draw_frame_in_picture/raw_images/'  #检查图片存放文件夹raw_images路径
save_images_folder = '/home/tukrin/zhl/Draw_frame_in_picture/save_image/'  #保存图片文件夹save_image路径
text_image_name_list_file_path = '/home/tukrin/zhl/Draw_frame_in_picture/text_image_name_list.txt'  #里面有检测图片名称得txt文件路径
#函数:在一幅图片对应位置上加上矩形框  image_name 图片名称不含后缀 
def draw_a_tangle_in_one_image(image_name,text_results_folder,raw_images_folder,save_images_folder ):
  txt_path  = os.path.join(text_results_folder,'%s.txt'%(image_name))  #本次检测结果txt路径
  image_path = os.path.join( raw_images_folder,'%s.jpg'%(image_name))  #本次原始图片jpg路径
  save_file_path = os.path.join(save_images_folder,'%s.jpg'%(image_name)) #本次保存图片jpg路径
  flag_people_or_car_data = 0  #变量 代表类别
  source_file = open(txt_path)
  image = cv2.imread(image_path)
  for line in source_file: #例遍 txt文件得每一行
     staff = line.split() #对每行内容 通过以空格为分隔符对字符串进行切片
     if staff[0]== 'people' :
           flag_people_or_car_data = 1 
           continue
     elif   staff[0]== 'car'     :
             flag_people_or_car_data = 2 
             continue       
     else :
            if  flag_people_or_car_data == 1:                    
                 draw_people_tangle = cv2.rectangle(image,(int(staff[0]), int(staff[1])),(int(staff[2]),int(staff[3])),(0,255,0),1)   # 画框操作  人画 绿框  宽度为1
                 cv2.imwrite(save_file_path,draw_people_tangle)  #画框 并保存
            elif  flag_people_or_car_data == 2:
                 draw_car_tangle = cv2.rectangle(image,(int(staff[0]), int(staff[1])),(int(staff[2]),int(staff[3])),(0,0,255),1)     # 画框操作  车画 蓝框  宽度为1
                 cv2.imwrite(save_file_path,draw_car_tangle)  #画框 并保存
#函数:通过保存有原始图片得文件夹,生成写有所有检测图片名称(不带后缀)得txt
def make_imageName_file_list_txt(raw_images_folder, text_image_name_list_file_path):
   image_file_list = os.listdir(raw_images_folder) #得到该路径下所有文件名称带后缀
   text_image_name_list_file=open(text_image_name_list_file_path,'w')  #以写入得方式打开txt ,方便更新 不要用追加写
   for  image_file_name in image_file_list:#例遍写入
             image_name,file_extend = os.path.splitext(image_file_name)  # 去掉扩展命
             text_image_name_list_file.write(image_name+'\n') #写入
   text_image_name_list_file.close()
if __name__ == '__main__':           # 只有在文件作为脚本文件直接执行时才执行下面代码  
make_imageName_file_list_txt(raw_images_folder, text_image_name_list_file_path) #执行写入txt函数
image_names = open(text_image_name_list_file_path).read().strip().split() #得到图片名字不带后缀
for image_name in image_names: #例遍图片名称
         draw_a_tangle_in_one_image(image_name,text_results_folder,raw_images_folder,save_images_folder)#对图片画框

4、执行脚本

在对应路径下执行

 python Draw_frame_in_picture.py 

5、查看检测结果

在save_image文件夹中出现了大量图片,及画上框得新图片。
在这里插入图片描述