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中的自定义函数学习笔记
Sep 23 Python
Python中用于转换字母为小写的lower()方法使用简介
May 19 Python
Python中的异常处理相关语句基础学习笔记
Jul 11 Python
学习Python selenium自动化网页抓取器
Jan 20 Python
Matplotlib中文乱码的3种解决方案
Nov 15 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
python命令 -u参数用法解析
Oct 24 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
Python基于进程池实现多进程过程解析
Apr 30 Python
python 实现朴素贝叶斯算法的示例
Sep 30 Python
Python函数调用追踪实现代码
Nov 27 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
PHP自动重命名文件实现方法
2014/11/04 PHP
php set_include_path函数设置 include_path 配置选项
2016/10/30 PHP
JavaScript 继承详解(二)
2009/07/13 Javascript
JS跨域总结
2012/08/30 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
如何在node的express中使用socket.io
2014/12/15 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
JavaScript事件学习小结(一)事件流
2016/06/09 Javascript
js重写方法的简单实现
2016/07/10 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
手机端转换rem适应
2017/04/01 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
JavaScript"模拟事件"的注意要点详解
2019/02/13 Javascript
python实现的重启关机程序实例
2014/08/21 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
python循环监控远程端口的方法
2015/03/14 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
Django Rest framework权限的详细用法
2019/07/25 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
Python代码需要缩进吗
2020/07/01 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
详解Canvas事件绑定
2018/06/27 HTML / CSS
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
大学生职业生涯设计书
2014/01/02 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
2014年冬季防火方案
2014/05/21 职场文书
销售开票员岗位职责
2015/04/15 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
Python基础教程,Python入门教程(超详细)
2021/06/24 Python