python目标检测给图画框,bbox画到图上并保存案例
我就废话不多说了,还是直接上代码吧!
importos
importxml.dom.minidom
importcv2ascv
ImgPath='C:/Users/49691/Desktop/gangjin/gangjin_test/JPEGImages/'
AnnoPath='C:/Users/49691/Desktop/gangjin/gangjin_test/Annotations/'#xml文件地址
save_path=''
defdraw_anchor(ImgPath,AnnoPath,save_path):
imagelist=os.listdir(ImgPath)
forimageinimagelist:
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")
forobjectsinobjectlist:
#每个object中得到子标签名为name的信息
namelist=objects.getElementsByTagName('name')
#通过此语句得到具体的某个name的值
objectname=namelist[0].childNodes[0].data
bndbox=objects.getElementsByTagName('bndbox')
#print(bndbox)
forboxinbndbox:
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)#savepicture
补充知识:深度学习python之用Faster-rcnn检测结果(txt文件)在原图画出box
使用Faster-rcnn的test_net.py检测网络的mAP等精度会生成一个检测结果(txt文件),格式如下:
0000040.972302.894.5512.0150.0 0000040.950348.1166.1512.0242.9 0000040.8751.025.7292.6126.3 0000040.7301.0138.5488.3230.0 0000040.6991.0120.9145.5139.9 0000040.59254.4227.4431.9343.4 0000040.5881.0159.818.8231.6 0000040.1261.0247.1342.3270.0 0000040.1201.0225.4185.7309.3
每行分别为名称检测概率xminyminxmaxymax
问题在于每一行只显示一个box数据,每幅图像可能包括多个box,需要判断提取的多行数据是不是属于同一图片
下面使用python提取这些数据,在原图上画出box并且保存起来
importos
importos.path
importnumpyasnp
importxml.etree.ElementTreeasxmlET
fromPILimportImage,ImageDraw
importcPickleaspickle
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=[]
forlineinsource_file:
staff=line.split()
img_name=staff[0]
img_names.append(img_name)
name_dict={}
foriinimg_names:
ifimg_names.count(i)>0:
name_dict[i]=img_names.count(i)
source_file.close()
source_file=open(txt_name)
foridxinname_dict:
img=Image.open(os.path.join(file_path_img,idx+'.jpg'))
draw=ImageDraw.Draw(img)
foriinxrange(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画到图上并保存案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。