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


Posted in Python onMarch 10, 2020

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

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()

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

以上这篇python目标检测给图画框,bbox画到图上并保存案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python THREADING模块中的JOIN()方法深入理解
Feb 18 Python
Python中的index()方法使用教程
May 18 Python
浅析Python 中整型对象存储的位置
May 16 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
动态规划之矩阵连乘问题Python实现方法
Nov 27 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
详解python运行三种方式
May 13 Python
pandas计数 value_counts()的使用
Jun 24 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
感知器基础原理及python实现过程详解
Sep 30 Python
matplotlib jupyter notebook 图像可视化 plt show操作
Apr 24 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 Python
python opencv 检测移动物体并截图保存实例
Mar 10 #Python
Python标准库json模块和pickle模块使用详解
Mar 10 #Python
Python xlrd excel文件操作代码实例
Mar 10 #Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 #Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 #Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 #Python
Python读取VOC中的xml目标框实例
Mar 10 #Python
You might like
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
jQuery timers计时器简单应用说明
2010/10/28 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
python实现登录密码重置简易操作代码
2019/08/14 Python
python统计函数库scipy.stats的用法解析
2020/02/25 Python
结束运行python的方法
2020/06/16 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
外语系毕业生找工作的求职信
2013/11/28 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android