【openCV踩坑日记】人工数据集Synthetic Shapes dataset的生成方法

2023-05-16

1.为什么要介绍这个方法?

2018年的时候,D.DeTone等人发表了Self-Supervised Interest Point Detection and Description,提出了一种特征提取SuperPoint的方法。他们在训练Superpoint的时候,构造了一组人工合成数据集Synthetic Shapes dataset(这个数据集能提供角点的坐标作为groundtruth),因此也可以测试superpoint最后的效果。
所以说,Synthetic Shapes dataset它最大的优点,就是简单,而且能够提供特征点的groundtruth,这对于检测特征点十分重要!

非常不幸的是,作者不打算提供Synthetic Shapes dataset,所以,把作者相关的代码提取出来就显得十分有意义。

2.Synthetic Shapes dataset的生成

打开官方链接,找到superpoint/datasets/synthetic_dataset.py 这个路径,这个py脚本就是用来生成Synthetic Shapes dataset的!!

第一步,生成图片背景,在52行或者82行:

def generate_background(size=(960, 1280), nb_blobs=100, min_rad_ratio=0.01,
                        max_rad_ratio=0.05, min_kernel_size=50, max_kernel_size=300):
    """ Generate a customized background image
    Parameters:
      size: size of the image
      nb_blobs: number of circles to draw
      min_rad_ratio: the radius of blobs is at least min_rad_size * max(size)
      max_rad_ratio: the radius of blobs is at most max_rad_size * max(size)
      min_kernel_size: minimal size of the kernel
      max_kernel_size: maximal size of the kernel
    """
def generate_custom_background(size, background_color, nb_blobs=3000,
                               kernel_boundaries=(50, 100)):
    """ Generate a customized background to fill the shapes
    Parameters:
      background_color: average color of the background image
      nb_blobs: number of circles to draw
      kernel_boundaries: interval of the possible sizes of the kernel
    """

第二步,画线,得到特征点的坐标(138行):

def draw_lines(img, nb_lines=10):
    """ Draw random lines and output the positions of the endpoints
    Parameters:
      nb_lines: maximal number of lines
    """
    ...
    return points

第三步,你也可以画多边形(166行或227行):

def draw_polygon(img, max_sides=8):
    """ Draw a polygon with a random number of corners
    and return the corner points
    Parameters:
      max_sides: maximal number of sides + 1
    """
    ...
    return points
def draw_multiple_polygons(img, max_sides=8, nb_polygons=30, **extra):
    """ Draw multiple polygons with a random number of corners
    and return the corner points
    Parameters:
      max_sides: maximal number of sides + 1
      nb_polygons: maximal number of polygons
    """
    ...
    return points

第四步,你可以画星星(334行):

def draw_star(img, nb_branches=6):
    """ Draw a star and output the interest points
    Parameters:
      nb_branches: number of branches of the star
    """
    ...
    return points    

画椭圆(304行):

def draw_ellipses(img, nb_ellipses=20):
    """ Draw several ellipses
    Parameters:
      nb_ellipses: maximal number of ellipses
    """

画棋盘格(362行):

def draw_checkerboard(img, max_rows=7, max_cols=7, transform_params=(0.05, 0.15)):
    """ Draw a checkerboard and output the interest points
    Parameters:
      max_rows: maximal number of rows + 1
      max_cols: maximal number of cols + 1
      transform_params: set the range of the parameters of the transformations"""
    ...
    return points       

画立方体(596行):

def draw_cube(img, min_size_ratio=0.2, min_angle_rot=math.pi / 10,
              scale_interval=(0.4, 0.6), trans_interval=(0.5, 0.2)):
    """ Draw a 2D projection of a cube and output the corners that are visible
    Parameters:
      min_size_ratio: min(img.shape) * min_size_ratio is the smallest achievable
                      cube side size
      min_angle_rot: minimal angle of rotation
      scale_interval: the scale is between scale_interval[0] and
                      scale_interval[0]+scale_interval[1]
      trans_interval: the translation is between img.shape*trans_interval[0] and
                      img.shape*(trans_interval[0] + trans_interval[1])
    """
    ...
    return points       

第五步,你还可以给图片增加颗粒感(40行):

def add_salt_and_pepper(img):
    """ Add salt and pepper noise to an image """
    noise = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
    cv.randu(noise, 0, 255)
    black = noise < 30
    white = noise > 225
    img[white > 0] = 255
    img[black > 0] = 0
    cv.blur(img, (5, 5), img)
    return np.empty((0, 2), dtype=np.int)

或者gauss噪声(104行或683行):

def final_blur(img, kernel_size=(5, 5)):
    """ Apply a final Gaussian blur to the image
    Parameters:
      kernel_size: size of the kernel
    """
    cv.GaussianBlur(img, kernel_size, 0, img)
def gaussian_noise(img):
    """ Apply random noise to the image """
    cv.randu(img, 0, 255)
    return np.empty((0, 2), dtype=np.int)

3.最终效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

【openCV踩坑日记】人工数据集Synthetic Shapes dataset的生成方法 的相关文章

  • qt学习笔记(二)之布局管理器&信号与槽(简介)

    我们在上节的程序中加点小应用 主要是用到了布局管理器和信号与槽 在这里我也只是简单介绍一下 随着后续的深入研究 xff0c 接下来会具体介绍 一 布局管理器 include lt QtGui gt int main int argc cha
  • Android 开发之 Activity BroadcastReceiver Service和音乐播放

    Activity的生命周期 xff1a Activity有三个状态 xff1a 当它在屏幕前台时 位于当前任务堆栈的顶部 xff0c 它是激活或运行状态 它就是响应用户操作的Activity 当它失去焦点但仍然对用户可见时 xff0c 它处
  • JSON-lib框架,转换JSON、XML不再困难

    Json lib可以将Java对象转成json格式的字符串 xff0c 也可以将Java对象转换成xml格式的文档 xff0c 同样可以将json字符串转换成Java对象或是将xml字符串转换成Java对象 一 准备工作 1 首先要去官方下
  • xStream完美转换XML、JSON

    xStream框架 xStream可以轻易的将Java对象和xml文档相互转换 xff0c 而且可以修改某个特定的属性和节点名称 xff0c 而且也支持json的转换 xff1b 前面有介绍过json lib这个框架 xff0c 在线博文
  • C++程序员经常问的11个问题

    C 43 43 程序员经常问的11个问题 这篇文章收了好长时间 xff0c 但还是觉得贴出来 xff0c 作为收藏 xff0c 在网上这样的浮躁环境 xff0c 很少能认认真真地看这样长的文章 xff0c 有时间我也要把 Effective
  • C++监控USB设备

    这个程序前阵子帮一个朋友实现的 xff0c 之前从未用消息队列做过类似的事情 xff0c 做完后感觉其在线程同步 xff0c 通信发面很好用 xff0c 难怪COM也用这套机制 程序稍微修改便能用作一般性的处理 xff0c 目前实现的功能类
  • TCP通信

    客户端的代码 xff1a 1 include 34 utili h 34 2 3 int main 4 5 int sockCli 61 socket AF INET SOCK STREAM 0 6 if sockCli 61 61 1 7
  • 解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题

    解决引用openssl静态库libcrypto a和libssl a出现undefined reference to错误的问题 最近在做使用openssl链接http和https的项目 xff0c 编译时出现以下问题 usr local o
  • ssh允许root登录

    vi etc ssh sshd config Authentication LoginGraceTime 120 PermitRootLogin without password 找到这里 xff0c 把它注释 PermitRootLogi
  • 大型网站技术架构

    大型网站技术架构 xff08 1 xff09 网站都是从小网站一步一步发展为大型网站的 xff0c 而这之中的挑战主要来自于庞大的用户 安全环境恶劣 高并发的访问和海量的数据 xff0c 任何简单的业务处理 xff0c 一旦需要处理数以 P
  • iOS线程池

    多线程开发是一件需要特别精心的事情 xff0c 即使是对有多年开发经验的工程师来说 为了能让初级开发工程师也能使用多线程 xff0c 同时还要简化复杂性 各种编程工具提供了各自的办法 对于iOS来说 xff0c 建议在尽可能的情况下避免直接
  • QT https post请求

    以VS开发为例 因为https访问需要用到SSL认证 xff0c 而QT默认是不支持SSL认证 xff0c 所以在使用之前必须先做一些准备工作 xff1a 需要安装OpenSSL库 xff1a 1 首先打开http slproweb com
  • 在windows下的QT编程中的_TCHAR与QString之间的转换

    由于在windows下的QT编程中 xff0c 如果涉及到使用微软的API xff0c 那么不可避免使用 TCHAR这些类型 xff0c 因此在网上查了一下 xff0c 其中一个老外的论坛有人给出了这个转换 xff0c 因此在这里做一下笔记
  • QT图片旋转

    目前发现有两种方法 xff0c 如下 xff1a 1 使用QPixmap的transformed函数旋转 xff0c 这个函数默认是以图片中心为旋转点 xff0c 不能随意设置旋转点 xff0c 使用如下 xff1a QMatrix lef
  • signtool对EXE进行签名

    数字证书 xff0c 真是个神奇的东西 xff0c 可以保证软件不被修改 xff0c 可以表明文件的发布日期 xff0c 最重要的 xff0c 可以很大程度的减少杀毒软件的误报 xff0c 当然 xff0c 这就要使用可信任的机构颁发的证书
  • Linux C语言实现UDP的发送和接收

    发送端实现 xff1a U1 c include lt stdio h gt include lt stdlib h gt include lt string h gt include lt sys socket h gt include
  • C语言 特殊的数字

    问题描述 153是一个非常特殊的数 xff0c 它等于它的每位数字的立方和 xff0c 即153 61 111 43 555 43 333 编程求所有满足这种条件的三位十进制数 span class token macro property
  • STL简单的介绍

    我们要知道C 43 43 的含义 xff1a C语言 43 类 43 模板 xff08 STL就是典型的代表 xff09 STL是Standard Template Library的简称 xff0c 中文名是标准模库 从根本上说 xff0c
  • C语言 查找整数

    问题描述 给出一个包含n个整数的数列 xff0c 问整数a在数列中的第一次出现是第几个 输入格式 第一行包含一个整数n 第二行包含n个非负整数 xff0c 为给定的数列 xff0c 数列中的每个数都不大于10000 第三行包含一个整数a x
  • C语言 字母图形

    问题描述 利用字母可以组成一些美丽的图形 xff0c 下面给出了一个例子 xff1a ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形 xff0c 请找出这个图形的规律 xff0c 并输

随机推荐

  • C++ 无参构造函数

    设计表示平面坐标位置的点类 xff0c 可以修改和获取点的x y坐标值 xff0c 设置构造函数对点的数据成员进行初始化 xff0c 并且能够用数组保存一系列的点 span class token macro property span c
  • C语言 矩阵乘法

    问题描述 给定一个N阶矩阵A xff0c 输出A的M次幂 xff08 M是非负整数 xff09 例如 xff1a A 61 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N M xff08 1 lt 61 N
  • C语言 分解质因数

    问题描述 求出区间 a b 中所有整数的质因数分解 输入格式 输入两个整数a xff0c b 输出格式 每行输出一个数的分解 xff0c 形如k 61 a1a2a3 a1 lt 61 a2 lt 61 a3 xff0c k也是从小到大的 具
  • 编译原理 赋值语句翻译成四元式

    赋值语句及算数表达式的翻译 将赋值语句翻译成四元式的语义描述 1 S gt id 61 A 2 A gt id 3 A gt int 4 A gt real 5 A gt A1 43 A2 6 A gt A1A2 7 A gt A1 8 A
  • 关联容器知识点通关

    关联容器 1 关联容器与顺序容器的区分2 关联容器的数据2 1 数据存储2 1 1 pair类型2 1 2 关联容器的类型别名2 1 3 关联容器迭代器 2 2 关联容器的初始化 3 关联容器的增删改查3 1 关联容器增加元素3 2 删除关
  • django JWT 验证401错误

    因为前端请求时携带了Authorization请求头 xff08 主要是JWT xff09 xff0c 而如果用户未登录 xff0c 此请求头的JWT无意义 xff08 没有值 xff09 xff0c 为了防止REST framework框
  • “轻松搞定 CMake”系列之 find_package 用法详解

    一 find packakge 命令基本介绍 在我们实际开发过程中 xff0c 经常不可避免会使用到第三方开源库 xff0c 这些开源库可能是通过 apt get install 命令自动安装到系统目录中 xff0c 也可能是由我们自己下载
  • STL中的string类

    一 string是什么 xff1f string类是专门的字符串操作的一个类 xff0c 非常的强大 二 string与char 的区别 xff1a char 呢就是指向字符数组地址的指针 xff0c 然后我们提供了一个string h x
  • Cpp 对象模型探索 / 父类和子类调用构造函数和析构函数的顺序

    2018 03 19 创建人 xff1a Ruo Xiao 邮箱 xff1a xclsoftware 64 163 com 一 建立对象过程 father son 栗子 xff1a span class token keyword clas
  • 串口通信 / 奇校验、偶校验、0 校验和 1 校验

    时间 xff1a 2019 01 28 创建人 xff1a Ruo Xiao 邮箱 xff1a xclsoftware 64 163 com 一 目的 对数据传输的正确与否进行校验 二 方法 奇校验 xff1a 让主体数据加上校验位中的 1
  • 堆栈向下增长和向上增长的理解

    时间 xff1a 2019 01 31 创建人 xff1a Ruo Xiao 邮箱 xff1a xclsoftware 64 163 com 假设堆栈为数组Taskstk unsigned int Taskstk 255 堆栈压数从栈顶压向
  • C++--名字修饰

    名字修饰 在C C 43 43 中 xff0c 一个程序要运行起来 xff0c 需要经历以下几个阶段 xff1a 预处理 编译 汇编 链接 名字修饰 xff08 Name Mangling xff09 是一种在编译过程中 xff0c 将函数
  • 【ROS入门】解决Could not find a package configuration file provided by “nmea_msgs“问题

    笔者Linux虚拟机系统为Ubuntu20 04 xff0c 安装ROS我参考的是https blog csdn net weixin 45168199 article details 106910446 安装完成后创建ROS工作空间 mk
  • C#中的屏蔽、覆写和抽象

    屏蔽基类成员 虽然派生类不能删除其继承的任何成员 xff0c 但可以声明一个与基类成员签名相同的成员来屏蔽之 xff08 注意方法的签名由名称和参数列表组成 xff0c 不包括返回值类型 xff09 要让编译器知道你在故意屏蔽继承的成员 x
  • 【计算机网络】第一章:计算机网络概述

    各个章节的知识点总结传送门如下 xff0c 欢迎自取 xff1a 计算机网络 第一章 xff1a 计算机网络概述描述 计算机网络 第二章 xff1a 物理层 计算机网络 第三章 xff1a 数据链路层 计算机网络 第四章 xff1a 网络层
  • 【计算机网络】第二章:物理层

    各个章节的知识点总结传送门如下 xff0c 欢迎自取 xff1a 计算机网络 第一章 xff1a 计算机网络概述https blog csdn net iwanderu article details 103795715 计算机网络 第二章
  • 【计算机网络】第四章:网络层

    各个章节的知识点总结传送门如下 xff0c 欢迎自取 xff1a 计算机网络 第一章 xff1a 计算机网络概述https blog csdn net iwanderu article details 103795715 计算机网络 第二章
  • ASCII码与16进制的互相转换(表)

    所谓的ASCII和16进制都只是概念上的东西 xff0c 在计算机中通通是二进制 转换应该是输出的转换 xff0c 同样是一个数 xff0c 在计算机内存中表示是一样的 xff0c 只是输出不一样 ASCII是针对字符的编码 xff0c 几
  • 【操作系统】 Operation System 第一章:概述

    各部分总结知识点如下 xff1a 操作系统 Operation System 第一章 xff1a 概述 操作系统 Operation System 第二章 xff1a 操作系统基础操作 操作系统 Operation System 第三章 x
  • 【openCV踩坑日记】人工数据集Synthetic Shapes dataset的生成方法

    1 为什么要介绍这个方法 xff1f 2018年的时候 xff0c D DeTone等人发表了Self Supervised Interest Point Detection and Description xff0c 提出了一种特征提取S