私はアンドロイド openCV を使用しており、画像内の三角形、四角形、円を検出したいと考えています。だから私は次のようにそれを行います: Canny => findContours => approxPolyDP そしてこの画像を取得します:
しかし、approxPolyDP の結果は頂点が多すぎて、どのような形状なのか判断できません。頂点を排除するために、各輪郭の線を検出し、それらの交点を見つけたいと考えています。単一の輪郭に対してどのようにそれを行うことができますか?
円の検出には、HoughCirclesを使用します。
次に、ここでは単純化されたポリゴン(三角形と正方形)を探しています。approxPolyDPでイプシロンを微調整してみましたか?
これは、openCV squares.cppサンプルコードのスニペットの例です。等高線のサイズに対して近似精度(epsilon、approxPolyDPの3番目のパラメーター)がどのように設定されているかを確認してください。
C ++コードですが、openCVインターフェースは同じである必要があるため、環境に適応するのは簡単だと確信しています。
// test each contour
for( size_t i = 0; i < contours.size(); i++ )
{
// approximate contour with accuracy proportional
// to the contour perimeter
approxPolyDP(Mat(contours[i]), approx,
arcLength(Mat(contours[i]), true)*0.02, true);
// square contours should have 4 vertices after approximation
// relatively large area (to filter out noisy contours)
// and be convex.
// Note: absolute value of an area is used because
// area may be positive or negative - in accordance with the
// contour orientation
if( approx.size() == 4 &&
fabs(contourArea(Mat(approx))) > 1000 &&
isContourConvex(Mat(approx)) )
{
double maxCosine = 0;
for( int j = 2; j < 5; j++ )
{
// find the maximum cosine of the angle between joint edges
double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1]));
maxCosine = MAX(maxCosine, cosine);
}
// if cosines of all angles are small
// (all angles are ~90 degree) then write quandrange
// vertices to resultant sequence
if( maxCosine < 0.3 )
squares.push_back(approx);
}
}