当前位置: 首页 > 编程笔记 >

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

卫乐童
2023-03-14
本文向大家介绍python目标检测给图画框,bbox画到图上并保存案例,包括了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()

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

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

 类似资料:
  • 我目前正在尝试跟踪一个人的动作,并将其保存到数据库中。 在我的网页上有一个画布,它允许用户使用鼠标进行绘画。我希望能够保存用户在绘画时所做的动作,以便我能够重新跟踪绘画时所做的每一个动作。 我自己的想法是,每当用户在画布中单击鼠标时,坐标将被保存,直到用户释放鼠标按钮。另一个解决方案是,在画布上每点击3-4次,就保存一张画布的图像,这样你就可以看到绘制过程。 有没有人有更好的解决方案,或者关于如何

  • 我有一个带有背景图像的HTML5画布元素。用户被允许在图像上绘制,然后需要保存完整的画布元素与背景。我使用下面的代码保存部分,但它只得到画布绘图,而不是背景图像。我还可以做什么来获得背景图像? 更新: 我的HTML 我有上面的div在我的HTML页面。然后我动态地创建画布并在其上绘制。这是一个有点长的代码。

  • 本文向大家介绍python对视频画框标记后保存的方法,包括了python对视频画框标记后保存的方法的使用技巧和注意事项,需要的朋友参考一下 需要画框取消注释rectangle 以上这篇python对视频画框标记后保存的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 本文向大家介绍python opencv 检测移动物体并截图保存实例,包括了python opencv 检测移动物体并截图保存实例的使用技巧和注意事项,需要的朋友参考一下 最近在老家找工作,无奈老家工作真心太少,也没什么面试机会,不过之前面试一家公司,提了一个有意思的需求,检测河面没有有什么船只之类的物体,我当时第一反应是用opencv做识别,不过回家想想,河面相对的东西比较少,画面比较单一,只需

  • 我需要帮助进行角度拖放。就像我需要把一个图标拖到画布上。 我已经通过了许多例子,这是我所做的例子。当我拖动那个对象时,对象的副本应该被移动。我看了很多例子,请大家帮忙。

  • 在画布上画画是非常好的。即使橡皮擦也能工作得很好。问题是当画布保存为图像时,它画的是黑线,而不是橡皮擦。 为了更好地理解,我添加了屏幕、镜头和代码。 1.在擦除图的同时- 我不明白为什么橡皮移动被替换为黑色,而保存画布作为一个图像。