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
Python 对于检测到的形状稍有变化的OpenCV,Hu力矩是否保持不变?_Python_Opencv_Image Processing_Colors_Object Detection - Fatal编程技术网

Python 对于检测到的形状稍有变化的OpenCV,Hu力矩是否保持不变?

Python 对于检测到的形状稍有变化的OpenCV,Hu力矩是否保持不变?,python,opencv,image-processing,colors,object-detection,Python,Opencv,Image Processing,Colors,Object Detection,在下面,您可以看到一组属于同一对象的二进制形状,这些形状在视频中根据颜色作为主要特征表示被检测到。 由于我在检测中依赖于对象的颜色,因此在二值遮罩图像中可能会出现其他不相关的对象,因为它们与感兴趣的目标对象具有相似的颜色分布(例如,要检测的对象是红色汽车或绿色汽车) 我试图根据面积和纵横比来区分对象。然而,它并没有有效地工作,因为有其他检测到的不相关对象,它们的面积和纵横比与待检测对象的边界有关,如下图所示 在目标对象上方的图像中,是顶部的白色斑点 由于ti照明效果很难保持颜色一致性,因此我

在下面,您可以看到一组属于同一对象的二进制形状,这些形状在视频中根据颜色作为主要特征表示被检测到。

由于我在检测中依赖于对象的颜色,因此在二值遮罩图像中可能会出现其他不相关的对象,因为它们与感兴趣的目标对象具有相似的颜色分布(例如,要检测的对象是红色汽车或绿色汽车)

我试图根据面积和纵横比来区分对象。然而,它并没有有效地工作,因为有其他检测到的不相关对象,它们的面积和纵横比与待检测对象的边界有关,如下图所示

在目标对象上方的图像中,是顶部的白色斑点

由于ti照明效果很难保持颜色一致性,因此我尝试使用附加功能(如Hu矩)来区分感兴趣的对象,因为Hu矩对给定形状具有比例、位置和旋转不变性

如您所见,从视频的不同帧捕获的一组遮罩(参见第一幅图像)彼此略有不同

那么,尽管形状略有变化,Hu力矩是否会有所不同?如果它们保持不变,我如何使用它们作为附加属性,使检测更加准确?

我计算了不同帧的7 Hu力矩,结果是:

HuMoments
[[ 2.08520054e-01]
[ 1.69631372e-02]
[ 7.21551810e-05]
[ 6.90080950e-06]
[ 1.42410779e-12]
[-1.68289072e-07]
[-1.53980330e-10]]
HuMoments
[[ 2.06895709e-01]
[ 1.60840647e-02]
[ 3.30558368e-06]
[ 1.11390263e-07]
[-6.73641826e-14]
[ 1.41245011e-08]
[-5.54413536e-15]]
HuMoments
[[ 2.13862698e-01]
[ 1.92304207e-02]
[ 1.59852416e-06]
[ 3.25416763e-07]
[ 2.14353017e-13]
[ 1.50649139e-08]
[-9.55954816e-14]]
HuMoments
[[ 2.14002398e-01]
[ 1.92008910e-02]
[ 4.97181458e-06]
[ 4.78948215e-07]
[ 3.76015109e-13]
[-3.15822288e-08]
[-6.36277450e-13]]
HuMoments
[[ 2.06781829e-01]
[ 1.61130389e-02]
[ 8.62252599e-06]
[ 2.40464402e-07]
[ 2.97886471e-13]
[ 3.07837011e-09]
[-1.76507042e-13]]
HuMoments
[[ 2.05995932e-01]
[ 1.60756861e-02]
[ 7.67493642e-07]
[ 9.51817986e-08]
[ 2.14701063e-14]
[-3.25280940e-09]
[-1.41721342e-14]]
HuMoments
[[ 2.05805316e-01]
[ 1.54879330e-02]
[ 1.22114797e-04]
[ 1.25265644e-05]
[ 8.26008946e-11]
[-2.83389042e-07]
[-4.82914455e-10]]
HuMoments
[[ 2.09471113e-01]
[ 1.72160248e-02]
[ 2.20128873e-05]
[ 1.49897869e-06]
[-2.30866693e-12]
[-1.57913774e-07]
[-8.29529391e-12]]
HuMoments
[[2.15147844e-01]
[1.93443753e-02]
[8.08244156e-06]
[3.97563367e-06]
[2.20658357e-11]
[5.52855740e-07]
[4.58034173e-12]]
HuMoments
[[2.15429849e-01]
[1.93910849e-02]
[3.17392350e-05]
[1.45996626e-05]
[3.13970937e-10]
[1.99024297e-06]
[1.38642988e-11]]
HuMoments
[[ 2.11382574e-01]
[ 1.77909581e-02]
[ 2.79886054e-06]
[ 4.41359415e-06]
[ 1.53146745e-11]
[ 5.02198776e-07]
[-2.46891717e-12]]
HuMoments
[[2.12028845e-01]
[1.81061901e-02]
[1.15214622e-05]
[4.73220650e-06]
[3.35997756e-11]
[6.36751845e-07]
[9.59204224e-12]]
HuMoments
[[ 2.10406753e-01]
[ 1.72785541e-02]
[ 5.29421210e-06]
[ 9.58072012e-08]
[-2.65557753e-14]
[-1.25685175e-08]
[ 6.28538516e-14]]
HuMoments
[[2.17360183e-01]
[2.02630904e-02]
[6.14574197e-05]
[9.08990258e-06]
[2.13670968e-10]
[1.27309750e-06]
[2.24332748e-11]]
HuMoments
[[ 2.14532303e-01]
[ 1.87193203e-02]
[ 4.37330273e-05]
[ 5.07043463e-06]
[ 5.19617629e-11]
[-8.75846866e-08]
[-5.47804462e-11]]
提前谢谢

对于下面的测试,是不同时间戳的对象掩码的图像,有无无关对象,以及一个原始图像


您可以尝试使用许多形状特征

在你的案例中,Hu时刻当然值得一试。与大多数特征一样,当形状发生少量变化时,它们会发生少量变化,而当形状变化更强烈时,它们会发生更强烈的变化。但是,此语句仅适用于连续域。在离散域中,我们有一组近似于被成像对象的像素,这组像素的形状随(亚像素)平移、旋转和缩放而变化。对象越小,这些变化带来的相对差异就越大

Hu力矩基于高达三阶的中心力矩计算。阶数越高,力矩随微小变化而变化越大。高阶矩对噪声更敏感

前两个Hu矩仅使用二阶中心矩,因此比其他Hu矩对噪声的敏感度更低,更适合于非常小的对象。二阶矩描述形状的最佳拟合椭圆。因此,前两个Hu矩将形状描述为椭圆:延伸率和与椭圆的相似性

您应该添加到该集合中的其他特征是面积,可能还有凸度或坚固度,以及(特别是与正方形的相似性似乎相关)


您必须围绕理想值设置一些阈值,您应该从一组示例形状中确定这些阈值。

@k.jbaili:的确,我没有想到这一点。我已经更新了我的答案。@k.jbaili:这就是添加多个功能的目的:使用的功能越多,约束接受的对象越多。形状需要符合每个阈值,而不仅仅是一个阈值。仅尺寸是不够的,但尺寸加上一些形状特征是不够的。请注意,形状本身无法区分大小合适的矩形和大得多的矩形。根据Podczeck的说法,第一幅图像中的两个形状将具有不同的矩形度量。
@k.jbaili
第一个Podczeck形状(数字0)a/(w*h),这是一种矩形度量,是我之前在你的另一篇文章中向你建议的。a是轮廓的面积,w*h是其边界框的面积。因此,请尝试对a/(w*h)@k.jbaili定义的轮廓面积和矩形进行过滤:立体度通常定义为面积与凸包面积之比。凸面外壳可以(通常)小于边界框。因此,它可以测量它与凸面形状的接近程度。矩形度测量它与矩形的距离。坚固度使用分母中凸包的面积。矩形使用分母中的边界框区域。矩形意味着它离一个完整的矩形有多近。坚固性意味着它离一个完整的凸面外壳有多近。请参阅,在有人发布答案后,请不要更改您的问题。你完全否定了我的答案,让我看起来像是在告诉你你已经知道的事情,而不是回答你的问题。相反,接受你得到的答案,写一个新问题。如果你点击“编辑”链接,你可以取回新问题,复制粘贴到新帖子中。如果你发布新问题,一定要包括你用来计算矩形度的代码,这可能是错误的。@CrisLuengo为我的不一致感到抱歉。你写得太好了。我没有考虑过。我将发布一个新问题并留下一个tag@CrisLuengo. 我发了一个新帖子。希望能得到一些帮助