通过三角形相似原理实现单目测距

      根据三角形相似原理计算相机焦距,公式为:F = (P * D) / W

      其中:

      F: 待求的相机的焦距

      P: 图像中目标的宽度,单位像素

      D: 真实目标与相机的距离,单位厘米

      W: 真实目标的宽度,单位厘米

      计算焦距前,首先要有一幅带目标的图像,这里以人脸为例,记下采集此幅图像时,相机与人脸的实际距离D,真实人脸的宽度W,通过HaarCascade计算人脸在图像中的宽度P。

      获取相机焦距后,再根据公式:D' = (F * W) / P 即可计算出此目标与相机的实时距离。

      测试代码如下:

namespace {bool calculate_image_face_width(cv::CascadeClassifier& face_cascade, const char* image_name, int& P)
{cv::Mat bgr = cv::imread(image_name, 1);if (!bgr.data) {std::cerr << "Error: fail to imread: " << image_name << "\n";return false;}cv::Mat gray;cv::cvtColor(bgr, gray, cv::COLOR_BGR2GRAY);cv::equalizeHist(gray, gray);std::vector<cv::Rect> faces;face_cascade.detectMultiScale(gray, faces);//for (auto i = 0; i < faces.size(); ++i)//	cv::rectangle(bgr, faces[i], cv::Scalar(255, 0, 0), 1);//cv::imwrite("../../../data/result.jpg", bgr);if (faces.size() != 1) {std::cerr << "Error: faces size: " << faces.size() << "\n";return false;}P = faces[0].width;return true;
}inline int  calculate_focal_length(int P, int D, int W)
{return ((P * D) / W);
}inline int calculate_distance(int F, int W, int P)
{return ((F * W) / P);
}} // namespaceint test_monocular_ranging_face_triangle_similarity()
{
#ifdef _MSC_VERconstexpr char* file_name{ "../../../data/haarcascade_frontalface_alt.xml" };constexpr char* image_name{ "../../../data/images/face/1.jpg" };
#elseconstexpr char* file_name{ "data/haarcascade_frontalface_alt.xml" };constexpr char* image_name{ "data/images/face/1.jpg" };
#endifcv::CascadeClassifier face_cascade;if (!face_cascade.load(file_name)) {std::cerr << "Error: fail to load file:" << file_name << "\n";return -1;}auto P{ 0 };if (!calculate_image_face_width(face_cascade, image_name, P)) {std::cerr << "Error: fail to get_image_face_width\n";return -1;}std::cout << "the width of the face in the image: " << P << " pixels\n";constexpr int D{ 60 }, W{ 18 }; // cmconst auto F = calculate_focal_length(P, D, W);std::cout << "focal length: " << F << "\n";cv::VideoCapture cap(1); // usb cameraif (!cap.isOpened()) {std::cerr << "Error: fail to open capture\n";return -1;}cv::Mat gray;constexpr char* winn_ame{ "Monocular Ranging" };cv::namedWindow(winn_ame, 1);const std::string text{ "Distance = " };for (;;) {cv::Mat frame;cap >> frame; // get a new frame from cameracv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);cv::equalizeHist(gray, gray);std::vector<cv::Rect> faces;face_cascade.detectMultiScale(gray, faces);for (auto i = 0; i < faces.size(); ++i) {cv::rectangle(frame, faces[i], cv::Scalar(255,0,0), 1);P = faces[i].width;auto D2 = calculate_distance(F, W, P) / 100.; // mauto tmp = std::to_string(D2);auto pos = tmp.find(".");if (pos != std::string::npos)tmp = tmp.substr(0, pos+3);std::string content = text + tmp + " m";cv::putText(frame, content, cv::Point(faces[i].x, faces[i].y - 25), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255), 1);}cv::imshow(winn_ame, frame);if (cv::waitKey(30) >= 0)break;}return 0;
}

      说明

      (1).通过OpenCV的cv::CascadeClassifier检测人脸;

      (2).函数calculate_image_face_width用于计算人脸在图像中的宽度;

      (3).函数calculate_focal_length用于计算相机焦距;

      (4).函数calculate_distance用于计算人脸与相机的距离。

      执行结果截图如下所示:原始图像来自于网络

      GitHub:https://github.com/fengbingchun/NN_Test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/7741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

太原理工大学Python数据分析原理与应用(课外考题:8~11章)

这部分大概只考10分&#xff0c;且大部分出在选择题&#xff0c;填空最多一两个 (仅供参考) 第十章 (理解概念为主&#xff0c;无需看推导过程) 第十一章

QGraphicsView实现简易地图10『自适应窗口大小』

前文链接&#xff1a;QGraphicsView实现简易地图9『层级缩放显示底图』 自适应窗口大小 当地图窗口放大或缩小的时候&#xff0c;需要地图能够动态覆盖整个视口。 1、动态演示效果 2、核心代码 注&#xff1a;WHMapView继承自MapViewvoid WHMapView::resize() {if (m_curLev…

毕业就业信息|基于Springboot+vue的毕业就业信息管理系统的设计与实现(源码+数据库+文档)

毕业就业信息管理系统 目录 基于Springboot&#xff0b;vue的毕业就业信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1学生信息管理 2 公司信息管理 3公告类型管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设…

C语言----汉诺塔问题

1.什么是汉诺塔问题 简单来说&#xff0c;就是有三个柱子&#xff0c;分别为A柱&#xff0c;B柱&#xff0c;C柱。其中A柱从上往下存放着从小到大的圆盘&#xff0c;我们需要借助B柱和C柱&#xff0c;将A柱上的所有圆盘转移到C柱上&#xff0c;并且一次只能移动一个圆盘&#…

基于Springboot+Vue的Java项目-鲜牛奶订购系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

UE5自动生成地形二:自动生成插件

UE5自动生成地形二&#xff1a;自动生成插件 Polycam使用步骤 本篇主要讲解UE5的一些自动生成地形的插件 Polycam 此插件是通过现实的多角度照片自动建模生成地形数据&#xff0c;也是免费的。这里感谢B站up主古道兮峰的分享 Polycam网站 插件下载地址 插件网盘下载 提取码&a…

机器学习第二天(监督学习,无监督学习,强化学习,混合学习)

1.是什么 基于数据寻找规律从而建立关系&#xff0c;进行升级&#xff0c;如果是以前的固定算式那就是符号学习了 2.基本框架 3.监督学习和无监督式学习&#xff1a; 监督学习&#xff1a;根据正确结果进行数据的训练&#xff1b; 在监督式学习中&#xff0c;训练数据包括输…

Adobe系列软件安装

双击解压 先运行Creative_Cloud_Set_Up.exe。 完毕后&#xff0c;运行AdobeGenP.exe 先Path&#xff0c;选路径&#xff0c;如 C:\Program Files\Adobe 后Search 最后Patch。 关闭软件&#xff0c;修图&#xff01;

参数配置不生效导致海思1151芯片TPC功率超大,引起性能恶化。

• 【Wi-Fi领域】【现网案例4】参数配置不生效导致海思1151芯片TPC功率超大&#xff0c;引起性能恶化。 【问题描述】XXX客户反馈OLT-HG8245W5-6T–Wi-Fi–WA8021V5-LAN-PC组网概率出现近距离测速只有20Mbps 【问题单】DTS2022101410914 【问题分析】 在客户反馈此问题后&#…

矩阵的压缩存储介绍

引入 概述 特殊矩阵的压缩 对称矩阵 三角矩阵 对角矩阵 稀疏矩阵 三元组存储 十字链表法 示例

KDTree空间搜索算法学习

目录 KDTree&#xff08;K-Dimensional Tree&#xff09;原理步骤空间索引建立例子[^1]回溯搜索例子[^2] 相关包案例[^3]数据KDTree 识别轨道衔接出行轨道衔接单车骑行范围分析结果保存 KDTree&#xff08;K-Dimensional Tree&#xff09;原理 将需要匹配的 K 维空间点建立 K …

数据分析必备:一步步教你如何用numpy改变数据处理(6)

介绍&#xff1a; NumPy 广播&#xff08;Broadcasting&#xff09;是指当两个形状不同的数组进行运算时&#xff0c;NumPy 有能力灵活地改变其中某个&#xff08;些&#xff09;数组的形状从而使得运算可以正常进行。 广播的规则主要包括以下几点&#xff1a; 当一个数组是一个…

互联网十万个为什么之什么是云计算

云计算是一种通过互联网提供计算资源和服务的技术。它允许用户随时随地访问和使用云平台上的数据、软件和硬件资源。在数字化时代&#xff0c;互联网已经成为基础设施。云计算使得数据中心能够像一台计算机一样去工作。通过互联网将算力以按需使用、按量付费的形式提供给用户&a…

Linux进程地址空间第三讲

至今为止&#xff0c; 我们所学到的大多数的知识&#xff0c; 包括语言&#xff0c; 数据结构&#xff0c; 动静态库等等的 都是在下面这3G&#xff0c; 也就是用户空间里的(进程等待&#xff0c; 信号之类的与内核有关的是在上面那1G里的) 所以对于我们来说&#xff0c; 我们…

【数据结构】链表经典OJ题目练习(2)

面试题 02.02. 返回倒数第 k 个节点 - 力扣&#xff08;LeetCode&#xff09; 思路1&#xff1a;先计算出链表的长度&#xff0c;在将链表中的值存在数组中&#xff0c;在返回第k个节点。 思路2&#xff1a;利用快慢指针&#xff0c;先让快指针走k步&#xff0c;在让快慢指针分…

多模态大模型学杂了能力反下降?新研究:MoE+通用专家解决冲突

微调&#xff0c;能让通用大模型更加适配具体的行业应用。 但现在&#xff0c;研究人员们却发现&#xff1a; 对多模态大模型做“多任务指令微调”&#xff0c;大模型可能会“学得多错得多”&#xff0c;因为不同任务之间的冲突&#xff0c;导致泛化能力下降。 △多模态指令微…

杭州恒生面试,社招,3年经验

你好&#xff0c;我是田哥 一位朋友节前去恒生面试&#xff0c;其实面试问题大部分都是八股文&#xff0c;但由于自己平时工作比较忙&#xff0c;完全没有时间没有精力去看八股文&#xff0c;导致面试结果不太理想&#xff0c;HR说节后通知面试结果&#xff08;估计是凉了&…

【软件测试】接口自动化测试面试题及详细答案

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【算法】数字接龙 走迷宫问题的一般处理思路

前言 其实走迷宫就是一个普普通通的深搜回溯嘛&#xff0c;但是我之前做的很多题都是在一个二维的地图上&#xff0c;只能上下左右四个方向走迷宫&#xff0c;在做数字接龙这道题的时候&#xff0c;相当于可以往8个方向走&#xff0c;虽然逻辑上不变&#xff0c;但按照我之前的…

[Maven]IDEA报错-xxx is referencing itself

在IDEA中&#xff0c;执行 mvn clean时报错xxx is referencing itself。 解决方案&#xff1a;https://stackoverflow.com/questions/64246267/maven-error-using-intellij-is-referencing-itself 具体做法&#xff1a;采用上图第二条&#xff0c;将父模块pom文件中的对子模块…