最后的问题
写在前面
这篇是我最喜欢的阿西莫夫的科幻小说,所以我打算分享出来。
最后的问题最后的问题第一次被半开玩笑地提出是在2061年的5月21日。那时人类文明刚刚步入曙光中。这个问题源起于酒酣之中一个五美元的赌,它是这么发生的:
亚历山大·阿代尔与贝特伦·卢泊夫是Multivac的两个忠实的管理员。像任何其他人一样,他们知道在那台巨大的计算机数英里冰冷、闪烁、滴答作响的面庞后藏着什么。那些电子回路早已发展到任何个别的人都无法完全掌握的地步,但他们至少对它的大致蓝图有个基本的概念。
Multivac能自我调节和自我修正。这对它是必要的,因为人类当中没有谁能够快甚至够好地对它进行调节和修正。所以实际上阿代尔与卢泊夫对这个庞然大物只进行一些非常轻松和肤浅的管理,任何其他人也都只能做到这个程度。他们给它输送数据,根据它所需的格式修改问题,然后翻译给出的答案。当然,他们以及其他管理员们完全有资格分享属于Multivac的荣誉。
几十年中,在Multivac的帮助下人类建造了宇宙飞船,计算出航行路径,从而得以登陆月球、火星和金星。但是更远的航行需要大量的能量,地球上可怜的资源不足以支持这些飞船。尽管人 ...
利用SVD进行坐标系转换
我的项目遇到了一些问题,这个问题伴随了我好长时间一直没有解决,这几天询问了老师后终于有了新的思路,接下来我说明一下我的问题,以及解决方法
问题原因很普通的问题,我在利用双目测出深度之后,会形成以左相机光心为原点,图片的水平方向为X轴(左小右大),垂直方向为Y轴(上小下大),垂直于相机成像平面为Z轴(远小近大),类型为右手坐标系。但这个坐标系并不能满足于我的项目,我需要强制转换一个坐标系。
一开始我想到的是制作旋转平移矩阵,也就是:
\left[
\begin{matrix}
R & \vec{T} \\
\vec{0} & 1
\end{matrix}
\right]但我忽略了秩的问题,总之直接去求并不能求出来。
解决方法根据老师的提醒,我还是找到了解决的具体方法,直接采用SVD(奇异值分解)可以求出自己想要的具体矩阵。
奇异值分解又捡起了线性代数方面的知识,简单回顾了一下奇异值分解具体原理。
奇异值分解是把矩阵分解成了:
M = U \Sigma V^T其中,U和V是两个方阵,Sigma 矩阵是一个对角线是奇异值、其他位置是0的矩阵。
numpy 提供了奇 ...
一款Google开源的人工智能项目
今天介绍一款Google开源的人工智能项目——Mediapipe。
在这里放出此项目的官网链接:【点击此处进入官网】
Mediapipe是一个基于图的数据处理管线,用于构建使用了多种形式的数据源,如视频、音频、传感器数据以及任何时间序列数据。
下面是提供的该项目名单:
Face Detection)
Face Mesh
Iris
Hands
Pose
Holistic
Hair Segmentation
Object Detection
Box Tracking
Instant Motion Tracking
Objectron
KNIFT
所以这个框架很适合二次开发,开发出自己的项目,详细内容就进入官网查看吧。
Hand我自己的一个项目中确实使用到了这个框架,但我只使用过Hand项目,接下来我会介绍一下这个项目的使用方法。
介绍这个项目使用了两个网络,一个网络为目标检测,另一个是姿态回归。这个姿态回归的网络还可以直接进行预测是否是“手”,因此虽然有两个网络。
在视频模式下,在第一次使用目标检测检测到手后,就可以 ...
VSCode开发ESP32
最近我要使用ESP32来做一些有意思的东西,我是真的喜欢这款MCU,尤其是Stm32被炒的天价之后。
但我不太喜欢使用 Arduino IDE,那个实在是太简陋了,写起来总是莫名其妙的样式Bug,有意思的是VSCode支持了这个插件,这就太方便我使用了。
搭建开发环境安装PlatformIO首先就是安装VSCode,太简单了,一直点下一步就行,这里就不展示了。
主要是需要装插件,直接搜索PlatformIO,就能直接搜到,找到后就直接安装。
需要稍微等等,因为会安装一些其他东西。在等待的过程中,建一个文件夹,这是用来存放程序的位置。
安装完后会没有反应,这时候需要重启一次VSCode才会有以下图标。
点开这个图标后找到platforms,稍微等等,第一次进入有点慢。然后在project中点击Create New Project就可以创建新的项目。
接下来填一下自己的一些东西,板子选项选择自己的板子就行,我使用的是最普通的板子,我就选择了如图的板子型号。
注意有一个打勾选项,还记得刚才创建了一个文件夹吗,就把路径定位到那里,当然也可以默认,就是以后不好找到的。
然后点击Finis ...
利用Opencv进行双目标定
前段时间进行了摄像头标定,我使用过matlab直接标定,效果感觉还可以。那么这次纯粹是使用Opencv来进行一次标定。
准备标定板标定板是必不可少的,这里我说明一下,建议使用长宽不等的标定板,这样可以避免出现错误的姿态误差。比如我下面准备的图片。
我是直接打印出来,其实并不建议直接打印,因为我打印出来后发现整张纸有点潮,晾干后不太平整,所以并不太建议直接打印。
标定程序先说一下步骤:
定位出图片中所有的角点
利用所有的角点去进行单目标定
利用所有的角点去进行双目标定
定位角点当然,在找点前需要把图片导进来,导进来是一个 numpy 的矩阵,形状为(h, w, 3)。
接下来我就直接定义了个函数,用来专门定位。
这个函数简单介绍一下,有两个参数:
image是图片的矩阵
size是标定板的角点的尺寸,上面的那张标定图就是(11, 8)
返回值就只有两种可能,如果能找到就直接返回点,找不到就返回None。
程序如下:
1234567891011121314151617181920212223def cornerFind(image, size): "" ...
利用图片加密数据
最近玩了一个很有意思的操作,直接把数据存放在图片中,这种算法有很多种,今天就说一种加密算法。
原理首先需要知道像素,有一张三通道的彩色图片,也就是一个 三个维度的矩阵,每个元素的数字的范围是 0~255,很简单,是一个 8 位二进制的数字,总而言言之,每个像素是一个8位的数字。
三个数值可以直接构成一个像素颜色,也就是RGB(Opencv是使用的BGR,无影响)。那就请看下面的图:
你能看出左右红色有什么区别吗?反正我是看不出来,实际上在红色分量上左边是255、右边是254,仅仅差了1,也就是说相差1基本看不出来变化。
那么把八位的数据拆开,最后一位是0是1都不会影响颜色太大变化,因为仅仅相差1。
所以算法就出来了,首先,把一张图片的所有像素的最后一位变成0,这样肉眼是观查不出问题的。然后我们把需要加密的信息重新拆成二进制形式,补充到最后一位上,还是不会看出来(反正我是看不出来)。
程序我也写出来了这部分程序:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 ...
Java多线程并发
一些基本概念为了防止单个程序发生阻塞的现象,所以必须使用多线程或进程来解决此类问题。
进程在操作系统中运行的的程序会占用一个进程,进程主要在执行一个程序的过程中,系统会分配给的一些资源给此进程进行执行一些程序,主要针对于硬件产生的一种并发。
是系统资源分配的基本单位。
线程一个进程中会分配多个线程,用来是提高某个程序高并发运行。
是CPU调度和执行的基本单位,真正多线程是多个CPU(多核)共同执行。
创建线程三种方式:
继承Thread类(重点)
使用Runnable接口(重点)
使用Callable接口(了解)
继承Thread类步骤:
继承Thread类,重写run方法
实例化对象,使用start()方法启动
测试:
线程1:
12345678public class Thread_1 extends Thread{ public void run(){ for(int i=0;i<1000;i++){ System.out.println("Thread_1"); ...
Minecraft的Mod开发
为了使 Minecraft 的 可玩性更高,但数据包的局限性很大,所以开始开发 mod 来进一步增强游戏体验。
我所选择的是 fabric 的 mod 开发,原因如下:
维护方便,没有使用 forge 的最重要原因就是太麻烦,每次更新会有很大的变化,fabric 最大的优点就是仅仅需要改改版本就可以使用。
开发方便,虽然 fabric 没有 forge 更强大,但很大程度上方便开发,对于我来说,在闲暇之余即可开发。
fabric 的开发环境搭建下载 fabric 的工程模板:GitHub - FabricMC/fabric-example-mod: Example Fabric mod
下载完毕后,cd到文件目录,运行./gradlew genSources来配置环境。
(未完待续,可能永远都不能待续了/(ㄒoㄒ)/~~)
回顾计算机网络
我在本科的时候比较系统学习过计算机网络,可惜好久不用了,所以,本篇文章是一个复习的笔记,我就挑一些我将来可能用到的东西去详细复习,所以像什么数据链路层和物理层我就不用去复习了(那部分是真的恶心)。
IP地址区分局域网或互联网中的计算机设备。
每一台电脑有一个 IP 地址。
127.0.0.1为本地 localhost
程序测试:
123456789101112131415161718192021222324252627import java.net.InetAddress;import java.net.UnknownHostException;public class Test { public static void main(String[] args) { try{ // 查询本地ip地址 // 可以使用以下方式查询: // 1. 127.0.0.1 // 2. localhost // 3. 直接使用.getLoc ...
关于我博客移植到小程序上的那些事
如题,我打算把我自己的博客移植,因为感觉有时候从手机上甩给别人一个链接不方便,还是微信小程序更方便一些。
hexo插件安装首先是需要一个插件的,这个插件的是hexo-generator-restful,作用就是可以将 hexo 中的某些东西可以转换生成 restful 接口供其他地方调用。
这是一个 restful 风格的 json 文件接口,可以直接去访问这个文件,获得静态网页的信息。
下面是这个插件在 Github 上的说明:
https://github.com/yscoder/hexo-generator-restful
安装打开 CMD,将路径cd到博客下,直接在 CMD 中打入以下命令就可以安装:
1npm install hexo-generator-restful
配置首先打开配置文件_config.yaml,可以通过修改配置文件信息来实现其他功能,但最开始还没有这些配置,需要手动复制以下内容:
12345678910111213141516171819202122232425# 对外APIrestful: # site 可配置为数组选择性生成某些属性 # sit ...