python目标检测给图画框,bbox画到图上并保存案例
作者:别说话写代码 发布时间:2023-03-07 07:47:52
标签:python,图画框,bbox
我就废话不多说了,还是直接上代码吧!
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 有一个名为 random 的内置模块,可用于生成随机数,这个好玩~可以用来做为上课随机点名的程序了哈哈。。def ma
- 一、前言提到 limit 优化,大多数 MySQL DBA 都不会陌生,能想到各种应对策略,比如延迟关联,书签式查询等等,之前我也写过一篇优
- 编写一个prod()函数,可以接受一个list并利用reduce()求积。from functools import reducedef p
- 本文实例为大家分享了vue移动端图片裁剪上传的具体代码,供大家参考,具体内容如下1.安装cropperjs依赖库npm install cr
- 其实图像识别技术与我们平时做的密码验证之类的没有什么区别,都是事先把要校验的数据入库,然后使用时将录入(识别)的数据与库中的数据做对比,只不
- 很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头。但是有时,大家又希望能够随时随地观看视频直播。大多数人会选择使用IP摄像机(In
- Python 正则表达式简介正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增
- explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.使用方法:在sel
- 在上一期python numpy 模块中对概述介绍了numpy 模块安装、使用方法、特点等入门知识。numpy 模块是一个开源的第三方Pyt
- CAS单点登录主要是为了解决主系统和子系统的统一登录问题,能够做到任意一个子系统登录成功后,再登录其他子系统后不再需要认证,让用户不用重复地
- 一、启动与退出1、进入MySQL:启动MySQL Command Line Client(MySQL的DOS界面),直接输入安装时的密码即可
- 因工作需要研究了支付宝即时到帐接口,并成功应用到网站上,把过程拿出来分享。即时到帐只是支付宝众多商家服务中的一个,表示客户付款,客户用支付宝
- Line plotsAxes3D.plot(xs, ys, *args, **kwargs)绘制2D或3D数据参数描述xs, ysX轴,Y轴
- 看了网站LOGO设计规范的思考的第一部分关于logo设计基础,现在接着来谈谈网络LOGO的设计。四、网络LOGO的设计 古代皇家的纹章,有条
- 进程是什么?进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成
- 什么是计算属性概念计算属性是vue里面为了简化在模板语法中对响应式属性做计算而存在的什么时候应该使用计算属性根据现有响应式的值得到一个新的值
- 本文介绍了Sublime开发python程序的示例代码,分享给大家,具体如下:下载、安装Python程序https://www.python
- 1. 解压ZIP包和配置首先,将mysql-5.5.25-winx64.zip 解压缩到D:/mysql-5.5.25 目录下,然后根据网上
- 本文实例为大家分享了python实现微信消息防撤回的具体代码,供大家参考,具体内容如下使用了sqlite3保存数据,当有人撤回消息时取出数据
- 从一个通道的图片进行卷积生成新的单通道图的过程很容易理解,对于多个通道卷积后生成多个通道的图理解起来有点抽象。本文以通俗易懂的方式讲述卷积,