美文网首页
从数学角度分析图像中标记物的位置

从数学角度分析图像中标记物的位置

作者: Mr_Bluyee | 来源:发表于2018-07-03 10:38 被阅读39次

        利用opencv自带的traincascade,训练了两个模型,如下图所示的大的绿框与圆框识别的内容。

OpenCVDemo截图

        绿框识别的是整个橙色图案的内容,圆形焦点识别的是橙色图案的圆点以及一点点周边标记。先来看下白色字体显示的数据:

ScreenWidth、ScreenHeight表示屏幕的宽与高,因为是全屏显示图像,故图像的大小即为1920X1080。

用opencv的 CascadeClassifier 类(级联分类器)来检测视频流中的物体,主要使用detectMultiScale来进行图像的多尺度检测。检测到物体后,返回一组RectArray(若图像中有多个目标,则Array大小为识别到的目标数数目),RectArray内的Rect为识别框,包含图像的位置信息,和大小(Rect.x、Rect.y、Rect.width、Rect.height)。

RecogCenter_x、RecogCenter_y为绿框的中心像素坐标,值为像素点的位置,计算公式为:

RecogCenter_x = Rect.x + Rect.width/2 

RecogCenter_y = Rect.y + Rect.height/2

RecogArea为绿框的像素面积,可通过其面积的大小来判断摄像头与目标的相对高度,计算公式为:

RecogArea = Rect.width * Rect.height

Focus_x、Focus_y为绿框在图片中的百分比位置,用于判断摄像头在上方的位置。对于飞机小的晃动时,像素点位置变化比较明显(值比较大),而百分比的相对波动较小,更利于用来判断(忽略小波动)。计算公式为:

Focus_x = RecogCenter_x / ScreenWidth

Focus_y = RecogCenter_y / ScreenHeight

InsideRecogCenter_x、InsideRecogCenter_y为圆形准心框的像素位置,飞机落下时最后摄像头只能看到中间的圆点。计算公式为:

InsideRecogCenter_x = Rect.x + Rect.width/2 (该Rect为识别的圆形准心框的位置)

InsideRecogCenter_y =  Rect.y + Rect.height/2 (该Rect为识别的圆形准心框的位置)

同样的,InsideFocus_x、InsideFocus_y为圆形框在图片中的百分比位置,当飞机下落到识别不到绿框时,此标记发挥作用。计算公式为:

InsideFocus_x = InsideRecogCenter_x / ScreenWidth

InsideFocus_y = InsideRecogCenter_y / ScreenHeight

因为飞机要以正确的方向降落到充电平台上,故利用大小两个框的中心点的在屏上的相对位置来判断角度。在一张图片中,xy坐标系与通常的xy坐标系不同,像素位置(0,0)从左上角开始,横轴为x轴,从左往右递增,竖轴为y轴,自上而下也是递增。

以绿框的中心点为参考点,令RecogCenter_x、RecogCenter_y为坐标(x1,y1),令圆框的InsideRecogCenter_x、InsideRecogCenter_y为(x2,y2),则:

坐标之差Δx = x2 - x1 ,Δy = y2 - y1 ,

两点的距离 Δl = sqrt(pow(Δx,2) + pow(Δy,2))

计算角度angle = arcsin(Δy / Δl ),要注意到这里的角度信息,包含了y的正负信息,但是x的正负未考虑进去,所得到的角度还要做进一步的区分:

if (Δy > 0){

    if(Δx < 0) angle = PI - angle;

} else {

    if(Δx < 0) angle = -PI - angle;

}

这样才区分出了四象限不同的角度信息。再看最上面的图,这个角度是正确的降落角度,圆框在绿框的上方,此时x坐标相差不大,可视为相等,圆框的y坐标在绿框的上方,值是y2<y1(这是与普通坐标系不同的地方),故Δy为负,计算出的角度约为-90°。

相关文章

网友评论

      本文标题:从数学角度分析图像中标记物的位置

      本文链接:https://www.haomeiwen.com/subject/wqhduftx.html