嵌入式学习第十七天
C语言小项目:
制作俄罗斯方块小游戏(全部)
主函数部分
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include "boarder.h"
#include "block.h"int cury = 1;
int curx = 16;
int curboxno = 0;
int nextboxno = 0;
int score = 0;int SetScore(void)
{char tmpbuff[1024] = {0};sprintf(tmpbuff, "%06d", score);strncpy(&gBoarder[BOARDER_HEIGHT/4*3][BOARDER_WIDTH/6*5-3], tmpbuff, 6);return 0;
}void handler(int signo)
{int i = 0;ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury+1, curx)){MoveBox(gBox, cury+1, curx);cury = cury+1;ShowMenu();}else {MoveBox(gBox, cury, curx);ShowMenu();//判断当前这4行是否都能被消除 for (i = 0; i < 4 && cury + i < BOARDER_HEIGHT-1; i++){if (CanClearLine(cury+i)){ClearLine(cury+i);score++;SetScore();ShowMenu();}}curboxno = nextboxno;CreateBox(gBox, nextboxno);ClearBox(gNextBox, BOARDER_HEIGHT/4-2, BOARDER_WIDTH/6*5-4);nextboxno = rand() % 19;CreateBox(gNextBox, nextboxno);MoveBox(gNextBox, BOARDER_HEIGHT/4-2, BOARDER_WIDTH/6*5-4);cury = 1;curx = 16;if (CanMoveBox(gBox, cury, curx)){MoveBox(gBox, cury, curx);ShowMenu();}else {exit(0);}}alarm(1);return;
}int main(void)
{char ch = 0;signal(SIGALRM, handler);system("stty -echo");system("stty -icanon min 1");srand(time(NULL));InitBoarder();SetBoarder();SetScore();curboxno = rand() % 19;CreateBox(gBox, curboxno);MoveBox(gBox, cury, curx);nextboxno = rand() % 19;CreateBox(gNextBox, nextboxno);MoveBox(gNextBox, BOARDER_HEIGHT/4-2, BOARDER_WIDTH/6*5-4);ShowMenu();alarm(1);while (1){ch = getchar();if ('a' == ch || 'A' == ch){ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury, curx-2)){MoveBox(gBox, cury, curx-2);ShowMenu();curx -= 2;}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('w' == ch || 'W' == ch){ClearBox(gBox, cury, curx);CreateBox(gChangeBox, GetChangeBoxNo(curboxno));if (CanMoveBox(gChangeBox, cury, curx)){MoveBox(gChangeBox, cury, curx);memcpy(gBox, gChangeBox, sizeof(gChangeBox));curboxno = GetChangeBoxNo(curboxno);ShowMenu();}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('d' == ch || 'D' == ch){ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury, curx+2)){MoveBox(gBox, cury, curx+2);ShowMenu();curx += 2;}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('s' == ch || 'S' == ch){ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury+1, curx)){MoveBox(gBox, cury+1, curx);ShowMenu();cury += 1;}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('p' == ch || 'P' == ch){alarm(0);}else if ('c' == ch || 'C' == ch){alarm(1);}else if ('q' == ch){exit(0);}}return 0;
}
游戏界面部分
/* 游戏界面的宽度 */
#define BOARDER_WIDTH 60/* 游戏界面的高度 */
#define BOARDER_HEIGHT 30extern unsigned char gBoarder[BOARDER_HEIGHT][BOARDER_WIDTH];
extern int InitBoarder(void);
extern int SetBoarder(void);
extern int ShowMenu(void);
extern int CanClearLine(int LineNo);
extern int ClearLine(int LineNo);
/************************************************************ * 文件名:boarder.c * 功能: 游戏界面相关功能* ************************************************************/#include <stdio.h>
#include "boarder.h"/* 游戏界面的数据内容 */
unsigned char gBoarder[BOARDER_HEIGHT][BOARDER_WIDTH];/* 初始化游戏界面数组内容 */
int InitBoarder(void)
{int i = 0;int j = 0;//1.对所有的元素都赋值为' 'for (j = 0; j < BOARDER_HEIGHT; j++){for (i = 0; i < BOARDER_WIDTH; i++){gBoarder[j][i] = ' ';}}return 0;
}/* 游戏界面加入边框 */
int SetBoarder(void)
{int i = 0;int j = 0;//1.第一行赋值为'#'for (i = 0; i < BOARDER_WIDTH; i++){gBoarder[0][i] = '#';}//2.最后一行赋值为'#'for (i = 0; i < BOARDER_WIDTH; i++){gBoarder[BOARDER_HEIGHT-1][i] = '#';}//3.第一列赋值为'#'for (j = 0; j < BOARDER_HEIGHT; j++){gBoarder[j][0] = '#';gBoarder[j][1] = '#';}//4.最后一列赋值为'#'for (j = 0; j < BOARDER_HEIGHT; j++){gBoarder[j][BOARDER_WIDTH-1] = '#';gBoarder[j][BOARDER_WIDTH-2] = '#';}//5.界面中间选择一列赋值为'#',作为游戏区域和其他功能区域的划分for (j = 0; j < BOARDER_HEIGHT; j++){gBoarder[j][BOARDER_WIDTH/3*2-2] = '#';gBoarder[j][BOARDER_WIDTH/3*2-1] = '#';}//6.游戏界面有方一行的一部分赋值为'#'for (i = BOARDER_WIDTH/3*2; i < BOARDER_WIDTH; i++){gBoarder[BOARDER_HEIGHT/2][i] = '#';}return 0;
}/* 游戏界面的显示 */
int ShowMenu(void)
{int i = 0;int j = 0;printf("\033[2J");for (j = 0; j < BOARDER_HEIGHT; j++){for (i = 0; i < BOARDER_WIDTH; i++){if ('#' == gBoarder[j][i]){printf("\033[41;31m%c\033[0m", gBoarder[j][i]);}else if ('[' == gBoarder[j][i] || ']' == gBoarder[j][i]){printf("\033[40;30m%c\033[0m", gBoarder[j][i]);}else{printf("%c", gBoarder[j][i]);}}printf("\n");}return 0;
}int CanClearLine(int LineNo)
{int i = 0;for (i = 2; i < BOARDER_WIDTH/3*2-2; i++){if (' ' == gBoarder[LineNo][i]){return 0;}}return 1;
}int ClearLine(int LineNo)
{int i = 0;int j = 0;for (j = LineNo; j > 1; j--){for (i = 2; i < BOARDER_WIDTH/3*2-2; i++){gBoarder[j][i] = gBoarder[j-1][i];}}return 0;
}
功能部分
extern unsigned char gBox[4][8];
extern unsigned char gChangeBox[4][8];
extern unsigned char gNextBox[4][8];extern int InitBox(unsigned char (*pBox)[8]);
extern int CreateBox(unsigned char (*pBox)[8], int BoxNo);
extern int CanMoveBox(unsigned char (*pBox)[8], int y, int x);
extern int MoveBox(unsigned char (*pBox)[8], int y, int x);
extern int ClearBox(unsigned char (*pBox)[8], int y, int x);
extern int GetChangeBoxNo(int No);
/************************************************************ * 文件名:block.c * 功能: 俄罗斯方块功能* ************************************************************/#include <stdio.h>
#include "block.h"
#include "boarder.h"/* 俄罗斯方块数据 */
unsigned char gBox[4][8];/* 俄罗斯方块变形后数据 */
unsigned char gChangeBox[4][8];/* 俄罗斯方块下一个方块数据 */
unsigned char gNextBox[4][8];/* 初始化俄罗斯方块内容 */
int InitBox(unsigned char (*pBox)[8])
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){pBox[j][i] = ' ';}}return 0;
}/* 俄罗斯方块变形规则 */
int GetChangeBoxNo(int No)
{int DstNo = -1;switch (No){case 0:DstNo = 1;break;case 1:DstNo = 0;break;case 2:DstNo = 2;break;case 3:DstNo = 4;break;case 4:DstNo = 5;break;case 5:DstNo = 6;break;case 6:DstNo = 3;break;case 7:DstNo = 8;break;case 8:DstNo = 9;break;case 9:DstNo = 10;break;case 10:DstNo = 7;break;case 11:DstNo = 12;break;case 12:DstNo = 13;break;case 13:DstNo = 14;break;case 14:DstNo = 11;break;case 15:DstNo = 16;break;case 16:DstNo = 15;break;case 17:DstNo = 18;break;case 18:DstNo = 17;break;}return DstNo;
}/* 创建俄罗斯方块图形 */
int CreateBox(unsigned char (*pBox)[8], int BoxNo)
{int i = 0;int j = 0;InitBox(pBox);if (0 == BoxNo){//[][][][]//////for (i = 0; i < 8; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}}else if (1 == BoxNo){//[]//[]//[]//[]for (j = 0; j < 4; j++){pBox[j][0] = '[';pBox[j][1] = ']';}}else if (2 == BoxNo){//[][]//[][]////for (j = 0; j < 2; j++){for (i = 0; i < 4; i++){pBox[j][i] = (i % 2 == 0 ? '[' : ']');}}}else if (3 == BoxNo){//[][]//[]//[]//for (j = 0; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}pBox[0][2] = '[';pBox[0][3] = ']';}else if (4 == BoxNo){//[][][] // []////for (i = 0; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}pBox[1][4] = '[';pBox[1][5] = ']';}else if (5 == BoxNo){// []// []//[][]//for (j = 0; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}pBox[2][0] = '[';pBox[2][1] = ']';}else if (6 == BoxNo){//[]//[][][]////for (i = 0; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}pBox[0][0] = '[';pBox[0][1] = ']';}else if (7 == BoxNo){//[][]// []// []//for (j = 0; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}pBox[0][0] = '[';pBox[0][1] = ']';}else if (8 == BoxNo){// []//[][][] ////for (i = 0; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}pBox[0][4] = '[';pBox[0][5] = ']';}else if (9 == BoxNo){//[]//[]//[][]//for (j = 0; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}pBox[2][2] = '[';pBox[2][3] = ']';}else if (10 == BoxNo){//[][][]//[]////for (i = 0; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}pBox[1][0] = '[';pBox[1][1] = ']';}else if (11 == BoxNo){// []//[][][]////for (i = 0; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}pBox[0][2] = '[';pBox[0][3] = ']';}else if (12 == BoxNo){//[]//[][]//[]//for (j = 0; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}pBox[1][2] = '[';pBox[1][3] = ']';}else if (13 == BoxNo){//[][][]// []////for (i = 0; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}pBox[1][2] = '[';pBox[1][3] = ']';}else if (14 == BoxNo){// []//[][]// []//for (j = 0; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}pBox[1][0] = '[';pBox[1][1] = ']';}else if (15 == BoxNo){//[]//[][]// []//for (j = 0; j < 2; j++){pBox[j][0] = '[';pBox[j][1] = ']';}for (j = 1; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}}else if (16 == BoxNo){// [][]//[][]////for (i = 2; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}for (i = 0; i < 4; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}}else if (17 == BoxNo){// []//[][]//[]//for (j = 1; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}for (j = 0; j < 2; j++){pBox[j][2] = '[';pBox[j][3] = ']';}}else if (18 == BoxNo){//[][]// [][]////for (i = 0; i < 4; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}for (i = 2; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}}return 0;
}/* 判断俄罗斯方块是否能够移动到指定游戏界面位置 */
int CanMoveBox(unsigned char (*pBox)[8], int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if ((pBox[j][i] == '[' || pBox[j][i] == ']') && (gBoarder[j+y][i+x] != ' ')){return 0;}}}return 1;
}/* 将俄罗斯方块移动到游戏界面中 */
int MoveBox(unsigned char (*pBox)[8], int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if (pBox[j][i] == '[' || pBox[j][i] == ']'){gBoarder[j+y][i+x] = pBox[j][i];}}}return 0;
}/* 将俄罗斯方块从游戏界面中清除 */
int ClearBox(unsigned char (*pBox)[8], int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if (pBox[j][i] == '[' || pBox[j][i] == ']'){gBoarder[j+y][i+x] = ' ';}}}return 0;
}
完成后成果图:
相关文章:

嵌入式学习第十七天
C语言小项目: 制作俄罗斯方块小游戏(全部) 主函数部分 #include <stdio.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <stdlib.h> #include <time.h> #include "b…...

使用Python的Turtle模块简单绘制烟花效果
import turtle import random# 初始化屏幕 screen turtle.Screen() screen.bgcolor("black") screen.title("烟花模拟")# 创建一个Turtle来绘制烟花 firework turtle.Turtle() firework.hideturtle() firework.speed(0) # 设置绘图速度为最快# 绘制烟花…...

数学建模-退火算法和遗传算法
退火算法和遗传算法 一.退火算法 退火算法Matlab程序如下: [W]xlsread(D:100个目标经度纬度);>> x[W(:,1)];>> y[W(:,2)];>> w[x y];;d1[70, 40];>> w[d1;w;d1]ww*pi/180;%角度化成弧度dzeros(102);%距离矩阵初始化for i1:101…...

Qt开源版 vs 商业版 详细比较!!!!
简单整理Qt开源版与商业版有哪些差别,仅供参考。 简单对比 开源版商业版许可证大部分采用对商业使用不友好的LGPLv3具备商业许可证保护代码专有许可证相关大部分模块使用LGPLv3和部分模块使用GPL组成仅第三方开源组件使用Qt的其他许可证Qt模块功能支持支持技术支持…...

华为云CodeArts Snap荣获信通院优秀大模型案例及两项荣誉证书
2024年1月25日,中国人工智能产业发展联盟智能化软件工程工作组(AI for Software Engineering,下文简称AI4SE)在京召开首届“AI4SE创新巡航”活动。在活动上,华为云大模型辅助系统测试代码生成荣获“2023AI4SE银弹优秀案…...

小程序的应用、页面、组件生命周期(超全版)
小程序生命周期 应用的生命周期 onLaunch: 初始化小程序完成时触发,且全局只触发一次; onShow: 小程序初始化完成(启动)或从后台切换到前台显示时触发; onHide: 小程序从前台切换到后台隐藏时触发(如切换…...

TCP四次握手
TCP 协议在关闭连接时,需要进行四次挥手的过程,主要是为了确保客户端和服务器都能正确地关闭连接。 # 执行流程 四次挥手的具体流程如下: 客户端发送 FIN 包:客户端发送一个 FIN 包,其中 FIN 标识位为 1,…...

EBC金融英国CEO:高波动性周期下,如何寻找市场的稳定性?
利率主导的市场,将在2024年延续。目前,固收市场对于降息的定价,正通过利率传导至不同资产中。尽管市场迫切利用通胀去佐证降息,但各国央行仍囿于通胀目标的政策桎梏。政策和市场预期的博弈将继续牵动市场脉搏,引发价格…...

C++ Web 编程
什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下:公共网关接口(CGI&…...

docker笔记整理
Docker 安装 添加yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装docker yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin 启动docker systemctl start docker 查看docker状态 s…...

什么是git,怎样下载安装?
简介: 应用场景: 应用场景:团队企业开发 作用: 安装: 1.网址:Git - Downloads 很卡很慢 2.可以选择镜像网站下载(推荐) CNPM Binaries Mirror...

Camille-学习笔记-测试流程和测试设计
## 测试用例学习路线 startmindmap * 测试用例 ** 黑盒测试方法论 *** 等价类 *** 边界值 *** 因果图 *** 判定表 *** 场景法 *** 基于模型的测试 ** 白盒测试方法论 ** 测试用例基础概念 ** 测试用例设计 ** 面试测试用例设计 ** 常用测试策略与测试手段 endmindmap **测试用…...

【Python笔记-设计模式】建造者模式
一、说明 又称生成器,是一种创建型设计模式,使其能够分步骤创建复杂对象。允许使用相同的创建代码生成不同类型和形式的对象。 (一) 解决问题 对象的创建问题:当一个对象的构建过程复杂,且部分构建过程相互独立时,可…...

【LVGL源码移植】
LVGL源码移植 ■ LVGL源码移植一:下载LVGL源码二:修改LVGL文件夹1: 将这5个文件,复制到一个新的文件夹2: 简化文件,减少内存消耗(去除不必要的文件)3: 为了规范化,我们将下列文件进行重命名 三&…...

双非本科准备秋招(14.2)—— 进程与线程
进程 进程是运行着的程序,是程序在操作系统的一次执行过程,进程是操作系统分配资源的基本单位。 启动一个java程序,操作系统就会创建一个java进程 进程也可以看作一个程序的实例,大部分程序可以运行多个实例进程,比如记…...

数据结构和算法笔记5:堆和优先队列
今天来讲一下堆,在网上看到一个很好的文章,不过它实现堆是用Golang写的,我这里打算用C实现一下: Golang: Heap data structure 1. 基本概念 满二叉树(二叉树每层节点都是满的): 完全二叉树&a…...

第8章 SpringBoot任务管理
学习目标 熟悉SpringBoot整合异步任务的实现 熟悉SpringBoot整合定时任务的实现 熟悉SpringBoot整合邮件任务的实现 开发web应用时,多数应用都具备任务调度功能。常见的任务包括异步任务,定时任务和发邮件任务。我们以数据库报表为例看看任务调度如何帮助改善系统设计。报表可…...

Qt5 基于OpenGL实现六轴机械臂三维仿真
需求 在Qt中通过OPenGL方式加载三维模型STL文件,然后将多个结构的STL文件类型的模型进行组装,形成6轴机械臂三维模型的显示,并且可以对每个关节进行关节角度的控制。 新建一个C类STLFileLoader,用于加载STL文件,并进…...

路由进阶
文章目录 1.路由的封装抽离2.声明式导航 - 导航链接3.声明式导航-两个类名自定义匹配的类名 4.声明式导航 - 跳转传参查询参数传参动态路传参两种传参方式的区别动态路由参数可选符 5.Vue路由 - 重定向6.Vue路由 - 4047.Vue路由 - 模式设置8.编程式导航 - 两种路由跳转9.编程式…...

分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别
分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCN-Adaboost随机配置网…...

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextPicker组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextPicker组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、TextPicker组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不…...

linux中vim的操作
(码字不易,关注一下吧w~~w) 命令模式: 当我们按下esc键时,我们会进入命令模式;当使用vi打开一个文件时也是进入命令模式。 光标移动: 1 保存退出:ZZ 2 代码格式化:ggG 3 光标移动ÿ…...

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第5章 决策树
文章目录 第5章 决策树5.1 决策树模型与学习5.1.1 决策树模型5.1.2 决策树与if-then规则5.1.3 决策树与条件概率分布5.1.4 决策树学习5.2 特征选择5.2.1 特征选择问题5.2.2 信息增益5.2.3 信息增益比5.3.1 ID3算法5.3.2 C4.5的生成算法5.4 决策树的剪枝5.5 CART算法5.5.1 CART生…...

【C++11(一)】列表初始化and右值引用
一、 统一的列表初始化 1.1 {}初始化 在C98中,标准允许 使用花括号{}对数组或者结构体元素 进行统一的列表初始值设定 C11扩大了用大括号 括起的列表(初始化列表)的使用范围 使其可用于所有的内置类型和 用户自定义的类型 使用初始化列表时…...

为什么SSL会握手失败?SSL握手失败原因及解决方案
随着网络安全技术的发展,SSL证书作为网站数据安全的第一道防线,被越来越多的企业选择。SSL证书使用的是SSL协议,而SSL握手是SSL协议当中最重要的一部分。当部署SSL证书时,如果服务器和客户端之间无法建立安全连接,就会…...

STM32——智能小车
STM32——智能小车 硬件接线 B-1A – PB0 B-1B – PB1 A-1A – PB2 A-1B – PB10 其余接线参考51单片机小车项目。 1.让小车动起来 motor.c #include "motor.h" void goForward(void) {// 左轮HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO…...

开源:基于Vue3.3 + TS + Vant4 + Vite5 + Pinia + ViewPort适配..搭建的H5移动端开发模板
vue3.3-Mobile-template 基于Vue3.3 TS Vant4 Vite5 Pinia ViewPort适配 Sass Axios封装 vconsole调试工具,搭建的H5移动端开发模板,开箱即用的。 环境要求: Node:16.20.1 pnpm:8.14.0 必须装上安装pnpm,没装的看这篇…...

缩略图保持加密(thumbnail-preserving encryption, TPE)的理论基础
这涉及到一些视觉心理学等方面知识: 1、参考文献: 云存储图像缩略图保持的加密研究进展(中国图像图形学报) 一些视觉心理学的研究为TPE的成功实现提供了理论基础。Potter(1975, 1976)的研究表明人类的视觉系统能够在100 ms内从一个新场景中提取出相应的语义信息;250 ms内…...

nodejs+vue+mysql校园失物招领网站38tp1
本高校失物招领平台是为了提高用户查阅信息的效率和管理人员管理信息的工作效率,可以快速存储大量数据,还有信息检索功能,这大大的满足了用户和管理员这两者的需求。操作简单易懂,合理分析各个模块的功能,尽可能优化界…...

GEDepth:Ground Embedding for Monocular Depth Estimation
参考代码:gedepth 出发点与动机 相机的外参告诉了相机在世界坐标系下的位置信息,那么可以用这个外参构建一个地面基础深度作为先验,后续只需要在这个地面基础深度先验基础上添加offset就可以得到结果深度,这样可以极大简化深度估…...