• xml_result_2_taos_db(工作太忙,仅仅作为记录)


    import taos
    from pyproj import Proj, CRS
    from PIL import Image, ImageOps
    import xml.etree.ElementTree as ET
    import os
    import time
    import requests
    import platform
    from osgeo import gdal
    
    def get_taosdb_info():
        host = "192.168.1.235"
        user = "root"
        password = "taosdata"
        database = "taishi"
        if platform.system().lower() == 'linux':
            cfg = "/etc/taos"
            return host, user, password, database, cfg
        elif platform.system().lower() == 'windows':
            cfg = "C:/TDengine/cfg"
            return host, user, password, database, cfg
    
    def get_Device_Name():
        deviceName2Type = {'person':1, 'car':2, 'road':3, 'bridge':4, 'gasStation':5, 'other':6}
        return deviceName2Type
    
    def getConnecter(host, user, password, cfg):
        try:
            conn = taos.connect(host=host, user=user, password=password, config=cfg)
            print('database connect succeed')
        except Exception as err:
            print('database connect failed')
            raise err
        return conn
    
    def GetFilesFromXML(xmlpath):
        tree = ET.ElementTree(file=os.path.join(xmlpath))  # 打开文件,解析成一棵树型结构
        root = tree.getroot()  # 获取树型结构的根
        input_fileName = str(root.find('filename_in').text)
        output_fileName = str(root.find('filename_out').text)
        return input_fileName, output_fileName
    
    ##get object annotation bndbox loc start
    def GetAnnotBoxLoc(AnotPath, lon_img=120.000000, lat_img=39.000000, pix_m_img=1.0):  # AnotPath VOC标注文件路径
        lon_img = lon_img
        lat_img = lat_img
        pix_m_img = pix_m_img
        tree = ET.ElementTree(file=os.path.join(AnotPath))  # 打开文件,解析成一棵树型结构
        root = tree.getroot()  # 获取树型结构的根
        input_fileName = str(root.find('filename_in').text)
        output_fileName = str(root.find('filename_out').text)
    
        pic_anno = []
        ObjectSet = root.findall('object')  # 找到文件中所有含有object关键字的地方,这些地方含有标注目标
        for Object in ObjectSet:
            ObjDic = {}
            ObjName = Object.find('name').text
            BndBox = Object.find('box')
            x1 = int(BndBox.find('xmin').text)  # -1 #-1是因为程序是按0作为起始位置的
            y1 = int(BndBox.find('ymin').text)  # -1
            x2 = int(BndBox.find('xmax').text)  # -1
            y2 = int(BndBox.find('ymax').text)  # -1
            geo_loc = xy2lonlat(x1, y1, x2, y2, lon_img, lat_img, pix_m_img)
            ObjDic[ObjName] = geo_loc
            pic_anno.append(ObjDic)
    
        return input_fileName, output_fileName, pic_anno
    
    # 返回矩形框目标中心的经纬度
    # 输入:像素box边界,名称,影像左上角点的经纬度,以及pix_m分辨率(默认是1.0米)
    def xy2lonlat(xmin, ymin, xmax, ymax, lon, lat, pix_m=1.0):
        crs_3857 = CRS.from_epsg(3857)
        PRO = Proj(crs_3857)
        X, Y = PRO(lon, lat, inverse=False)
    
        delt_x = 0.5*(xmin + xmax)
        delt_y = 0.5*(ymin + ymax)
    
        X += delt_x * pix_m
        Y -= delt_y * pix_m
    
        lon_out, lat_out = PRO(X, Y, inverse=True)
    
        return [str(lon_out), str(lat_out)]
    
    def get_time_stamp():
        ct = time.time()
        local_time = time.localtime(ct)
        data_head = time.strftime("%Y-%m-%d %H:%M:%S", local_time)
        data_secs = (ct - int(ct)) * 1000
        time_stamp = "%s.%03d" % (data_head, data_secs)
        return time_stamp
    
    def get_time_string():
        ct = time.time()
        local_time = time.localtime(ct)
        time_string = time.strftime("%Y%m%d%H%M%S", local_time)
        return time_string
    
    #发送位置信息到 sensorszh table POI 数据库
    def save_geo_loc(pic_anno, deviceName2Type):
        objName_DB = [key for key, _ in deviceName2Type.items()]
        i = 0
        for obj in pic_anno:
            for objName, lon_lat in obj.items():
                if objName not in objName_DB:
                    objName = 'other'
                lon = lon_lat[0]
                lat = lon_lat[1]
                timestamp = get_time_string()
                timestamp = eval(timestamp)+i
                i = i+1
                # print(timestamp)
                url = 'http://192.168.1.220:8102/insert?deviceId=1&deviceName='+ str(objName) + '&devicetype=' + str(deviceName2Type[objName]) 
                            + '&lon='+ str(lon) +'&lat=' + str(lat) + '&time=' + str(timestamp)
                r = requests.get(url)
                print('POI point insert into sensorszh table, status_code:', r.status_code)
    
    # data insert into anno_loc
    def save_xml_db(conn, database, xml_file, pic_anno, deviceName2Type):
        objName_DB = [key for key, _ in deviceName2Type.items()]
        original_pic_path, processed_pic_path = GetFilesFromXML(xml_file)
        cur = conn.cursor()
        try:
            cur.execute('use ' + database)
        except Exception as err:
            print('use ' + database + 'failed,mabey the database is not exist!')
            raise err
    
        try:
            # sql = "DROP TABLE anno_loc"
            sql = "CREATE TABLE IF NOT EXISTS anno_loc(create_time TIMESTAMP, pic_name binary(50), obj_name binary(20), devicetype binary(10), lon binary(100),lat binary(100),original_pic_path binary(500), processed_pic_path binary(500), xml_anno binary(500))"
            cur.execute(sql)
        except Exception as err:
            raise err
    
        # anno_loc: "create_time, pic_name, obj_name, devicetype, lon, lat, original_pic_path, processed_pic_path, xml_anno"
        xml_anno = xml_file
        _, pic_name = os.path.split(original_pic_path)
        for obj in pic_anno:
            for objName, lon_lat in obj.items():
                if objName not in objName_DB:
                    objName = 'other'
                lon = lon_lat[0]
                lat = lon_lat[1]
                devicetype = deviceName2Type[objName]
                create_time = get_time_stamp()
                try:
                    sql = "insert into anno_loc values ('%s','%s','%s','%s','%s','%s','%s','%s','%s')" 
                          % (create_time, pic_name, str(objName), str(devicetype), lon, lat, original_pic_path, processed_pic_path, xml_anno)
                    print(sql)
                    cur.execute(sql)
                    conn.commit()
                    print("insert into anno_loc succeed!!!")
                except Exception as err:
                    raise err
        if cur:
            cur.close
        conn.commit()
        conn.close()
    
    def save_xml_matedata_db(conn, database, xml_file, task_type = "td"):
        # task_type = "td" or "rs"
        cur = conn.cursor()
        try:
            cur.execute('use ' + database)
        except Exception as err:
            print('use ' + database + 'failed, mabey the database is not exist!')
            raise err
    
        try:
            # sql = "DROP TABLE files"
            sql = "CREATE TABLE IF NOT EXISTS files(create_time TIMESTAMP, ID binary(50), original_pic_path binary(500), processed_pic_path binary(500), original_pic_simp_path binary(500), processed_pic_simp_path binary(500), task_type binary(10))"
            cur.execute(sql)
        except Exception as err:
            raise err
    
        create_time = get_time_stamp()
        ID = str(eval(get_time_string()))
        original_pic_path, processed_pic_path = GetFilesFromXML(xml_file)
        original_pic_simp_path = original_pic_path.split('.')[-2]+"-S."+original_pic_path.split('.')[-1]
        processed_pic_simp_path = processed_pic_path.split('.')[-2]+"-S."+processed_pic_path.split('.')[-1]
        task_type = task_type# "td" or "rs"
    
        try:
            sql = "insert into files values ('%s','%s','%s','%s','%s','%s','%s')" 
                  % (create_time, ID, original_pic_path, processed_pic_path, original_pic_simp_path, processed_pic_simp_path, task_type)
            print(sql)
            cur.execute(sql)
            conn.commit()
            print("insert into files succeed!!!")
        except Exception as err:
            raise err
    
        if cur:
            cur.close
        conn.commit()
        conn.close()
    
    def get_full_and_simplified_name_path(xml_file):
        input_pic_path, out_pic_path = GetFilesFromXML(xml_file)
        input_pic_simp_path = input_pic_path.split('.')[-2]+"-S."+input_pic_path.split('.')[-1]
        out_pic_simp_path = out_pic_path.split('.')[-2]+"-S."+out_pic_path.split('.')[-1]
        return input_pic_path, input_pic_simp_path, out_pic_path, out_pic_simp_path
    
    def resize_geotiff(input_path, dst_path, scale):
        ds = gdal.Open(input_path)
        # prj = ds.GetProjection()
        # print(prj)
    
        im_width = ds.RasterXSize  # 栅格矩阵的列数
        im_height = ds.RasterYSize  # 栅格矩阵的行数
    
        opt = gdal.WarpOptions(height=int(scale * im_height), width=int(scale * im_width))
    
        path, filename = os.path.split(input_path)
    
        if '.tif' not in dst_path:
            dst_path = os.path.join(dst_path, filename)
    
        gdal.Warp(dst_path, input_path, options=opt)
    # input_path = 'D:/inputTIF.tif'
    # dst_path = 'D:/out.tif'
    # # dst_path = 'D:/output'
    # resize_geotiff(input_path, dst_path, 0.5)
    
    def resize_common_picture(input_path, dst_path, scale):
        origin_img = Image.open(input_path)
        h, w = origin_img.size
        h_out, w_out = int(h*scale), int(w*scale)
        target_size = (h_out, w_out)
        scale_img = origin_img.copy()
        scale_img.thumbnail(target_size, Image.ANTIALIAS)
        scale_img.save(dst_path)
    
    # detection_into_tao_db
    def detection_into_tao_db(xml_file, lon_img, lat_img, pix_m_img, task_type="td", scale=0.5):
        host, user, password, database, cfg = get_taosdb_info()
        input_fileName, output_fileName, pic_anno = GetAnnotBoxLoc(xml_file, lon_img=lon_img, lat_img=lat_img, pix_m_img=pix_m_img)
        # poi to sensorszh table
        save_geo_loc(pic_anno, get_Device_Name())
        print("poi to sensorszh table succeed!!!")
        # target insert into anno_loc
        conn = getConnecter(host, user, password, cfg)
        save_xml_db(conn, database, xml_file, pic_anno, get_Device_Name())
        print("target insert into anno_loc succeed!!!")
    
        # xml_matedata insert into files
        conn = getConnecter(host, user, password, cfg)
        save_xml_matedata_db(conn, database, xml_file, task_type=task_type)  # task_type = "td" or "rs"
        print("save_xml_matedata_db succeed!!!")
    
        # get_full_and_simplified_name_path
        input_pic_path, input_pic_simp_path, out_pic_path, out_pic_simp_path = get_full_and_simplified_name_path(xml_file)
        # 对 img 缩放
        if 'tif' in input_pic_path.split('.')[-1]:
            resize_geotiff(input_pic_path, input_pic_simp_path, scale=scale)
            resize_geotiff(out_pic_path, out_pic_simp_path, scale=scale)
            print("resize_geotiff succeed!!!")
        else:
            resize_common_picture(input_pic_path, input_pic_simp_path, scale=scale)
            resize_common_picture(out_pic_path, out_pic_simp_path, scale=scale)
            print("resize_common_picture succeed!!!")
    
    # segmentation_into_tao_db
    def segmentation_into_tao_db(xml_file, task_type="rs", scale=0.5):
        host, user, password, database, cfg = get_taosdb_info()
        # xml_matedata insert into files
        conn = getConnecter(host, user, password, cfg)
        save_xml_matedata_db(conn, database, xml_file, task_type=task_type)  # task_type = "td" or "rs"
        print("save_xml_matedata_db succeed!!!")
        # get_full_and_simplified_name_path
        input_pic_path, input_pic_simp_path, out_pic_path, out_pic_simp_path = get_full_and_simplified_name_path(xml_file)
        # 对 img 缩放
        if 'tif' in input_pic_path.split('.')[-1]:
            resize_geotiff(input_pic_path, input_pic_simp_path, scale=scale)
            resize_geotiff(out_pic_path, out_pic_simp_path, scale=scale)
            print("resize_geotiff succeed!!!")
        else:
            resize_common_picture(input_pic_path, input_pic_simp_path, scale=scale)
            resize_common_picture(out_pic_path, out_pic_simp_path, scale=scale)
            print("resize_common_picture succeed!!!")
    
    if __name__ == '__main__':
        det_xml_file = 'D:/研究/课题资料/申请后提交/验收-准备/coding4-yanshou/out-det/P0034.xml'
        lon_img = 120.000000
        lat_img = 39.000000
        pix_m_img = 1.0
        detection_into_tao_db(det_xml_file, lon_img, lat_img, pix_m_img, task_type="td", scale=0.5)
    
        seg_xml_file = 'D:/研究/课题资料/申请后提交/验收-准备/coding4-yanshou/out-seg/inputTIF.xml'
        segmentation_into_tao_db(seg_xml_file, task_type="rs", scale=0.5)
    个人学习记录
  • 相关阅读:
    axios全局配置
    014 Javascript(148
    013 Javascript(134
    axios的基本使用
    axios简介
    012 Javascript(126
    016 HTML+CSS(Class198
    015 HTML+CSS(Class184
    014 HTML+CSS(Class165
    LCA题目选讲2
  • 原文地址:https://www.cnblogs.com/jeshy/p/15308130.html
Copyright © 2020-2023  润新知