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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。