如何使用OpenCVSharp在C#中找到最小区域矩形?

时间:2015-08-18 18:41:42

标签: c# opencv image-processing opencvsharp opencvdotnet

我需要从白色位图画布中提取黑/白图像(签名)并将其调整为特定尺寸。图像(sig)在白色背景上保证是黑色的。

原因是当我们捕获签名时,有些人会写小,其他人填充捕获区域。但是,我需要它们才能最终填充另一个图像的边缘以便进一步处理。

我需要找到签名的X / Y坐标/矩形边界,这样我就可以只提取画布的那一部分,而不会产生大量周围的空白区域。

我在一个不同的项目中注意到这一点,并想知道如何在OpenCVSharp中实现。

http://www.emgu.com/wiki/index.php/Minimum_Area_Rectangle_in_CSharp

感谢。

1 个答案:

答案 0 :(得分:2)

编辑:正如Miki在评论中指出的那样,您可能正在搜索旋转的框。您可能需要OpenCvSharp.Cv.MinAreaRect2(),其中CvArr点数为CvBox2D,并返回// You would actually use your image Bitmap b = new Bitmap(640,480); // For the demonstration generate some randomized data Random r = new Random(); for (int i = 0; i < 1000; i++) { b.SetPixel(r.Next(200) + 50, r.Next(200) + 50, Color.Black); } int minX, minY; int maxX, maxY; minX = minY = int.MaxValue; maxX = maxY = int.MinValue; // Find the minimum and maximum black coordinates for (int x = 0; x < b.Width; x++) { for (int y = 0; y < b.Height; y++) { if (b.GetPixel(x,y).ToArgb() == Color.Black.ToArgb()) { if (x > maxX) maxX = x; if (x < minX) minX = x; if (y > maxY) maxY = y; if (y < minY) minY = y; } } } // Draw a bounding box for the demonstration using (Graphics g = Graphics.FromImage(b)) { Pen red = new Pen(Color.Red); g.DrawRectangle(red, minX, minY, maxX - minX, maxY - minY); } b.Save("c:\\tmp\\test.png");

Reference

边界框计算相对简单,只要您不担心边界框中的倾斜,找到最小的封闭矩形只是找到对应于黑色像素的最小和最大x和y的问题。最简单的方法是:

debit

这无疑是最干净的实现,但任何搜索最小值和最大值的算法都可行。 (你只需要为这两个维度做这件事。)