目标检测可视化gt

2023-11-13

xml格式可视化

这里分了两类

(1)目标被标注为正矩形,即(xmin,ymin),(xmax,ymax),一般的voc数据类型都是这种标注形式

(2)目标被标注为具有一定旋转角度的矩形,即(x1,y1),(x2,y2),(x3,y3),(x4,y4),DOTA数据集就是这样的标注形式

import cv2 
import os
import numpy as np
import xml.dom.minidom
from xml.dom.minidom import Document

import sys  
stdi, stdo, stde = sys.stdin, sys.stdout, sys.stderr
reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdin, sys.stdout, sys.stderr = stdi, stdo, stde


def custombasename(fullname):  
    return os.path.basename(os.path.splitext(fullname)[0])  
  
def GetFileFromThisRootDir(dir,ext = None):  
  allfiles = []  
  needExtFilter = (ext != None)  
  for root,dirs,files in os.walk(dir):  
    for filespath in files:  
      filepath = os.path.join(root, filespath)  
      extension = os.path.splitext(filepath)[1][1:]  
      if needExtFilter and extension in ext:  
        allfiles.append(filepath)  
      elif not needExtFilter:  
        allfiles.append(filepath)  
  return allfiles  


def readXml(xmlfile, hbb = True):
    DomTree = xml.dom.minidom.parse(xmlfile)  
    annotation = DomTree.documentElement  
    imgnamelist = annotation.getElementsByTagName('filename')  
    img_name = imgnamelist[0].childNodes[0].data #图片的名称
    
    sizelist = annotation.getElementsByTagName('size') #[<DOM Element: filename at 0x381f788>]  
    heights = sizelist[0].getElementsByTagName('height')
    height = int(heights[0].childNodes[0].data)
    widths =sizelist[0].getElementsByTagName('width')
    width = int(widths[0].childNodes[0].data)
    depths = sizelist[0].getElementsByTagName('depth')
    depth = int(depths[0].childNodes[0].data)
    objectlist = annotation.getElementsByTagName('object')        
    bboxes = []
    for objects in objectlist:  
        namelist = objects.getElementsByTagName('name')  
        class_label = namelist[0].childNodes[0].data  
        bndbox = objects.getElementsByTagName('bndbox')[0]  
        
        if hbb:
            xmin_list = bndbox.getElementsByTagName('xmin')  
            xmin = int(float(xmin_list[0].childNodes[0].data))  
            ymin_list = bndbox.getElementsByTagName('ymin') 
            ymin = int(float(ymin_list[0].childNodes[0].data)) 
               
            xmax_list = bndbox.getElementsByTagName('xmax')  
            xmax = int(float(xmax_list[0].childNodes[0].data))  
            ymax_list = bndbox.getElementsByTagName('ymax') 
            ymax = int(float(ymax_list[0].childNodes[0].data)) 
            
            bbox = [xmin, ymin, xmax, ymax,class_label]
            bboxes.append(bbox)
        else:            
            x0_list = bndbox.getElementsByTagName('x0')  
            x0 = int(float(x0_list[0].childNodes[0].data))  
            y0_list = bndbox.getElementsByTagName('y0') 
            y0 = int(float(y0_list[0].childNodes[0].data)) 
                   
            x1_list = bndbox.getElementsByTagName('x1')  
            x1 = int(float(x1_list[0].childNodes[0].data))  
            y1_list = bndbox.getElementsByTagName('y1') 
            y1 = int(float(y1_list[0].childNodes[0].data)) 
    
            x2_list = bndbox.getElementsByTagName('x2')  
            x2 = int(float(x2_list[0].childNodes[0].data))  
            y2_list = bndbox.getElementsByTagName('y2')  
            y2 = int(float(y2_list[0].childNodes[0].data))
            
            x3_list = bndbox.getElementsByTagName('x3')  
            x3 = int(float(x3_list[0].childNodes[0].data))  
            y3_list = bndbox.getElementsByTagName('y3')  
            y3 = int(float(y3_list[0].childNodes[0].data))

            bbox = [x0,y0,x1,y1,x2,y2,x3,y3,class_label]
            bboxes.append(bbox)
    return bboxes,width,height,depth,img_name
    
    
def visualise_gt(label_path, pic_path, newpic_path, hbb = True):
    results =  GetFileFromThisRootDir(label_path)
    font = cv2.FONT_HERSHEY_SIMPLEX                    #字体
    for result in results:
        [boxes, w, h, d, imgname] = readXml(result, hbb)
        filepath=os.path.join(pic_path, imgname)
        im=cv2.imread(filepath)

        for i in range(len(boxes)):
            if hbb:         
                cv2.rectangle(im,(boxes[i][0],boxes[i][1]),(boxes[i][2],boxes[i][3]), (0,255,255), 2)
            else:
                box =np.array( [[boxes[i][0],boxes[i][1]],[boxes[i][2],boxes[i][3]], \
                                [boxes[i][4],boxes[i][5]],[boxes[i][6],boxes[i][7]]],np.int32)
                cv2.polylines(im,[box], True, (0,255,255),2) #true表示闭合
            #书写标签 
            cv2.rectangle(im, (boxes[i][0], boxes[i][1]-15), (boxes[i][0] +65 ,boxes[i][1] -2), (255, 0, 0), thickness=-1) # thickness表示线的粗细,等于-1表示填充,颜色为(255, 0, 0)
            cv2.putText(im, boxes[i][-1], (boxes[i][0], boxes[i][1]-2), font, 0.7, (255, 255, 255), 1) #0.5是字体大小,2是字体的粗细
        
        cv2.imwrite(os.path.join(newpic_path,imgname),im)
        print('已完成',result)

if __name__ == '__main__':
    root='/home/yantianwang/clone/haha'
    pic_path = os.path.join(root, 'images') #样本图片路径
    label_path = os.path.join(root, 'xml') #xml文件所在路径    
    newpic_path=os.path.join(root,'visgt')    #可视化结果的保存路径
    if not os.path.isdir(newpic_path):
        os.makedirs(newpic_path)
    visualise_gt(label_path, pic_path, newpic_path, hbb = True)  #默认是hbb

可视化结果:

DOTA数据格式可视化

import cv2 
import os
import numpy as np


thr=0.95
def custombasename(fullname):  
    return os.path.basename(os.path.splitext(fullname)[0])  
  
def GetFileFromThisRootDir(dir,ext = None):  
  allfiles = []  
  needExtFilter = (ext != None)  
  for root,dirs,files in os.walk(dir):  
    for filespath in files:  
      filepath = os.path.join(root, filespath)  
      extension = os.path.splitext(filepath)[1][1:]  
      if needExtFilter and extension in ext:  
        allfiles.append(filepath)  
      elif not needExtFilter:  
        allfiles.append(filepath)  
  return allfiles  

def visualise_gt(label_path, pic_path, newpic_path):
    results =  GetFileFromThisRootDir(label_path)
    for result in results:
        f = open(result,'r')
        lines = f.readlines()
        if len(lines)==0:  #如果为空
            print('文件为空',result)
            continue
        boxes = []
        for i,line in enumerate(lines):
            #score = float(line.strip().split(' ')[8])
            if i in [0,1]:   #前两行不需要
                continue
            name = result.split('/')[-1]
            box=line.strip().split(' ')[0:8]
            box = np.array(box,dtype = np.float)
            #if float(score)>thr:
            boxes.append(box)
        boxes = np.array(boxes,np.float)
        f.close()   
        filepath=os.path.join(pic_path, name.split('.')[0]+'.tif')
        im=cv2.imread(filepath)
        #print line3
        for i in range(boxes.shape[0]):
            box =np.array( [[boxes[i][0],boxes[i][1]],[boxes[i][2],boxes[i][3]], \
                            [boxes[i][4],boxes[i][5]],[boxes[i][6],boxes[i][7]]],np.int32)
            box = box.reshape((-1,1,2))
            cv2.polylines(im,[box],True,(0,255,255),2)
        cv2.imwrite(os.path.join(newpic_path,result.split('/')[-1].split('.')[0]+'.tif'),im)
        #下面是有score的        
        #        x,y,w,h,score=box.split('_')#
        #        score=float(score)
        #        cv2.rectangle(im,(int(x),int(y)),(int(x)+int(w),int(y)+int(h)),(0,0,255),1)
        #        cv2.putText(im,'%3f'%score, (int(x)+int(w),int(y)+int(h)+5),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),1)
        #        cv2.imwrite(newpic_path+filename,im)

if __name__ == '__main__':
    root='/home/yantianwang/lala/ship/train/'
    pic_path = os.path.join(root, 'images') #样本图片路径
    label_path = os.path.join(root, 'labelTxt') #DOTA标签的所在路径    
    newpic_path=os.path.join(root,'hbbshow')   #可视化保存路径
    if not os.path.isdir(newpic_path):
        os.makedirs(newpic_path)
    visualise_gt(label_path, pic_path, newpic_path)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标检测可视化gt 的相关文章

  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • 为 Visual Studio 安装 openCV 2.4 for C/C++

    我一整天都在尝试在 Windows 7 上的 C C 上安装 Visual Studio 2010 的 OpenCV 版本 2 4 1 和 2 4 2 我一直在关注这个教程 http docs opencv org trunk doc tu
  • Python 函数前的星号[重复]

    这个问题在这里已经有答案了 我正在关注这个教程 http www pyimagesearch com 2015 04 20 sorting contours using python and opencv comment 405768 ht
  • C++ OpenCV imread 无法在 Android 中工作

    我正在尝试读取 C 代码中的图像 LOGD Loading image s n inFile c str Mat img imread inFile CV LOAD IMAGE GRAYSCALE CV Assert img data 0
  • 屏幕截图中低分辨率文本的 OCR

    我正在编写一个 OCR 应用程序来从屏幕截图图像中读取字符 目前 我只关注数字 我的方法部分基于这篇博文 http blog damiles com 2008 11 basic ocr in opencv http blog damiles
  • 编译使用Basler相机的程序

    我正在尝试使用 Basler 相机捕获图像的 C 程序来工作 我拿到 来自制造商的代码 它应该 非常容易使用 但是 链接它有 成为一场噩梦 我的 C 时代已经过去了 最近只使用 Matlab 所以我可能会犯一些愚蠢的错误 但请赐教 代码如下
  • opencv 视频上的颜色阈值

    I am thresholding for a color range in an opencv video The goal is to seperate the B mode black and white information on
  • bitblt 在 Windows 10 版本 1703 上失败 (15063.138)

    使用 Visual Studio 2017 vc141 以下代码应该从前游戏窗口获取屏幕截图 但现在它返回黑色和空白图像 唯一的游戏问题 尝试过 OpenGL 和 Vulkan ogl 返回黑色 vulkan 返回白色 在升级到 Windo
  • CvMat 和 Imread 与 IpImage 和 CvLoadImage

    使用 OpenCv 2 4 我有两个选项来加载图像 1 CvMat and Imread 2 IpImage and CvLoadImage 使用哪一个更好 我尝试将两者混合并最终出现段错误 imread返回一个Mat not CvMat
  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • brew 链接 jpeg 问题

    我正在尝试安装opencv在 Mac OSX Lion 上 brew install opencv 我收到以下错误 以及其他一些类似的错误 Error The linking step did not complete successful
  • 如何在给定目标大小的情况下在 python 中调整图像大小,同时保留纵横比?

    首先 我觉得这是一个愚蠢的问题 对此感到抱歉 目前 我发现计算最佳缩放因子 目标像素数的最佳宽度和高度 同时保留纵横比 的最准确方法是迭代并选择最佳缩放因子 但是必须有更好的方法来做到这一点 一个例子 import cv2 numpy as
  • 我是否必须使用我的数据库训练 Viola-Jones 算法才能获得准确的结果?

    我尝试提取面部数据库的面部特征 但我认识到 Viola Jones 算法在两种情况下效果不佳 当我尝试单独检测眼睛时 当我尝试检测嘴巴时 运作不佳 检测图像的不同部分 例如眼睛或嘴巴 或者有时会检测到其中几个 这是不可能的情况 我使用的图像
  • 如何计算图像中的 RGB 或 HSV 通道组合?

    我使用 python opencv 加载形状为 30 100 3 的图像 现在想要按颜色计算所有颜色的频率 我不是指单个通道 而是指通道组合 含义 3 个频道列表 例如 255 0 0 表示红色 255 255 0 表示黄色 100 100
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • 我可以使用 openCV 比较两张不同图像上的两张脸吗?

    我对 openCV 很陌生 我看到它可以计算出脸部并返回一个矩形来指示脸部 我想知道 openCV 是否可以访问两张包含一张脸的图像 并且我希望 openCV 返回这两个人是否相同的可能性 Thanks OpenCV 不提供完整的人脸识别引
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • 使用 ffmpeg 或 OpenCV 处理原始图像

    看完之后维基百科页面 http en wikipedia org wiki Raw image format原始图像格式 是任何图像的数字负片 为了查看或打印 相机图像传感器的输出具有 进行处理 即转换为照片渲染 场景 然后以标准光栅图形格
  • OpenCV 2.3 与 VS 2008 - 鼠标事件

    强制性 我是新手 有一份涉及编程的工作 并且我一边工作一边自学 不用说 作为一名老师 我经常犯彻底的错误 我现在所处的位置 我创建了 Graph 类 它 令人惊讶的是 制作了图表 但现在我想通过单击鼠标来修改图形 但我似乎无法让鼠标处理程序
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP

随机推荐