我在一个简单的控制台应用程序(.net 4.0和c#)中使用EmguCV 2.3.0.1416,我有一个关于canny,边缘检测等的问题。给出以下代码:
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);
}
}
我得到了这个输出(这实际上只是图像的一部分,但它显示了我所询问的内容):
正如你所看到的,它有一条蓝色的线条,有一点粉红色,然后是一条绿线。真实的东西在这里只有一个坚实的边缘,所以我希望这是一个单行,以便我可以肯定它是我正在看的边缘。
原始图像看起来像这样(我已将其缩放,但您可以看到它具有非常独特的边缘,我希望能够轻松找到它。)
如果我看一下canny,我可以看到那里的差距,所以我尝试调整创建canny的参数(阈值和链接阈值),但它们没有任何区别。
我也扩张然后侵蚀了canny(使用相同的迭代参数值 - 偶然使用10)这似乎可以解决这个问题,但是这样做会让我失去准确性(它只是感觉有些不对劲)? / p>
那么,我应该如何确保在这个实例中获得一行?
答案 0 :(得分:2)
答案 1 :(得分:0)
单行是什么意思?也许你正试图加强你的界限:
debug.Draw(poly, colours[colIndex], 2);
而不是:
debug.Draw(poly, colours[colIndex], 1);
答案 2 :(得分:0)
approxPoly()函数中的第一个参数正是您要查找的内容。只要摆弄它,你就会得到你想要的东西。