オブジェクトのモーション トラッキングを実行しており、オブジェクトの前後を識別しようとしています。オブジェクトは非対称です。これは、輪郭の重心が背面よりも前面に近いことを意味します。この情報を使用して、次のようにアプローチしています。
オブジェクトの輪郭を描く
重心を見つける
centroidx, centroidy = int(moments['m10']/moments['m00']), int(moments['m10']/moments['m00'])
境界楕円を描く
cv2.fitEllipse(contour)
次のように長軸の長さを計算します (および図に示すように)。
MAx, MAy = int(0.5 * ellipseMajorAxisx*math.sin(ellipseAngle)), int(0.5 * ellipseMajorAxisy*math.cos(ellipseAngle))
主軸の開始と終了の x、y 座標を計算します
MAxtop, MAytop = int(ellipseCentrex + MAx), int(ellipseCentrey + MAy) MAxbot, MAybot = int(ellipseCentrex - MAx), int(ellipseCentrey - MAy)
どの点が輪郭の重心に近いかを特定します
distancetop = math.sqrt((centroidx - MAxtop)**2 + (centroidy - MAytop)**2) distancebot = math.sqrt((centroidx - MAxbot)**2 + (centroidy - MAybot)**2) min(distancetop, distancebot)
私が遭遇している問題は、ほとんどの場合、楕円の「前」端を正しく取得していますが、ポイントが少し離れている場合があります。私が観察した限りでは、これは x の値は正しいが、y の値が異なるように発生しているようです (実際、これは私のものに垂直な楕円の長軸を表していると思います)。これがopencvの角度の計算の問題なのか、それとも(おそらく)私の計算が間違っているのかはわかりません。これは複雑な例だと思いますが、私の図がお役に立てば幸いです!
編集:間違った点を取得すると、それは垂直楕円からではなく、楕円の鏡像からのものです。また、y だけでなく、x 値でも発生します。
以下のssmの提案に従った後、ほとんどの場合、目的のポイントを取得しています. ポイントはまだ時々間違っていますが、すぐに元の位置に「スナップバック」します。たとえば、これが発生したときのいくつかのフレームは次のとおりです。
ちなみに、上記の画像は、次のコードを使用して角度を「修正」した後のものです。
if angle > 90:
angle = 180 - angle
修正を行わないと、同じフレームについて以下に示すように、別の時点で間違ったポイントが得られます。
そのため、角度補正のある角度と補正なしの他の角度では正しいように見えます。両方の条件で適切なポイントをすべて取得するにはどうすればよいですか?
(楕円の内側の白い点は輪郭の重心ですが、楕円の上または外側の点は私が得ている点です)