opencvを使用して画像内の楕円を検出しようとしています。楕円やその他の輪郭を含む輪郭を見つけました。
どの輪郭が楕円であるかをどのように確認できるかについての提案はありますか?
私があなたを正しく理解していれば、あなたは輪郭を検出しました。それらのいくつかは楕円であり、いくつかはそうではなく、あなたはどれがどれであるかを決定できるようにしたいと思っています。正しいですか?はいの場合は、を使用することをお勧めしますcv::fitEllipse()
。文書によると、R-squaredが最小になるように、楕円を点のベクトルに適合させます。残念ながら、この関数は決定係数の値を明示的に返しません。自分で実装できるかもしれません...
回避策として、次のようなものを使用することもできます。
それらを比較するには、モーメントを使用できます(cv::moments()
およびを参照cv::matchShapes()
)。ただし、ここでは不変の瞬間は必要ないと思います。
または、CとEを描画して、サーフェスのオーバーラップの割合を見つけることもできます。
幸運を、
fitEllipseはRotatedRectを提供します。
また、円に変換できる楕円固有のプロパティを使用できます。
double is_ellipse( std::vector<cv::Point> const& cloud, RotatedRect const& rr )
{
double distance =0;
for( auto const& point: cloud )
{
Point2f unit;
unit.x = ( ( rr.center.x - point.x ) * cos( - rr.angle*(3.1415926/180) ) - ( rr.center.y - point.y ) * sin( - rr.angle*(3.1415926/180) ) ) * 2 / rr.size.width ;
unit.y = ( ( rr.center.x - point.x ) * sin( - rr.angle*(3.1415926/180) ) + ( rr.center.y - point.y ) * cos( - rr.angle*(3.1415926/180) ) ) * 2 / rr.size.height;
double len = sqrt( unit.x* unit.x + unit.y * unit.y );
distance += fabs( 1- len );
}
return distance / cloud.size();
}
これは、円の境界からの平均距離を計算するために使用されます。max、deviationなどの他の統計関数を簡単に変更できます。
@Ahsan-すべての輪郭を繰り返し処理し、楕円に合わせてみる必要があります。カーブフィッティングの計算が難しい場合は、短いルートになります。
like-各輪郭を反復処理します-非凸輪郭を破棄します-現在の輪郭のマスクを作成し、cv::matchShapes関数を使用してshapeMatchingを実行します。