这篇文章主要介绍了通过OpenCV如何实现单目尺寸估计,文中的示例代码讲解详细,对我们学习和工作有一定的参考价值,感兴趣的可以了解一下
一个摄像头无法获取深度信息,两个摄像头双目标定可以实现双目测距。
但是我现在只有一个摄像头,如果想实现测量尺寸,我的思路:选一张固定尺寸的背景,例如一张A4纸,从图像中提取A4纸并进行透视变换进行图像矫正,A4纸的尺寸我可以确定,那么也可以确定图像中的物体长宽信息(高度忽略不计的情况,例如:卡片)。当摄像头距离目标物距离L,此时像素所占面积为S,那么理论上来说,目标物图像变化后的面积为S1,则距离L1=(L/S)*S1,假定目标物上面贴有很多个面积为1平方厘米的正方形贴纸,那么获取四个角点和四条边的信息通过算法可以获取出物体在深度方向上的偏移量。有想法就实践。
1.在地板上放一张A4纸随便放一些物体。利用opencv打开摄像头获取图像并显示。
2.转灰度图像
3.如果直接使用canny的画周围地板的线条不好去除,所以先二值化分割。
4.观察图像中存在噪点,使用中值滤波处理
5.使用canny进行边缘检测
6.使用累加器方法进行直线拟合
7.得到了四条线段,此时可以求交点,但是我这里为了方便直接角点检测
8.得到角点排序后进行透视变换
实现1-8效果代码:
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
double x_1[4];
double y_1[4];
double x_2[4];
double y_2[4];
double line_k[4];
double line_b[4];
int line_number=0;
// 获取交点
//void getCross()
//{
// for (int i = 0; i <line_number; i++)
// {
// for(int j=i+1;j<line_number;j++)
// {
// if(int(abs(line_k[i]))==0&&int(abs(line_k[j]))==0)
// {
// cout<<"i:"<<i<<" j:"<<j<<" is "<<" true"<<endl;
// }
// }
// }
/
本文标题为:OpenCV实现单目尺寸估计的案例详解
![](/xwassets/images/pre.png)
![](/xwassets/images/next.png)
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- C语言详解float类型在内存中的存储方式 2023-03-27
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言qsort()函数的使用方法详解 2023-04-26
- Qt计时器使用方法详解 2023-05-30
- Easyx实现扫雷游戏 2023-02-06
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- ubuntu下C/C++获取剩余内存 2023-09-18
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30