目前用的是红外光。OV7725摄像头拍照,然后程序找点。
距离远的时候,光点离屏幕中心应该越近。发现的问题是红外光点光斑比较大,导致光点中心落在屏幕上的坐标点位置有变动,在某些距离内,光点拉远反而落在屏幕中心的位置变远了。
想问下有没有什么好的处理办法解决。
目前我测的数据是红外光点RGB数据为(240,252,248)/在15-65cm内,所以程序里用了if找点
if((red==240)&&(green==252)&&(blue==248))
然后将320*240个像素点中是红外光的点,计算其坐标位置
m=x/320;
n=x%320;
因为光点是一个区域,所以要算出光点的中心位置;问题就是前面提到的,光点大,所以中心位置不好算,想问下有没有什么好的方法?
下面是网上找到的三角测距原理图。
找到光点中心,可以根据qx=fs算出距离q,问题在于焦距f是我手动调出来的,大小未知;s是红外发射管和摄像头中性轴的距离,显然也是未知数。
x可以根据找到的光点中心坐标和屏幕中心坐标(119.5,159.5)的位置算出来;q是待求的距离。
这里有好几个未知数,距离怎么算?
论坛里好像找不到三角测距的帖子,打了这4个关键字,只搜到2个帖子!!
是不是stm32f103做不了三角测距啊。
就这些疑问,多谢。
{
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); //在屏幕上画矩形框将光点圈起来
}
一周热门 更多>