结构光三维重建学习笔记

所以,格雷码的生成步骤: 产生0,1两个字符串;0、1 在第一步基础上: 每个字符串前都+0->0+0、0+1 翻转首个元素,其余对称:1+1、1+0 最终:00、01、11、10 在上一步基础上: 每个字符串前都+0->0+00、0+01、0+11、0+10 翻转首字符,其余对称:1+10、1+11、1+01、1+00 最终:000、001、011、010、110、111、101、100 之后递归即可!我们用C++代码来实现一下,采用递归的形式:

#include <iostream>
#include <vector>
#include <cassert>
using namespace std;vector<string> GrayCode(int n) {if (n < 1) {cout << "格雷码数量必须大于0" << endl;assert(0);} else if (n == 1) {vector<string> code;code.emplace_back("0");code.emplace_back("1");return code;} else {vector<string> code;vector<string> code_pre = GrayCode(n - 1);for (int idx = 0; idx < code_pre.size(); ++idx) {code.push_back("0" + code_pre[idx]);}for (int idx = int(code_pre.size() - 1); idx >= 0; --idx) {code.push_back("1" + code_pre[idx]);}return code;}
}int main()
{int n = 4;vector<string> gray_code = GrayCode(n);for (auto &g : gray_code){cout << g << endl;}
}

二进制转格雷码编码

<int> GrayCode2(int n){int count = 1 << n;vector<int> res(count,0);for(int i = 1 ; i < count; i ++){int bin = i,cur = bin >> (n - 1);for(int k = n - 1;k > 0;k --)cur = (cur << 1) + (((bin >> k) & 1) ^ ((bin >>(k - 1)) & 1));res[i] = cur;}return res;
}
vector<int> gray_code2 = GrayCode2(n);for (auto &g : gray_code2){cout << (bitset<n>)g << endl;}

3.1 投影图案生成

结合格雷码生成和编码图,这段代码就很好写了,我们来写一下,这回我们用Python来写(人生苦短!):

import cv2
import numpy as npclass GrayCode:codes = np.array([])k2code = {}k2v = {}           v2k = {}def __init__(self, n:int=3):self.n = nself.codes = self.__creatCode(self.n)# 从k(idx)转换到格雷码for k in range(2**n):self.k2code[k] = self.__k2code(k)# 从格雷码转换到vfor k in range(2 ** n):self.k2v[k] = self.__k2v(k)# 从v转换到k(idx)for k, v in self.k2v.items():self.v2k[v] = kdef toPattern(self, idx:int, cols:int = 1280, rows:int = 800):assert (idx >= 0)row = self.codes[idx, :]one_row = np.zeros([cols], np.uint8)assert (cols % len(row) == 0)per_col = int(cols / len(row))for i in range(len(row)):one_row[i * per_col : (i + 1) * per_col] = row[i]pattern = np.tile(one_row, (rows, 1)) * 255return patterndef __creatCode(self, n:int):code_temp = GrayCode.__createGrayCode(n)codes = []for row in range(len(code_temp[0])):c = []for idx in range(len(code_temp)):c.append(int(code_temp[idx][row]))codes.append(c)return np.array(codes, np.uint8)def __k2code(self, k):col = self.codes[:, k]code = ""for i in col:code += str(i)return codedef __k2v(self, k):col = list(self.codes[:, k])col = [str(i) for i in col]code = "".join(col)return int(code, 2)@staticmethoddef __createGrayCode(n:int):if n < 1:print("输入数字必须大于0")assert (0);elif n == 1:code = ["0", "1"]return codeelse:code = []code_pre = GrayCode.__createGrayCode(n - 1)for idx in range(len(code_pre)):code.append("0" + code_pre[idx])for idx in range(len(code_pre) - 1, -1, -1):code.append("1" + code_pre[idx])return codeif __name__ == '__main__':n = 8g = GrayCode(n)print("code")print(g.codes)print("\nk -> code")print(g.k2code)print("\nk -> v")print(g.k2v)print("\nv -> k")print(g.v2k)for i in range(n):pattern = g.toPattern(i)title = str(i) + "-img"cv2.imshow(title, pattern)cv2.waitKey(0)cv2.destroyWindow(title)





```python```python```python```python```python
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号def phase_simulation(WIDTH, T1, T2, T3):pha1, pha2, pha3 = np.zeros(shape=WIDTH), np.zeros(shape=WIDTH), np.zeros(shape=WIDTH)t1, t2, t3 = 1, 1, 1for idx in range(WIDTH):if t1 > T1: t1 = 1  # 重置一下pha1[idx] = (t1 / T1) * 2 * np.piif t2 > T2: t2 = 1pha2[idx] = (t2 / T2) * 2 * np.piif t3 > T3: t3 = 1pha3[idx] = (t3 / T3) * 2 * np.pit1 += 1; t2 += 1; t3 += 1return pha1, pha2, pha3def parse_phase(pha1, pha2, T1, T2):pha12 = np.zeros_like(pha1)# 计算Delta(如果满足条件,输出左侧,否则右侧)pha12 = np.where(pha1 >= pha2, pha1 - pha2, pha1 - pha2 + 2 * np.pi)# # 跟下面这段代码等价# for idx in range(0, pha12.shape[0]):#     if pha1[idx] >= pha2[idx]:#         pha12[idx] = pha1[idx] - pha2[idx]#     else:#         pha12[idx] = pha1[idx] - pha2[idx] + 2 * np.piT12 = T1 * T2 / (T2 - T1)# 方法1pha12 = T2 / (T2 - T1) * pha12# # 方法2# m = np.round((T2 / (T2 - T1) * pha12 - pha1) / (2 * np.pi))# pha12 = 2 * np.pi * m + pha12# 归一化到[0,2π]min_value, max_value = np.min(pha12), np.max(pha12)pha12 = (pha12 - min_value) * (2 * np.pi / (max_value - min_value))return pha12, T12if __name__ == '__main__':# 视场宽度WIDTH = 854# 条纹周期T1 = 11T2 = 12T3 = 13pha1, pha2, pha3 = phase_simulation(WIDTH, T1, T2, T3)X = np.arange(0, WIDTH)plt.plot(X, pha1, label="pha1")plt.plot(X, pha2, label="pha2:")plt.plot(X, pha3, label="pha3")plt.title("相移主值图(仿真)")plt.xlabel("像素")plt.ylabel("w/rad")plt.legend()plt.show()# 解相位pha12, T12 = parse_phase(pha1, pha2, T1, T2)pha23, T23 = parse_phase(pha2, pha3, T2, T3)pha123, T123 = parse_phase(pha12, pha23, T12, T23)plt.plot(X, pha12, label="pha12")plt.plot(X, pha23, label="pha23")plt.plot(X, pha123, label="pha123")plt.title("解出绝对相位")plt.xlabel("像素")plt.ylabel("w/rad")plt.legend()plt.show()

结构光格雷码编码解码二值化 相移相关推荐

  1. 条形码和二维码编码解码工具类源码

    有一个好的工具,会让你的开发事半功倍.再将讲这个工具类之前,我先给小白补充一点条形码和二维码(以下基础知识选自,我本科阶段的一本教材:<物联网导论>(刘云浩 编著).有对物联网感兴趣的,可 ...

  2. 4位格雷码的顺序编码_格雷码编码 解码 实现(Python)

    作者:曹博 01 二值码 02 格雷码编码 2.1 编码优点 2.2 编码生成 2.3 递归生成 2.4 二值码转换 2.5 编码图 03 格雷码投影 3.1 投影图案生成 3.2 DLP投影图像 0 ...

  3. 【H.264/AVC视频编解码技术详解】十九:熵编码算法(5)——H.264的CABAC(上):语法元素的二值化方法...

    <H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...

  4. 【H.264/AVC视频编解码技术详解】十九、熵编码(5):CABAC语法元素的二值化

    <H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...

  5. 二值化算法OTSU源码解析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 概述: 本文中小编将会跟大家分享一下OpenCV3.1.0中图像二 ...

  6. 利用OpenCV的threshold函数实现双阈值法二值化操作的源码

    直接上源码吧,很简单,一看就懂,如果你不明白,可以举两个灰度值实际代入进行理解! 源码如下: 源码中用到的图像的下载链接为:hand1.jpg_免费高速下载|百度网盘-分享无限制 图像处理开发需求.图 ...

  7. Scikit-learn数据预处理分类变量编码之多标签二值化

    Scikit-learn数据预处理分类变量编码之多标签二值化 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 名义变量多标签二 ...

  8. Scikit-learn数据预处理分类变量编码之标签二值化

    Scikit-learn数据预处理分类变量编码之标签二值化 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 名义变量标签二值化 ...

  9. 论文推荐|【KSII TIIS 2021】DP-LinkNet:一种用于古籍文档图像二值化的卷积网络(有源码)...

    今日分享来自[KSII TIIS 2021]的论文『DP-LinkNet: A convolutional network for historical document image binariza ...

最新文章

  1. Python 精选笔试面试习题—sorted 与 sort 单例模式、统计字符个数Count、垃圾回收、lambda函数、静态方法、类方法、实例方法、分布式锁、
  2. VIM技巧:显示行号
  3. MVC匿名类传值学习
  4. Nutch爬虫引擎使用分析
  5. numpy meshgrid 和 mgrid 的两个简单实例和解析
  6. 即时通讯音视频开发(二):视频编解码之数字视频介绍
  7. 部署及配置Lync Server 2013 监控功能
  8. ps法线贴图插件_法线与置换贴图原理讲解以及烘焙制作!
  9. linux去掉日志中的skipping,Linux日志文件总管 logrotate
  10. jenkins修改任务工作目录
  11. 3.emWin5.26(ucGui)VS2008 2-D图形库-基本绘图【Worldsing笔记】
  12. 数据库语句删除数据库
  13. SPSS作业-卡方检验-列联表
  14. 中国电信CTWAP和CTNET已经融合
  15. java实现小球的碰撞
  16. [转载] 心目中的编程高手-----后学者以自励
  17. P3387 【模板】缩点 洛谷 java题解 连通图+拓扑排序
  18. Vue微信网页开发,输入法顶开一部分屏幕的解决办法
  19. Win7(Win2003)下安装Node.js(版本号:v0.11.0)提供下载
  20. php 按比例裁剪图片,自定义裁剪图片大小,按照一定比例裁剪图片的软件

热门文章

  1. 甲亢php,含碘中药在甲亢治疗中的应用
  2. 【MNP报告】为什么BSV比BTC和BCH更加节能?
  3. 想进行快速钢网设计,还能保证钢网质量? 来看这里
  4. vue项目怎么在手机查看
  5. 大数据入门,你需要懂这四个常识
  6. 完美者u盘linux,完美者u盘维护系统v10.2 完整终结版_完美者u盘维护系统2017官方下载|好特下载...
  7. 一加9pro安装配置charles(mac下)及手机配置ca证书
  8. 如何让Windows 10每天夜间自动开启深色模式
  9. 开云旗下巴黎世家圣罗兰将生产口罩;沃尔沃金融服务亚太总部迁至北京 | 美通企业日报...
  10. Android 12安装app失败,提示安装包解析异常