- 博客(33)
- 资源 (1)
- 收藏
- 关注
原创 OpenGL学习笔记(十)-几何着色器-实例化
参考网址:LearnOpenGL 中文版4.7 几何着色器4.7.1 基本概念1、顶点和片段着色器之间有一个可选的几何着色器,几何着色器的输入是一个图元(如点或三角形)的一组顶点,顶点发送到下一着色器之前可对它们随意变换,将顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。#version 330 corelayout (points) in;layout (line_strip, max_vertices = 2) out;void main() { gl_Posit
2022-05-13 10:43:44 1207
原创 OpenGL学习笔记(九)-高级数据-高级GLSL
参考网址:LearnOpenGL 中文版第四章 高级OpenGL4.6 数据与缓冲在OpenGL中使用缓冲来储存数据,本节将讨论不同的缓冲函数,以及如何使用纹理对象来储存大量的数据。缓冲是用来管理特定内存块的对象,将它绑定到一个缓冲目标后,才赋予了其意义。例如,将缓冲绑定到GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY_BUFFER等缓冲目标上,OpenGL根据目标的不同,以不同的方式处理缓冲。4.6.1 缓冲函数1、之前一直调用glBufferData函数来填充缓冲对象所管理的
2022-05-05 15:47:58 747
原创 OpenGL学习笔记(八)-面剔除-帧缓冲-立方体贴图
参考网址:LearnOpenGL 中文版第四章 高级OpenGL4.4 面剔除4.4.1 基本概念1、一个3D立方体,从任意方向最多能同时看到3个面,以某种方式丢弃这几个看不见的面,能省下超过50%的片段着色器执行数。2、如何确定物体的某一个面看不见?一个闭合形状的每个面都有两侧,每一侧要么面向用户,要么背对用户。面剔除能够检查所有面向观察者的面,并渲染它们,而丢弃那些背向的面。但要告诉OpenGL哪些是正向面和背向面,这可通过分析顶点数据的环绕顺序完成。4.4.2 环绕顺序1、当定义一组三角
2022-04-27 10:53:36 584
原创 OpenGL学习笔记(七)-深度测试-模板测试-混合
参考网址:LearnOpenGL 中文版第四章 高级OpenGL4.1 深度测试4.1.1 深度缓冲1、深度缓冲用来防止被阻挡的面渲染到其它面的前面,由窗口系统自动创建,在每个片段中储存了它的深度值。当启用深度测试时,OpenGL会将一个片段的深度值与深度缓冲的深度值进行对比。如果通过了深度测试,则在深度缓冲中储存该片段的z值;如果没有通过,则会丢弃该片段。2、深度缓冲创建于片段着色器运行之后,在屏幕空间中运行,与glViewport所定义的视口密切相关。屏幕空间坐标可使用GLSL内建变量gl_F
2022-04-22 16:27:31 919
原创 OpenGL学习笔记(六)-模型加载
参考网址:LearnOpenGL 中文版哔哩哔哩教程第三章 模型加载3.1 Assimp1、Assimp能够导入多种模型文件格式,将所有的模型数据加载至Assimp的通用数据结构中,我们就能够从Assimp的数据结构中提取我们所需的所有数据了。2、Assimp会将整个模型加载进一个场景对象,场景对象中包含一系列的节点,每个节点包含了场景对象中所储存数据的索引,每个节点都可以有任意数量的子节点。(图中左半边)场景的根节点含子节点,子节点中有一系列指向场景对象中mMeshes数组中储存的网格数据的
2022-04-15 16:05:54 835
原创 OpenGL学习笔记(五)-投光物-多光源
参考网址:LearnOpenGL 中文版哔哩哔哩教程2.5 投光物2.5.1 平行光1、当一个光源处于很远的地方时,来自光源的每条光线就会近似于互相平行,例如太阳。不论物体和/或者观察者的位置,看起来好像所有的光都来自于同一个方向。当假设光源处于无限远处的模型时,它就被称为定向光。2、通过定义光线方向向量即可模拟一个定向光。struct LightDirect { vec3 lightDir; vec3 ambient; vec3 diffuse; vec3
2022-04-11 10:58:00 492
原创 OpenGL学习笔记(四)-光照-材质-光照贴图
参考网址:LearnOpenGL 中文版哔哩哔哩教程第二章 光照2.1 颜色现实生活中人眼看到某一物体的颜色,是它所反射的颜色。如将白光照在红色的玩具上,玩具会吸收白光中除了红色以外的所有子颜色,不被吸收的红色光被反射到我们的眼中,让这个玩具看起来是红色的。该颜色反射的定律运用在OpenGL时,给定光源颜色,把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色。glm::vec3 ambientColor(0.0f, 1.0f, 0.0f);glm::vec3 objColor(
2022-04-10 09:46:06 827
原创 OpenGL学习笔记(三)-变换-坐标系统-摄像机
参考网址:LearnOpenGL 中文版哔哩哔哩教程1.5 变换为了使物体变成动态的,需要使用多个矩阵对象变换一个物体。1.5.1 向量向量包含方向和模。由于向量是一个方向,很难用位置表示,因此可指定原点,然后指向一个方向,对应一个点,使其变为位置向量。1、向量与标量运算:数学中是没有这个运算的,但是在许多线性代数的库中支持这样的运算。该运算就是将向量的每个元素,与标量进行运算。其中的+可以是+,-,·或÷。注意-和÷运算时不能颠倒(标量-/÷向量),因为颠倒的运算是没有定义的。2、向量取反
2022-04-03 10:29:57 1674
原创 OpenGL学习笔记(二)-着色器-纹理
参考网址:LearnOpenGL 中文版哔哩哔哩教程第一章 入门1.3 着色器1.3.1 基本结构利用着色器语言编写着色器,以顶点着色器和片段着色器为例,在着在顶点着色器中输出颜色变量vertexColor,在片段着色器中输入变量vertexColor作为图案的颜色。#version 330 corelayout (location = 0) in vec3 aPos; // 位置变量的属性位置值为0out vec4 vertexColor; // 为片段着色器指定一个颜色输出void m
2022-03-26 12:46:41 1360 1
原创 OpenGL学习笔记(一)-窗口-渲染管线
参考网址:LearnOpenGL 中文版哔哩哔哩教程第一章 入门1.0 配置库首先,在我们画出出色的效果之前,需创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,因此需要利用GLFW库,给我们提供一个窗口和一个OpenGL上下文用来渲染;其次,OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。为避免查询繁琐的过程,需利用GLE
2022-03-22 15:55:26 1126
原创 Vrep学习笔记(二)
四、基于Dummy和path的路径规划4.1 Dummy和pathPath是Scene的一种“实体”,可以使用Path来自定义各种运动路径,从Path上我们可以给定某一个时刻机器人运动到某一点的位置以及其姿态,定义机器人在整个路径中每一时刻的运动过程,V-REP中默认的Path是通过给定一些关键的控制点,并在这些控制点中间采用贝塞尔曲线插值来得到光滑路径的。Dummy是一种带有姿态信息的虚拟“质点”,Dummy可以沿着Path向前运动,实时获取当前时刻在Path上的位置和姿态,作为路径上的一个“领航
2021-08-06 10:06:14 3220 1
原创 Vrep学习笔记(一)
本文转载自知乎:AI与机器人一、用代码控制YouBot机器人1.1 YouBot机器人模型YouBot机器人包括底盘和机械臂。底盘带有四个麦轮,麦轮分为A轮和B轮,可以前后左右移动。机械臂有5个旋转关节和相应的连杆机构串联组成,末端装有夹持机构。每个关节可以进行单独的控制。在Vrep中已经构建好了基本的关节模型和运动控制接口,只需要调用响应的控制接口来控制各个关节就行了。1.2 Vrep中基本的代码框架V-REP的控制脚本至少包含Main script和Child script。
2021-08-06 10:06:04 4040
原创 Python笔记(3)
第十节 Numpy10.1 数组创建NumPy 用于处理数组。 NumPy 中的数组对象称为 ndarray。可以使用 array() 函数创建一个 NumPy ndarray 对象。可以将列表、元组或任何类似数组的对象传递给 array() 方法,然后它将被转换为 ndarray。import numpy as np arr = np.array([1, 2, 3, 4, 5])arr = np.array((1, 2, 3, 4, 5))print(arr)print(type
2021-08-04 14:10:45 168
原创 Pytorch笔记(3)
九 损失函数9.1 损失函数L1loss- 直接求差MSEloss-均方差CrossEntropyLoss -交叉熵我们定义一个分类的项目,要判断的目标为[person,dog,cat],它们组成为class[0,1,2],经过网络输出每个类别的概率x。例如,我们将dog的图片传递给网络,输出x=[0.1,0.2,0.3],对应的class=1,于是我们就可以去算交叉熵为:loss(x,class)=−0.2+log(e0.1+e0.2+e0.3)loss(x, class)=-0.2+lo
2021-07-01 19:18:55 238
原创 PyTorch学习笔记(2)
七 torchvision中数据集的使用7.1 下载数据集pytorch提供的目标识别数据集CIFAR10 pytorchvisionCLASStorchvision.datasets.CIFAR10(root: str, train: bool = True, transform: Optional[Callable] = None, target_transform: Optional[Callable] = None, download: bool = False)参数root
2021-06-29 19:58:23 443
原创 PyTorch学习笔记(1)
四、Python学习中的两大法宝函数import torchdir(torch)dir(torch.cuda) #获取这个工具箱里的工具目录help(torch.cuda.is_available) #获取函数的作用,要去掉括号五、PyCharm及Jupyter使用及对比
2021-06-28 14:05:47 242
原创 Python笔记(2)
第三节 语句3.1 If语句a = 200b = 66if b > a: print("b is greater than a")elif a == b: print("a and b are equal")else: print("a is greater than b")a = 200b = 66c = 500if a > b and c > a: print("Both conditions are True")a = 200b = 66
2021-06-27 14:32:47 544
原创 《机器视觉》笔记—视觉图像特征信息提取
3.1 图像边缘与图像平滑3.1.1 图像边缘阶跃边缘阶跃边缘表现为图像亮度在不连续处的两边的像素灰度值有明显差异,在实际图像中,阶跃边缘变成斜坡形边缘。如图(a)中的第三幅图,阶跃边缘图像亮度的一阶导数的幅度在阶跃边缘上非常大,而在非边缘上为零。而二阶导数值为零,但其左右分别有一正一负两个峰值。线条边缘线条边缘边线为图像亮度从一个灰度变化到另一个灰度,之后又很快返回原来的灰度。现实中,线条边缘呈屋顶形,其图像亮度一阶导数为零,二阶导数的幅度最大。3.1.2 图像平滑滤波图像滤波是通过
2021-06-25 15:19:06 1002
原创 《数字图像处理》笔记—灰度变换
3.1 背景本章主要讲解空间域的图像处理方法,直接对图像中的像素进行操作,主要包括:灰度变换和空间滤波。灰度变换是对图像的各个像素进行操作,空间滤波是对每个像素的邻域进行操作。3.1.1 灰度变换和空间滤波基础空间域处理可以表达为邻域原点从一个像素移动到另一个像素应用算子T,产生输出。对于任意指定的位置(x,y),输出图像g(x,y)的值等于对f中以(x,y)为原点的邻域应用算子T的结果。以上的操作称为空间滤波。最小邻域的大小为1,此时g只依赖于点(x,y)处的f值,此时T称为灰度变换函数,
2021-06-25 15:18:26 2695
原创 《机器视觉》笔记—空间几何变换与摄像机模型
2.1 空间几何变换本章主要讲解射影变换、仿射变换、比例变换和欧氏变换,以及各种变换的不变量性质。2.1.1 齐次坐标齐次坐标是由n+1维向量表示一个n维向量,n维空间中,非齐次坐标为(P1,P2…Pn),是唯一的。齐次坐标为(hP1,hP2…hPn,h),是不唯一的。齐次坐标的表示方法的优越性:1.能够明确地区分向量和点对于一个向量v以及基oabc,向量可以表示为:v = v1a + v2b + v3c,而对于一个点p,我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量p –
2021-06-25 15:17:56 1152
原创 Python笔记(1)
第一节 基本语法变量直接赋值不用定义x = 5y = "John"print(x)print(y)强制类型转换x = str(3) # x will be '3'y = int(3) # y will be 3z = float(3) # z will be 3.0获取变量类型x = 5y = "John"print(type(x))print(type(y))单双引号相同x = "John"x = 'John'多变量命名x,
2021-06-25 15:17:09 194
原创 OpenCV学习笔记—图像和大型数组类型
OpenCV学习笔记—图像和大型数组类型一、动态可变的存储二、Mat类N维稠密数组一、动态可变的存储Mat类用于表示任意维度的稠密数组,稠密表示该数组的所有部分都有一个值储存,即使这个值是0。相对的稀疏数组在spare mat中实现,稀疏数组中只有非0的数值才会被存储,因此适用于很多地方都是0的数组。二、Mat类N维稠密数组...
2020-08-26 21:27:51 251
原创 OpenCV笔记—数据类型
OpenCV学习笔记—数据类型一、基础数据类型概述1.1一、基础数据类型概述1.1参考文献:学习OpenCV3 中文版
2020-08-18 22:04:13 287
原创 PCL点云库学习笔记(点云分割1)
PCL点云库学习笔记(八)点云分割一、概述二、实现平面模型分割点云分割一、概述点云分割适合处理由多个独立空间区域组成的点云,将点云分割为不同的簇,然后可以对其进行独立处理。图中说明了平面模型分割和圆柱模型分割的结果。二、实现平面模型分割基于随机采样一致性的分割1.从一个样本集S中,随机抽取n个样本,拟合出一个模型,n是能够初始化模型的最小样本数。2.用1中得到的模型去测试所有的其它数据,如果某个点与模型的误差小于某个阈值,则该点适用于这个模型,认为它也是局内点。3.如果模型内的局内点达到一
2020-08-14 15:09:31 2982
原创 PCL点云库学习笔记(特征)
PCL学习笔记(二)特征概述特征概述点特征是根据该点周围可用的信息来描述几何图案,在点周围选择的数据空间通常称为k邻域。两个最广泛使用的几何点特征是下表面的估计曲率和点法线,使用其k个最近点提供的信息来表征一个点。为了有效地确定k,通常使用空间分解技术(例如八叉树或kD树)将输入数据集分成较小的块,然后在该空间中执行最近点搜索。 可以选择在p点附近的k个固定点,或者以点为中心的半径r的球体内的所有点。计算点p处的表面法线和曲率变化的最简单方法是在k邻域内进行特征分解(即计算特征向量和特征值)。对应
2020-08-08 15:21:39 1590
原创 PCL点云库学习笔记(滤波)
PCL点云库学习笔记(六)点云滤波一、概述二、使用直通滤波器三、使用VoxelGrid滤波器进行下采样点云滤波一、概述由于测量误差,某些数据集会出现大量阴影点。 通过对每个点的邻域进行统计分析,并修剪不符合特定条件的那些异常值,可以过滤掉某些异常值。 PCL中的稀疏离群值的消除,是基于输入数据集中点到邻域点的距离分布。 对于每个点,将计算从该点到其所有邻居的平均距离。 通过假定结果分布是具有均值和标准差的高斯分布,可以将其平均距离在由全局距离均值和标准差定义的区间之外的所有点视为离群值。二、使用直通
2020-08-07 18:32:21 1070
原创 PCL点云库学习笔记(可视化2)
PCL点云库学习笔记(五)可视化四、PCLPlotter五、MFC 开发实例可视化四、PCLPlotter4.1 绘制多项式PCLPlotter提供了一个非常简单明了的图形绘制界面,可以在库中可视化各种重要的图,从多项式函数到直方图。#include<vector>#include<iostream>#include<utility>#include<pcl/visualization/pcl_plotter.h>using namespa
2020-08-01 22:30:36 548 1
原创 PCL点云库学习笔记(搜索方法)
PCL点云库学习笔记(三)一、k-d tree二、八叉树一、k-d tree我们所有的k-d树都是三维空间的。 k-d树的每个级都使用特定维度拆分所有子级。 在树的根部,所有子项都将根据第一维进行拆分(即,如果第一维坐标小于根,则它将在左子树中;如果大于根,则显然会在 右边的子树)。 树中向下的每个级别都在下一个维度上划分,一旦所有其他级别都用尽后,将返回到第一个维度。 构造k-d树的最有效方法是使用一种分区方法,将中值点放置在根上,具有较小一维值在左子树,较大的值在右子树。 然后,在左右两个子树上都重
2020-07-26 21:09:27 1336
原创 PCL点云库学习笔记(输入输出)
PCL点云库学习笔记(二)输入输出(I\O)一、概述二、PCD 点云格式三、从PCD文件读取点云数据四、从PCD文件中写入点云数据输入输出(I\O)一、概述IO库包含用于读写点云数据(PCD)文件的类和函数,以及从各种传感设备捕获点云。二、PCD 点云格式1.为什么用一种新的文件格式?PCD文件格式的出现,是因为现有的文件结构不支持由PCL库引进n维点类型机制处理过程中的某些扩展。PCD不是第一个支持3D点云数据的文件类型,尤其是计算机图形学和计算几何学领域,已经创建了很多格式来描述任意多边形和
2020-07-24 16:45:15 2005
原创 PCL点云库学习笔记(基本结构)
PCL点云库学习笔记基本用法入门\基本结构基本用法不知道怎么入门,就先从阅读官方文档开始了,记录下学习的过程和出现的错误。官方文档的walkthrough介绍了各个部分,学到的时候再细看入门\基本结构pcl::PointCloud<pcl::PointCloud>是基本的数据类型,PointCloud是一个c++的类,包含以下的数据:1.pcl::PointCloud<pcl::PointCloud::width>width在无序数据集表示点的总数;在有序的点云数据集表示一
2020-07-24 16:44:13 1748
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人