単純なコンソールアプリケーション(.net 4.0およびc#)からEmguCV 2.3.0.1416を使用していますが、キャニー、エッジ検出などについて質問があります。次のコードが与えられます。
var colours = new[]
{
new Bgr(Color.YellowGreen),
new Bgr(Color.Turquoise),
new Bgr(Color.Blue),
new Bgr(Color.DeepPink)
};
// Convert to grayscale, remove noise and get the canny
using (var image = new Image<Bgr, byte>(fileName)
.Convert<Gray, byte>()
.PyrDown()
.PyrUp()
.Canny(new Gray(180),
new Gray(90)))
{
// Save the canny out to a file and then get each contour within
// the canny and get the polygon for it, colour each a different
// colour from a selection so we can easily see if they join up
image.Save(cannyFileName);
var contours = image
.FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
RETR_TYPE.CV_RETR_EXTERNAL);
using (var debug = new Image<Bgr, byte>(image.Size))
{
int colIndex = 0;
for (; contours != null; contours = contours.HNext)
{
Contour<Point> poly = contours
.ApproxPoly(contours.Perimeter*0.05,
contours.Storage);
debug.Draw(poly, colours[colIndex], 1);
colIndex++;
if (colIndex > 3) colIndex = 0;
}
debug.Save(debugFileName);
}
}
私はこの出力を取得します(これは実際には画像の一部ですが、私が質問していることを示しています):
ご覧のとおり、少しピンクがかった青い線と、次に緑の線があります。ここでは本物のエッジがしっかりしているので、これを1本の線にして、自分が見ているもののエッジであることを確認できるようにします。
元の画像は次のようになります(ズームしましたが、簡単に見つけられると期待していた非常に特徴的なエッジがあることがわかります)。
キャニーだけを見ると、そこにギャップがあるので、キャニーを作成するためのパラメーター(しきい値とリンクしきい値)を調整してみましたが、違いはありませんでした。
また、キャニーを拡張してから侵食しました(反復パラメーターに同じ値を使用します-10)。これでうまくいくように見えましたが、これを行うと精度が低下する可能性があります(どういうわけか少し間違っていると感じます)。
では、この場合、どのようにして1行を確実に取得する必要がありますか?