基于arcgis的遥感影像标签制作(目标检测)

作者:神秘网友 发布时间:2020-10-31 17:33:48

基于arcgis的遥感影像标签制作(目标检测)

基于arcgis的遥感影像标签制作(目标检测)

文章目录

  • 1. 在arcgis中新建线矢量
  • 2. 检测框绘制
  • 3. 检测框坐标转换(线矢量)
  • 4. 检测框坐标转换(面矢量)

1. 在arcgis中新建线矢量

新建线矢量,添加空间参考,例如wgs_1984。
基于arcgis的遥感影像标签制作(目标检测)

2. 检测框绘制

基于arcgis的遥感影像标签制作(目标检测)
基于arcgis的遥感影像标签制作(目标检测)

3. 检测框坐标转换(线矢量)

地理坐标转像素坐标

# -*- coding: utf-8 -*-
from osgeo import ogr
from osgeo import gdal
from osgeo import osr
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt


def getSRSPair(dataset):
    '''
    获得给定数据的投影参考系和地理参考系
    :param dataset: GDAL地理数据
    :return: 投影参考系和地理参考系
    '''
    prosrs = osr.SpatialReference()
    prosrs.ImportFromWkt(dataset.GetProjection())
    geosrs = prosrs.CloneGeogCS()
    return prosrs, geosrs


def geo2lonlat(dataset, x, y):
    '''
    将投影坐标转为经纬度坐标(具体的投影坐标系由给定数据确定)
    :param dataset: GDAL地理数据
    :param x: 投影坐标x
    :param y: 投影坐标y
    :return: 投影坐标(x, y)对应的经纬度坐标(lon, lat)
    '''
    prosrs, geosrs = getSRSPair(dataset)
    ct = osr.CoordinateTransformation(prosrs, geosrs)
    coords = ct.TransformPoint(x, y)
    return coords[:2]


def lonlat2geo(dataset, lon, lat):
    '''
    将经纬度坐标转为投影坐标(具体的投影坐标系由给定数据确定)
    :param dataset: GDAL地理数据
    :param lon: 地理坐标lon经度
    :param lat: 地理坐标lat纬度
    :return: 经纬度坐标(lon, lat)对应的投影坐标
    '''
    prosrs, geosrs = getSRSPair(dataset)
    ct = osr.CoordinateTransformation(geosrs, prosrs)
    coords = ct.TransformPoint(lon, lat)
    return coords[:2]


def imagexy2geo(dataset, row, col):
    '''
    根据GDAL的六参数模型将影像图上坐标(行列号)转为投影坐标或地理坐标(根据具体数据的坐标系统转换)
    :param dataset: GDAL地理数据
    :param row: 像素的行号
    :param col: 像素的列号
    :return: 行列号(row, col)对应的投影坐标或地理坐标(x, y)
    '''
    trans = dataset.GetGeoTransform()
    px = trans[0] + col * trans[1] + row * trans[2]
    py = trans[3] + col * trans[4] + row * trans[5]
    return px, py


def geo2imagexy(dataset, x, y):
    '''
    根据GDAL的六 参数模型将给定的投影或地理坐标转为影像图上坐标(行列号)
    :param dataset: GDAL地理数据
    :param x: 投影或地理坐标x
    :param y: 投影或地理坐标y
    :return: 影坐标或地理坐标(x, y)对应的影像图上行列号(row, col)
    '''
    trans = dataset.GetGeoTransform()
    a = np.array([[trans[1], trans[2]], [trans[4], trans[5]]])
    b = np.array([x - trans[0], y - trans[3]])
    return np.linalg.solve(a, b)  # 使用numpy的linalg.solve进行二元一次方程的求解


def main(imgPath, shpPath):
    dataset = gdal.Open(imgPath)
    ds = ogr.Open(shpPath,1)
    if ds is None:
        print('Could not open folder')
    in_lyr = ds.GetLayer()

    lyr_dn = in_lyr.GetLayerDefn()
    cls_index = lyr_dn.GetFieldIndex("Id")
    cls_name_g = lyr_dn.GetFieldDefn(cls_index)
    feature = in_lyr.GetNextFeature()

    fieldName = cls_name_g.GetNameRef()

    finalResult = []
    while feature is not None:
        geom = feature.geometry()
        # ff = feature.GetGeometry(geom)
        # print(geom)
        print('------------')
        result = []
        for i in range(0, geom.GetPointCount()-1):
            pt = np.array(geom.GetPoint(i))
            coords = lonlat2geo(dataset, pt[0], pt[1])
            coords = geo2imagexy(dataset, coords[0], coords[1])
            result.append([coords[0], coords[1]])
            # print(pt, x, y)

        finalResult.append(result)
        feature = in_lyr.GetNextFeature()

    return finalResult


if __name__ == '__main__':
    img_filename = './test/0000000004_image.tif'
    dst_filename = './test/label2.shp'
    finalResult = main(img_filename, dst_filename)
    img = cv.imread(img_filename, cv.IMREAD_LOAD_GDAL)
    finalResult = np.array(finalResult)
    for bbox in finalResult:
        xmin = min(bbox[0][0], bbox[1][0], bbox[2][0], bbox[3][0])
        ymin = min(bbox[0][1], bbox[1][1], bbox[2][1], bbox[3][1])
        xmax = max(bbox[0][0], bbox[1][0], bbox[2][0], bbox[3][0])
        ymax = max(bbox[0][1], bbox[1][1], bbox[2][1], bbox[3][1])
        cv.rectangle(img, (int(xmin), int(ymin)), (int(xmax), int(ymax)), (0, 100, 255), 5)

    plt.imshow(img)
    plt.show()

基于arcgis的遥感影像标签制作(目标检测)

4. 检测框坐标转换(面矢量)

大部分代码一样,就是main函数有点区别。

def main(imgPath, shpPath):
    dataset = gdal.Open(imgPath)
    ds = ogr.Open(shpPath,1)
    if ds is None:
        print('Could not open folder')
    in_lyr = ds.GetLayer()

    lyr_dn = in_lyr.GetLayerDefn()
    cls_index = lyr_dn.GetFieldIndex("Id")
    cls_name_g = lyr_dn.GetFieldDefn(cls_index)
    feature = in_lyr.GetNextFeature()

    fieldName = cls_name_g.GetNameRef()

    finalResult = []
    while feature is not None:
        geom = feature.geometry()
        arr = np.array(feature.GetGeometryRef().GetEnvelope())
        print(arr)
        coordsMin = lonlat2geo(dataset, arr[0], arr[3])
        coordsMin = geo2imagexy(dataset, coordsMin[0], coordsMin[1])
        coordsMax = lonlat2geo(dataset, arr[1], arr[2])
        coordsMax = geo2imagexy(dataset, coordsMax[0], coordsMax[1])
        finalResult.append([coordsMin[0], coordsMin[1], coordsMax[0], coordsMax[1]])
        # ff = feature.GetGeometry(geom)
        # print(geom)
        # print('------------')
        # result = []
        # print(geom.GetPointCount())
        # for i in range(0, geom.GetPointCount()-1):
        #     pt = np.array(geom.GetPoint(i))
        #     coords = lonlat2geo(dataset, pt[0], pt[1])
        #     coords = geo2imagexy(dataset, coords[0], coords[1])
        #     result.append([coords[0], coords[1]])
            # print(pt, x, y)

        # finalResult.append(result)
        feature = in_lyr.GetNextFeature()

    return finalResult

基于arcgis的遥感影像标签制作(目标检测)

基于arcgis的遥感影像标签制作(目标检测)相关教程

  1. ArcGIS Pro中使用超分辨率

    ArcGIS Pro中使用超分辨率 ArcGIS Pro中使用超分辨率 样本准备 模型训练 推理 “ 在之前发布的文章中:ArcGIS API for Python:深度学习模块概览 提到了很多计算机视觉领域的深度学习模型。其中大家反馈最多的便是超分辨率模型,今天,它来了。本文会带大家实

  2. 基于mat做简单的堆内存溢出分析

    基于mat做简单的堆内存溢出分析 文章目录 下载启动mat 生成 dump文件 加载dump文件 首先我们需要下载启动mat 下载mat 官网下载地址 这里更加自己的系统选择合适的压缩包 我选择的是Windows(x86),下载之后是个zip包,解压就直接可以使用 如果分析的dump文件过

  3. Jenkins 基于 Docker 安装 超详细教程

    Jenkins 基于 Docker 安装 超详细教程 docker pull lamdaer/jenkins:0.0.1 docker run -p 8080:8080 --name myjenkins -d lamdaer/jenkins:0.0.1# 参数含义# --name 指定容器名称# -d 容器后台运行# -p 宿主机和容器端口映射 宿主机端口:容器暴露端口 访问 80

  4. 2020-10-30

    2020-10-30 基于MATLAB的离散时间全通系统和系统辨识 主程序 clearclc%主程序(main_DTFT)nandy1 = [0.6 0.6 0.6]; %定义frame控件的背景色nandy = [1 1 1]; %定义整个图形的背景色nandy2 = [0.7 0.7 0.7]; %定义缺省控件的背景色mm = 1; hyh = 1; N = 30;w =

  5. ArcGIS Pro环境下 Python脚本自动化制图出图

    ArcGIS Pro环境下 Python脚本自动化制图出图 ArcGIS Pro环境下 Python脚本自动化制图出图 一、脚本出现的背景 二、重复性工作有哪些? 三、 代码如下 四、还有些个性化的设置,难以程序化 一、脚本出现的背景 本人专业制图,做好配图模板后会出大量风格相同但

  6. 如何自己申请免费的通配符证书(基于 Let‘s Encrypt 的免费证书

    如何自己申请免费的通配符证书(基于 Let‘s Encrypt 的免费证书) 最近项目上线,需要用到https,在网上找到了可以白嫖的证书,记录一下使用过程 Let’s Encrypt一个非盈利性的证书颁发机构,并且已经被大多数浏览器所信任,而我们可以使用Certbot(一个免费

  7. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(十四完结)--目标

    基于ROS搭建简易软件框架实现ROV水下目标跟踪(十四完结)--目标跟踪模块 模块十分简单,可以介绍的内容很少。包括两个部分:计算目标物中心距图片中心的偏差,对应cabin_vision/object_deviation;PID跟踪控制,对应cabin_behaviors/pid_tracking。 一、偏差

  8. 【Spring】基于XML的IOC案例

    【Spring】基于XML的IOC案例 代码结构: bean.xml ?xml version=1.0 encoding=UTF-8?beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://www.springframework.org/sch