OpenCV实现单目尺寸估计的案例详解

这篇文章主要介绍了通过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实现单目尺寸估计的案例详解

基础教程推荐