STM32F103和OV7725做三角测距

2019-07-20 22:59发布

目前用的是红外光。OV7725摄像头拍照,然后程序找点。
距离远的时候,光点离屏幕中心应该越近。发现的问题是红外光点光斑比较大,导致光点中心落在屏幕上的坐标点位置有变动,在某些距离内,光点拉远反而落在屏幕中心的位置变远了。
想问下有没有什么好的处理办法解决。

目前我测的数据是红外光点RGB数据为(240,252,248)/在15-65cm内,所以程序里用了if找点
if((red==240)&&(green==252)&&(blue==248))

然后将320*240个像素点中是红外光的点,计算其坐标位置
m=x/320;  
n=x%320;


因为光点是一个区域,所以要算出光点的中心位置;问题就是前面提到的,光点大,所以中心位置不好算,想问下有没有什么好的方法?
下面是网上找到的三角测距原理图。
1.png
找到光点中心,可以根据qx=fs算出距离q,问题在于焦距f是我手动调出来的,大小未知;s是红外发射管和摄像头中性轴的距离,显然也是未知数。
x可以根据找到的光点中心坐标和屏幕中心坐标(119.5,159.5)的位置算出来;q是待求的距离。
这里有好几个未知数,距离怎么算?

论坛里好像找不到三角测距的帖子,打了这4个关键字,只搜到2个帖子!!
是不是stm32f103做不了三角测距啊。

就这些疑问,多谢。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
魔双月壁
1楼-- · 2019-07-21 00:08
关键程序是下面这个:for(x=0;x<76800;x++)//320*240=76800个像素点
                {
                        READ_FIFO_PIXEL(Camera_Data);                /* FIFO读摄像头数据 */
                        ILI9341_Write_Data(Camera_Data);        //LCD屏幕显示像素点
                        //RGB565分离出像素分量
                       red = (Camera_Data & RGB565_MASK_RED) >> 11;     
                       green = (Camera_Data & RGB565_MASK_GREEN) >> 5;     
                       blue = (Camera_Data & RGB565_MASK_BLUE);     
                       red <<= 3;  
                       green <<= 2;  
                       blue <<= 3;  

                        if((red>=200)&&(green==252)&&(blue==248))//找出红外光点
                                {
                                        m=x/320;  //算出光点的行列
                                        n=x%320;  
                                        if(m>a) a=m;
                                        if(m<b) b=m;  //确定最大最小行
                                        if(n>c) c=n;  //确定最大最小列
                                        if(n<d) d=n;                                                       
                                }
                }
        m=c-d+1;n=a-b+1;//算出光点区域的宽度和高度     对于矩形光斑比较适用,对于不规则光斑,可能会出现不准
        p=(float)b+n/2+n%2;q=(float)d+m/2+n%2;//算出光点的中心位置     问题就是这个方法不太好,光点比较规则这个办法可以  但有的目标上,光斑没啥规则       
        l=0.02025*sqrt((p-119.5)*(p-119.5)+(q-159.5)*(q-159.5));//算出光点中心离屏幕中心的距离 每个像素点宽度为0.02025cm    屏幕320*240

        printf("(%f,%f) %f ",p,q,l);        //打印
        ILI9341_DrawRectangle(d,b,m,n,0);  //在屏幕上画矩形框将光点圈起来
}

zhang313957217
2楼-- · 2019-07-21 01:41
有没有试过把红外光源换成激光光源试一下?
csmjmcc
3楼-- · 2019-07-21 03:33
这个好专业,无法回答你问题。不过不知道你是否有分析过小米激光扫地机器人的激光雷达,它就是用这方法去计算的。
liaoliaoliao
4楼-- · 2019-07-21 09:18
 精彩回答 2  元偷偷看……

一周热门 更多>