python目标检测给图画框,bbox画到图上并保存案例

作者:别说话写代码 时间:2023-03-07 07:47:52 

我就废话不多说了,还是直接上代码吧!


import os
import xml.dom.minidom
import cv2 as cv

ImgPath = 'C:/Users/49691/Desktop/gangjin/gangjin_test/JPEGImages/'
AnnoPath = 'C:/Users/49691/Desktop/gangjin/gangjin_test/Annotations/' #xml文件地址
save_path = ''
def draw_anchor(ImgPath,AnnoPath,save_path):
 imagelist = os.listdir(ImgPath)
 for image in imagelist:

image_pre, ext = os.path.splitext(image)
   imgfile = ImgPath + image
   xmlfile = AnnoPath + image_pre + '.xml'
   # print(image)
   # 打开xml文档
   DOMTree = xml.dom.minidom.parse(xmlfile)
   # 得到文档元素对象
   collection = DOMTree.documentElement
   # 读取图片
   img = cv.imread(imgfile)

filenamelist = collection.getElementsByTagName("filename")
   filename = filenamelist[0].childNodes[0].data
   print(filename)
   # 得到标签名为object的信息
   objectlist = collection.getElementsByTagName("object")

for objects in objectlist:
     # 每个object中得到子标签名为name的信息
     namelist = objects.getElementsByTagName('name')
     # 通过此语句得到具体的某个name的值
     objectname = namelist[0].childNodes[0].data

bndbox = objects.getElementsByTagName('bndbox')
     # print(bndbox)
     for box in bndbox:
       x1_list = box.getElementsByTagName('xmin')
       x1 = int(x1_list[0].childNodes[0].data)
       y1_list = box.getElementsByTagName('ymin')
       y1 = int(y1_list[0].childNodes[0].data)
       x2_list = box.getElementsByTagName('xmax')  #注意坐标,看是否需要转换
       x2 = int(x2_list[0].childNodes[0].data)
       y2_list = box.getElementsByTagName('ymax')
       y2 = int(y2_list[0].childNodes[0].data)
       cv.rectangle(img, (x1, y1), (x2, y2), (255, 255, 255), thickness=2)
       cv.putText(img, objectname, (x1, y1), cv.FONT_HERSHEY_COMPLEX, 0.7, (0, 255, 0),
             thickness=2)
       # cv.imshow('head', img)
       cv.imwrite(save_path+'/'+filename, img)  #save picture

补充知识:深度学习python之用Faster-rcnn 检测结果(txt文件) 在原图画出box

使用Faster-rcnn 的test_net.py 检测网络的mAP等精度会生成一个检测结果(txt文件),格式如下:


000004 0.972 302.8 94.5 512.0 150.0
000004 0.950 348.1 166.1 512.0 242.9
000004 0.875 1.0 25.7 292.6 126.3
000004 0.730 1.0 138.5 488.3 230.0
000004 0.699 1.0 120.9 145.5 139.9
000004 0.592 54.4 227.4 431.9 343.4
000004 0.588 1.0 159.8 18.8 231.6
000004 0.126 1.0 247.1 342.3 270.0
000004 0.120 1.0 225.4 185.7 309.3

每行分别为 名称 检测概率 xmin ymin xmax ymax

问题在于每一行只显示一个box数据,每幅图像可能包括多个box,需要判断提取的多行数据是不是属于同一图片

下面使用python提取这些数据,在原图上画出box并且保存起来


import os
import os.path
import numpy as np
import xml.etree.ElementTree as xmlET
from PIL import Image, ImageDraw
import cPickle as pickle

txt_name = 'comp4_8a226fd7-753d-40fc-8013-f68d2a465579_det_test_ship.txt'
file_path_img = '/home/JPEGImages'
save_file_path = '/home/detect_results'

source_file = open(txt_name)

img_names = []
for line in source_file:
 staff = line.split()
 img_name = staff[0]
 img_names.append(img_name)

name_dict = {}
for i in img_names:
 if img_names.count(i)>0:
   name_dict[i] = img_names.count(i)

source_file.close()

source_file = open(txt_name)
for idx in name_dict:
 img = Image.open(os.path.join(file_path_img, idx + '.jpg'))
 draw = ImageDraw.Draw(img)
 for i in xrange(name_dict[idx]):
   line = source_file.readline()
   staff = line.split()
   score = staff[1]
   box = staff[2:6]
   draw.rectangle([int(np.round(float(box[0]))), int(np.round(float(box[1]))),
         int(np.round(float(box[2]))), int(np.round(float(box[3])))], outline=(255, 0, 0))
 img.save(os.path.join(save_file_path, idx + '.jpg'))

source_file.close()

运行完即可在保存文件夹中得到效果图。

来源:https://blog.csdn.net/qq_21997625/article/details/86558178

标签:python,图画框,bbox
0
投稿

猜你喜欢

  • CentOS 7 安装 MySQL 5.6遇到的各种问题小结

    2024-01-20 23:51:39
  • Win10系统下Pytorch环境的搭建过程

    2023-09-29 06:57:54
  • Linux下C连接MySQL出现错误解决一例

    2008-12-29 13:17:00
  • ASP.NET web.config中 数据库连接字符串加密解密

    2024-01-14 07:02:09
  • java之File对象对文件的操作常用的几个方法(推荐)

    2024-01-14 13:13:27
  • Vue组件通信方法案例总结

    2023-07-02 16:51:58
  • python正则匹配查询港澳通行证办理进度示例分享

    2021-05-09 19:29:55
  • 如何获知服务器上Application对象及其对应的值?

    2009-11-24 18:09:00
  • Bootstrap组合上、下拉框简单实现代码

    2024-04-10 11:03:05
  • 解决golang读取http的body时遇到的坑

    2024-02-13 19:47:32
  • json 转 mot17数据格式的实现代码 (亲测有效)

    2022-03-06 09:23:53
  • 使用python实现三维图可视化

    2021-07-31 02:28:57
  • Python CategoricalDtype自定义排序实现原理解析

    2021-05-31 22:30:32
  • DIV+CSS高度自适应网页代码实例

    2008-09-20 08:00:00
  • 一个入门级python爬虫教程详解

    2023-03-27 17:34:08
  • Python使用线程来接收串口数据的示例

    2022-01-21 11:32:38
  • matplotlib之属性组合包(cycler)的使用

    2021-04-16 19:31:04
  • 使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤

    2022-03-03 10:04:54
  • python使用socket远程连接错误处理方法

    2023-05-13 04:56:48
  • python将MongoDB里的ObjectId转换为时间戳的方法

    2022-08-08 04:33:01
  • asp之家 网络编程 m.aspxhome.com