OpenCV/C++:点线面相关计算
之前也有一篇笔记,都比较简单,做个记录,方便速查。
C++&OpenCV:三角形插值、线面的交点_六月的翅膀的博客-CSDN博客
目录
1、向量的模
2、两点间距离(两点间的向量模)
3、求线段中某点坐标
4、叉乘,平面法向量
5、线面交点
6、空间点到直线的距离
7、平面方程
1、向量的模
int main()
{Vec3f A = Vec3f(10, 10, 1);cout << "向量A的模 = " << norm(A) << endl;Vec3f B = Vec3f(3, 3, 1);cout << "向量B的模 = " << norm(B) << endl;return 0;
}
2、两点间距离(两点间的向量模)
int main()
{Vec3f A = Vec3f(10, 10, 1);Vec3f B = Vec3f(3, 3, 1);cout << "线段AB的长度为 = " << norm(A - B) << endl;//结果为6*根2return 0;
}
3、求线段中某点坐标
int main()
{Vec3f A = Vec3f(0, 10, 0);Vec3f B = Vec3f(0, 0, 0);Vec3f C = Vec3f(10, 0, 0);Vec3f M = Vec3f(3, 0, 0);float t = norm(M - C) / norm(B - C);Vec3f N = C + (A - C) * t;cout << "N点坐标为:" << N << endl;return 0;
}
4、叉乘,平面法向量
5、线面交点
int main()
{//需要知道直线上一点和其方向向量,平面一点及其法向量Vec3f A=Vec3f(0, 1, 1);Vec3f B=Vec3f(1, 0, 1);Vec3f O=Vec3f(0, 0, 0);Vec3f M=Vec3f(1, 1, 0);Vec3f N=Vec3f(0, 0, 1);Vec3f line = M-N;//线方向向量,这里谁减谁都行Vec3f plane = (A - O).cross(B - O);//平面两个向量叉乘就是法向量float den = plane.dot(line);//面法向量乘线方向向量float t = plane.dot(A - N) / den;//A是面上一点,用B也可以Vec3f p0 = N + line * t;//这里线上的点用的N,也可以用M,只要上面求t的时候也是用的M就可以cout << p0 << endl;return 0;
}
6、空间点到直线的距离
/// <summary>
///
/// </summary>
/// <param name="P">线外一点</param>
/// <param name="A">线上点</param>
/// <param name="B">线上点</param>
/// <returns></returns>
float getDist_P2L(Vec3f P, Vec3f A, Vec3f B)
{Vec3f PA = P - A;//线外点到线上一点的向量Vec3f Ldir = B - A;//直线的方向向量Vec3f Pnorm = PA.cross(Ldir);float S1 = norm(Ldir);float S2 = norm(Pnorm);return S2 / S1;
}int main()
{Vec3f A = Vec3f(1.0, 0, 0);Vec3f B = Vec3f(0.0, 1.0, 0);Vec3f P = Vec3f(0.5, 0.5, 3);float dis = getDist_P2L(P, A, B);cout << dis << endl;
}
7、平面方程
vector<Vec3f> input;
vector<float> coeffi;
void GetPanelEquation(vector<Vec3f>& point3fArray)
{if (point3fArray.size() < 3){cerr << "GetPanelEquation(...)函数中输入点的数量小于3." << endl;}float a,b,c,d;a = (point3fArray[1][1] - point3fArray[0][1])*(point3fArray[2][2] - point3fArray[0][2]) -(point3fArray[1][2] - point3fArray[0][2])*(point3fArray[2][1] - point3fArray[0][1]);b = (point3fArray[1][2] - point3fArray[0][2])*(point3fArray[2][0] - point3fArray[0][0]) -(point3fArray[1][0] - point3fArray[0][0])*(point3fArray[2][2] - point3fArray[0][2]);c = (point3fArray[1][0] - point3fArray[0][0])*(point3fArray[2][1] - point3fArray[0][1]) -(point3fArray[1][1] - point3fArray[0][1])*(point3fArray[2][0] - point3fArray[0][0]);d = 0 - (a * point3fArray[0][0] + b*point3fArray[0][1] + c*point3fArray[0][2]);coeffi.push_back(a);coeffi.push_back(b);coeffi.push_back(c);coeffi.push_back(d);
}int main()
{input.push_back(Vec3f(100, 0, 0));input.push_back(Vec3f(0, 100, 0));input.push_back(Vec3f(0, 0, 3));GetPanelEquation(input);cout << "平面方程为:"<< endl << coeffi[0] << " X + " << coeffi[1] << " Y + " << coeffi[2] << " Z + " << coeffi[3] << " = 0" << endl;if (abs(coeffi[3])>1e-6){cout << "平面方程为:" << endl << -coeffi[0] / coeffi[3] << " X + " << -coeffi[1] / coeffi[3] << " Y + " << -coeffi[2] / coeffi[3] << " Z = 1" << endl;}return 1;
}
8、两直线的交点
double r_xy12 = PointOnLine[0].x * PointOnLine[1].y - PointOnLine[1].x * PointOnLine[0].y;double r_x12 = PointOnLine[0].x - PointOnLine[1].x;double r_xy34 = PointOnLine[2].x * PointOnLine[3].y - PointOnLine[3].x * PointOnLine[2].y;double r_x34 = PointOnLine[2].x - PointOnLine[3].x;double r_y12 = PointOnLine[0].y - PointOnLine[1].y;double r_y34 = PointOnLine[2].y - PointOnLine[3].y;double fenmu = r_x12 * r_y34 - r_y12 * r_x34;GridPoint[i].x = (r_xy12 * r_x34 - r_x12 * r_xy34) / fenmu;GridPoint[i].y = (r_xy12 * r_y34 - r_y12 * r_xy34) / fenmu;
struct LinePara
{float k;float b;
};// 获取直线参数
void getLinePara(float& x1, float& y1, float& x2, float& y2, LinePara& LP)
{double m = 0;// 计算分子 m = x2 - x1;if (0 == m){LP.k = 10000.0;LP.b = y1 - LP.k * x1;}else{LP.k = (y2 - y1) / (x2 - x1);LP.b = y1 - LP.k * x1;}}// 获取交点
bool getCross(Point2f& p1, Point2f& p2, Point2f& p3, Point2f& p4, Point2f& pt) {LinePara para1, para2;getLinePara(p1.x, p1.y, p2.x, p2.y, para1);getLinePara(p3.x, p3.y, p4.x, p4.y, para2);pt.x = (para2.b - para1.b) / (para1.k - para2.k);pt.y = para1.k * pt.x + para1.b;// 判断是否平行 if (abs(para1.k - para2.k) > 0.5){pt.x = (para2.b - para1.b) / (para1.k - para2.k);pt.y = para1.k * pt.x + para1.b;return true;}else{return false;}}
OpenCV/C++:点线面相关计算相关推荐
- OpenCV, 名校机器学习相关课程
https://antkillerfarm.github.io/ OpenCV 参考资料 OpenCV是一套跨平台计算机视觉库.其官网为: http://opencv.org/ 安装方法: sudo ...
- OpenCV-Python实战(11)——OpenCV轮廓检测相关应用
OpenCV-Python实战(11)--OpenCV轮廓检测相关应用 0. 前言 1. 轮廓绘制 2. 轮廓筛选 3. 轮廓识别 4. 轮廓匹配 小结 系列链接 0. 前言 在计算机视觉领域,轮廓通 ...
- 使用OpenCV和Python高效计算视频的总帧数
使用OpenCV和Python高效计算视频的总帧数 1. 效果图 2. 源码 参考 这篇博客将介绍两种使用OpenCV和Python计算视频文件中帧数的方法. 超级快,它依靠OpenCV的视频属性功能 ...
- 北科大matlab,北科大matlab第五次作业多项式及其相关计算.doc
北科大matlab第五次作业多项式及其相关计算.doc <数学实验>报告实验名称多项式及其相关计算学院计算机与通信工程学院专业班级姓名学号2015年5月2一.[实验目的]1.学习多项式的拟 ...
- opencv 2d人脸姿态计算
opencv 2d人脸姿态计算 可以的: # -*- coding: utf-8 -*- # 测试使用opencv中的函数solvepnp import cv2 import numpy as np ...
- 计算机组成解疑补漏之SDR、DDR及相关计算
SDRAM的相关计算以及理解SDR和DDR: 关于SDR.DDR的理解 首先,SDR的全称是SDR SDRAM,但是两个SDR的意思是完全不同的! SDRAM:Syncronous Dynamic R ...
- 计算机网络:子网划分、子网掩码、CIDR 、路由聚合相关计算详解
目录 IPv4 的分类 IPv4 的划分 无分类编址CIDR IPv4 地址应用规划 IPv4 的分类 连接到 Internet 中的每一个主机(或路由器)都分配一个 32 比特的全球唯一的标识符,即 ...
- (*长期更新)软考网络工程师学习笔记——数据链路层与网络层的相关计算题
目录 前言 一.海明码校验码的计算 二.最小帧长的计算 三.求默认网关地址 四.网络地址.主机地址.广播地址的区分和求解 五.判断是否属于网络或子网的主机地址 六.子网划分和求子网掩码 七.子网范围和 ...
- OpenCV中直方图的计算和绘制
OpenCV中直方图的计算和绘制 主要记录一下几个关键的API: cvRound(输入一个浮点数 );//返回一个整型数,取整的方法为四舍五入 split(输入多通道图像,数组或者vector变量. ...
最新文章
- 菜鸟也玩WebMatrix
- python写excel标记文字颜色_python3使用xlwt时写入文档字体颜色和边框样式
- java 读取csv_Java读取CSV的常用方法 | 学步园
- 考研山东省的计算机学校有哪些,山东考研哪个学校好考
- c# word文档与二进制数据的相互转换
- C++ error: use of deleted function ‘std::atomic<short unsigned int>::atomic(const std::atomic<short
- linux实现普通用户只允许使用部分命令
- UI设计素材干货,字体设计灵感酷站
- C99标准的新特性介绍
- 计算机附件中的超级终端,windows10系统中附件中没有超级终端怎么解决
- 软件工程:第三章:可行性分析与需求分析
- 人脸识别接口_双目模组摄像头人脸识别技术中活体检测
- html导出excel加边框,利用js对象Blob导出的excel,有办法把表格的边框给浮现出来...
- android布局跑马灯,Android自定义跑马灯效果(适合任意布局)
- js如何获取当月第一天和最后一天
- Django发送电子邮件
- 5个可以让你事半功倍的Python自动化脚本
- Linux上如何测试服务器之间的通信
- 【服务器】nvidia驱动重装
- 使用SAS创建日历表
热门文章
- webAPP如何实现移动端拍照上传(Vue组件示例)?
- 云原生背景运维转型之SRE实践
- 程序员英语再渣也要会的单词
- 2013.06.23《语法-方式状语》
- 如何将微商相册上的所有图片和小视频快速下载和保存
- oracle与用友的差别,用友U9 PK SAP/Oracle:敢比就是赢
- 本周上榜的这9本原创技术书很赞,《数学之美》作者吴军博士新书霸榜
- 电机开环控制与闭环控制
- Unity3D 基于XLua框架实现Lua组件化开发方式(一)----基于C#调用Lua
- 【原创】基于SpringBoot的同城生鲜门店配送系统(SpringBoot配送系统毕业设计)