Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 好的跟踪功能?无人机2_Opencv_Image Processing_Tracking_Shape_Detection - Fatal编程技术网

Opencv 好的跟踪功能?无人机2

Opencv 好的跟踪功能?无人机2,opencv,image-processing,tracking,shape,detection,Opencv,Image Processing,Tracking,Shape,Detection,我正在尝试从相机实现对象跟踪(只有一个相机,没有Z信息)。相机的分辨率为720*1280,但我通常会将其重新缩放到360*640以加快处理速度 这种跟踪是通过机器人摄像头完成的,我想要一个尽可能健壮的系统 我将列出我到目前为止所做的事情以及结果 我试着做颜色跟踪,我将图像转换到hsv颜色空间,做阈值处理,一些形态学变换,然后找到面积最大的对象。除非没有其他颜色相同的物体,否则这种方法可以对物体进行公平的跟踪。当我在寻找最大值的时候,如果有比我需要的物体更大的物体,机器人就会朝着更大的物体走去 然

我正在尝试从相机实现对象跟踪(只有一个相机,没有Z信息)。相机的分辨率为720*1280,但我通常会将其重新缩放到360*640以加快处理速度

这种跟踪是通过机器人摄像头完成的,我想要一个尽可能健壮的系统

我将列出我到目前为止所做的事情以及结果

  • 我试着做颜色跟踪,我将图像转换到hsv颜色空间,做阈值处理,一些形态学变换,然后找到面积最大的对象。除非没有其他颜色相同的物体,否则这种方法可以对物体进行公平的跟踪。当我在寻找最大值的时候,如果有比我需要的物体更大的物体,机器人就会朝着更大的物体走去
  • 然后,我决定跟踪特定颜色的圆圈对象。然而,在不同的角度下很难找到
  • 然后,我决定跟踪特定颜色的方形对象。我用过这个
  • 然后我检查了这个情况

    如果(约尺寸()>=4和约尺寸()0.85,纵横比介于0.85和1.15之间

    但结果并不像我预期的那么可靠,尤其是尺寸。如果有几个正方形,它就找不到需要的


    因此,现在我需要一些关于对象的哪些其他功能可以用来改进跟踪以及如何改进跟踪的建议?正如我前面多次提到的,主要问题之一是大小。我知道对象的大小。但是,我不确定如何利用它,因为我不知道对象的距离这就是为什么我不知道如何用像素表示来表示它的大小,这样我就可以消除任何其他不属于这个范围的斑点

    更新

    在第三步中,我描述了如何检测具有特定颜色的正方形。下面是我得到的示例

    我将此HSV系列用于红色:

    标量(250129,0)、标量(255255255)、OpenCV的inRange函数的参数

    HMIN=250,HMAX=255;SMIN=129,SMAX=255;VMIN=0,VMAX=255; (也希望看到您对调整此值的建议)

    因此,在这张图片中,你可以看到处理过程:高斯模糊(5*5), 形态闭合两次(5*5)。带有“结果”标签的图像显示跟踪对象(请看绿色方框)

    在第二帧中,您可以看到它无法检测到“红方块”。这两张图片之间唯一的主要区别是我弯下了笔记本的盖子(如果您没有注意到,请仔细看)。我想这是因为照明,这会导致阈值设置产生不期望的结果

    我能想到的唯一方法是对图像进行两种不同的处理。首先,像我上面所做的那样,根据颜色进行阈值处理。然后,如果我找到要移动到下一帧的对象。如果不使用该方法


    但是,这种方法将涉及对图像进行太多的处理。

    如果有一个模板是目标对象图像的图像,则尝试使用SIFT或SURF的特征匹配

    注1:可以使用灰度特征匹配,这可以缩短处理时间


    注2:您可以尝试其他回归方法,如人工神经网络,而不是RANSAC,正如您在需求中提到的,您只需要跟踪红色的平坦区域。因此,您已经有两个用于跟踪的特征:

    • 平坦地区
    • 红色
    下面是一个算法:

    • 检测图像中的平坦区域计算区域的方差。方差较低的区域可能是平坦区域
    • 如果其色调值接近红色,则将其分类为感兴趣的对象
    • 然后对相邻像素进行投票,以获得对象的精确二进制贴图
    您还可以尝试调整Harris角点检测器,以满足您的需要:

    在Harris角点检测器中,分数是通过使用2*2矩阵的特征值来确定的。如果两个特征值都很小,则意味着它是一个平坦区域。本OpenCV教程对此进行了很好的解释。然后,您可以使用颜色信息来细化已识别的平坦区域。它应该合理地处理透视变换。

    I若你们重新考虑你们的第二点,寻找带圆圈的物体,你们实际上应该寻找椭圆,因为它和物体的角度不同。为了在图片中检测椭圆,我复制了萨默斯·布拉姆哈特(Samarth Brahmbhatt)的《实用OpenCV》(Practical OpenCV)一书中的一段代码(你们应该在谷歌上找到)所用算法的原理是本文:

    因此,您建议使用SIFT或SURF检测具有纯色和特定形状的对象?使用特定图案优于纯色。但您可以尝试纯色。这种特征检测器检测图像中的特征点,并对这些点进行描述。纯色颜色表面没有(理论上)特征点(是恒定颜色表面),所以我不认为这是一个正确的解决方案。@goe我完全同意你的看法,那么你想要什么?纯色飞行机器人?你是否尝试过使用RGB颜色空间,并检查每个像素的红色层值是否大于其他颜色层值。此外,模糊图像可以减少某些区域的噪音。@goe不,我没有尝试在RGB上这样做,但是ye我也会尝试,但不确定。为了减少噪音,我会模糊图像。你有什么理由不使用标记或类似的东西吗?你能提供更多关于点1和点3的信息吗?在这种情况下,方差是什么?如何计算区域的方差?另外,关于点2,你有什么建议吗
           // Approximate contour with accuracy proportional
            // to the contour perimeter
            cv::approxPolyDP(
                    cv::Mat(contours[i]),
                    approx,
                    cv::arcLength(cv::Mat(contours[i]), true) * 0.02,
                    true
            );