首页 > 其他分享 >SGM重要代码摘抄

SGM重要代码摘抄

时间:2023-09-09 10:56:09浏览次数:49  
标签:聚合 min 代码 摘抄 像素 cost SGM const 代价

Census变换

 1     // 逐像素计算census值
 2     for (sint32 i = 2; i < height - 2; i++) {
 3         for (sint32 j = 2; j < width - 2; j++) {
 4             
 5             // 中心像素值
 6             const uint8 gray_center = source[i * width + j];
 7             
 8             // 遍历大小为5x5的窗口内邻域像素,逐一比较像素值与中心像素值的的大小,计算census值
 9             uint32 census_val = 0u;
10             for (sint32 r = -2; r <= 2; r++) {
11                 for (sint32 c = -2; c <= 2; c++) {
12                     census_val <<= 1;
13                     const uint8 gray = source[(i + r) * width + j + c];
14                     if (gray < gray_center) {
15                         census_val += 1;
16                     }
17                 }
18             }
19 
20             // 中心像素的census值
21             census[i * width + j] = census_val;        
22         }
23     }

汉明距离

 1 uint8 sgm_util::Hamming32(const uint32& x, const uint32& y)
 2 {
 3     uint32 dist = 0, val = x ^ y;
 4 
 5     // Count the number of set bits
 6     while (val) {
 7         ++dist;
 8         val &= val - 1;
 9     }
10 
11     return static_cast<uint8>(dist);
12 }

代价聚合

思想:总体思想利用动态规划:第一个像素代价为其初始视差,第二个像素代价为第二个像素初始代价和第一个像素的初始代价聚合得到聚合代价,第三个像聚合代价为第三个像素初始代价和第二个像素聚合代价的聚合...

技巧:定义一个临时数组用来存储本像素的聚合代价,给下一个像素用;然后每个像素的所有视差下的聚合代价求完放入临时数组中,再求下一个像素的

以横向聚合为例(方法就是一级循环从上往下遍历,二级循环每行从左向右或则从右向左遍历,三级循环从最小视差到最大视差遍历),下面阐述二级循环的步骤

  1. 判断从左向右聚合还是从右向左聚合,从左向右;从左向右就是从第一个像素开始循环,从右向左就是从最后一个像素循环。(这里以从左向右为例)
  2. 首先第一个像素的所有聚合代价就是它的初始代价,装入聚合数组;并将初始代价装入临时数组,给第二个像素用
  3. 进行第二个像素的聚合利用代价聚合公式进行代价聚合和上一步得到的临时数组,进行聚合后将第二个像素的所有聚合结果装入聚合数组;并将初始代价装入临时数组,给第三个像素用
  4. 进行第三个像素的聚合......
 1         for (sint32 j = 0; j < width - 1; j++) {
 2             gray = *img_row;
 3             uint8 min_cost = UINT8_MAX;
 4             for (sint32 d = 0; d < disp_range; d++){
 5                 // Lr(p,d) = C(p,d) + min( Lr(p-r,d), Lr(p-r,d-1) + P1, Lr(p-r,d+1) + P1, min(Lr(p-r))+P2 ) - min(Lr(p-r))
 6                 const uint8  cost = cost_init_row[d];
 7                 const uint16 l1 = cost_last_path[d + 1];
 8                 const uint16 l2 = cost_last_path[d] + P1;
 9                 const uint16 l3 = cost_last_path[d + 2] + P1;
10                 const uint16 l4 = mincost_last_path + std::max(P1, P2_Init / (abs(gray - gray_last) + 1));
11                 
12                 const uint8 cost_s = cost + static_cast<uint8>(std::min(std::min(l1, l2), std::min(l3, l4)) - mincost_last_path);
13                 
14                 cost_aggr_row[d] = cost_s;
15                 min_cost = std::min(min_cost, cost_s);
16             }

 

标签:聚合,min,代码,摘抄,像素,cost,SGM,const,代价
From: https://www.cnblogs.com/Sandals-little/p/17689027.html

相关文章

  • Python给你一个字符串,你怎么判断是不是ipv4地址?手写这段代码,并写出测试用例【杭州多测
    ipv4地址的格式:(1~255).(0 ~255).(0 ~255).(0 ~255)1.正则表达式importredefcheck_ip(one_str):compile_ip=re.compile('^(([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$')ifcompile_ip.match(one_str......
  • [代码随想录]Day40-动态规划part08
    题目:139.单词拆分思路:单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,说明就是一个完全背包!动规五部曲分析如下:确定dp数组以及下标的含义:dp[i]:字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字......
  • 用matplotlib迭代画图,在plt.show()执行后代码暂停
    https://tieba.baidu.com/p/4778495824幸好刚刚找到答案了,对于题主来说可能是帮不上忙了,但是对于碰巧搜到这里的同萌们可能会方便很多,最简实现如下(Python3.6.2):importmatplotlib.pyplotaspltimportnumpyasnpplt.ion()#开启interactivemodex=np.linspace(0,50,1000)pl......
  • 百度开源网关BFE源代码阅读
    BFE是一个非常强大的七层负载均衡,与其他负载均衡存在一些显著的差异(Product,GSLB等概念),也因为这些差异所以对于没有阅读其代码的用户在入门阶段非常的不友好,再者就是官方文档仅是一个查阅文档,这个查阅文档会的看得懂,不会的看不懂,对于教会用户怎么用实在是没有太多的帮助,所以笔......
  • R语言混合图形模型MGM的网络可预测性分析|附代码数据
    原文链接:http://tecdat.cn/?p=18279 最近我们被客户要求撰写关于混合图形模型MGM的研究报告,包括一些图形和统计输出。网络模型已经成为抽象复杂系统,是深入了解许多科学领域中观测变量之间的关系模式的流行方法。这些应用程序大多数集中于分析网络的结构。但是,如果不是直接观察......
  • R语言统计学DOE实验设计:用平衡不完全区组设计(BIBD)分析纸飞机飞行时间实验数据|附代码
    全文链接:http://tecdat.cn/?p=31010原文出处:拓端数据部落公众号平衡不完全区组设计(BIBD)是一个很好的研究实验设计,具有从统计的角度看各种所需的特征。最近我们被要求撰写关于BIBD的研究报告,包括一些图形和统计输出。对于一个BIBD有K个观测,重复r次实验。还有第5参数lamda,记录其......
  • R语言武汉流动人口趋势预测:灰色模型GM(1,1)、ARIMA时间序列、logistic逻辑回归模型|附代
    全文链接:http://tecdat.cn/?p=32496原文出处:拓端数据部落公众号人口流动与迁移,作为人类产生以来就存在的一种社会现象,伴随着人类文明的不断进步从未间断。人力资源是社会文明进步、人民富裕幸福、国家繁荣昌盛的核心推动力量。当前,我国经济正处于从以政府主导的投资驱动型的经......
  • SAS数据挖掘EM贷款违约预测分析:逐步Logistic逻辑回归、决策树、随机森林|附代码数据
    全文链接:http://tecdat.cn/?p=31745原文出处:拓端数据部落公众号最近我们被客户要求撰写关于贷款违约预测的研究报告,包括一些图形和统计输出。近几年来,各家商业银行陆续推出多种贷款业务,如何识别贷款违约因素已经成为各家商业银行健康有序发展贷款业务的关键。在贷款违约预测的......
  • 安卓代码规范(常见)
    安卓代码开发规范是一组指导原则和标准,旨在帮助开发团队保持一致的代码风格,提高代码的可读性、可维护性和可扩展性。以下是一些常见的安卓代码开发规范:命名规范:使用有意义的变量名、函数名和类名。使用驼峰命名法(CamelCase)。避免使用缩写,除非是广为人知的缩写。示例://......
  • appium+python安装配置及代码测试完整流程
    1.appium安装及环境配置2.模拟器安装或者直接连接真机也可以3.手机各配置参数获取platformName'、'platformVersion'、appActivity、deviceName、webdriver.Remote 4.代码运行测试,启动手机应用5.进阶版,代码为POM模式......