如何使用 OpenCVSharp 在 C# 中找到最小面积矩形?
How to find the minimum area rectangle in C# using OpenCVSharp?
我需要从白色位图 canvas 中提取 black/white 图像(签名)并将其调整为特定尺寸。图片(sig)保证是白底黑字。
原因是我们抓取签名的时候,有的人写的很小,有的人填满了抓取区域。但是,我需要它们全部填充到另一个图像的边缘以进行进一步处理。
我需要找到签名的 X/Y 坐标/矩形边界,这样我就可以只提取 canvas 的那部分,而不是在周围有很多白色 space.
我在另一个项目中注意到了这一点,想知道如何在 OpenCVSharp 中实现。
http://www.emgu.com/wiki/index.php/Minimum_Area_Rectangle_in_CSharp
谢谢。
编辑:正如 Miki 在评论中指出的那样,您可能正在搜索旋转框。您可能想要 OpenCvSharp.Cv.MinAreaRect2()
,它需要 CvArr
个点,returns 个 CvBox2D
.
边界框的计算比较简单,只要不担心边界框的倾斜,找到最小外接矩形就是找到对应于黑色像素的最小和最大x和y .最简单的方法类似于:
// 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");
诚然,这不是最简洁的实现,但任何用于搜索最小值和最大值的算法都可以使用。 (你只需要对两个维度都这样做。)
我需要从白色位图 canvas 中提取 black/white 图像(签名)并将其调整为特定尺寸。图片(sig)保证是白底黑字。
原因是我们抓取签名的时候,有的人写的很小,有的人填满了抓取区域。但是,我需要它们全部填充到另一个图像的边缘以进行进一步处理。
我需要找到签名的 X/Y 坐标/矩形边界,这样我就可以只提取 canvas 的那部分,而不是在周围有很多白色 space.
我在另一个项目中注意到了这一点,想知道如何在 OpenCVSharp 中实现。
http://www.emgu.com/wiki/index.php/Minimum_Area_Rectangle_in_CSharp
谢谢。
编辑:正如 Miki 在评论中指出的那样,您可能正在搜索旋转框。您可能想要 OpenCvSharp.Cv.MinAreaRect2()
,它需要 CvArr
个点,returns 个 CvBox2D
.
边界框的计算比较简单,只要不担心边界框的倾斜,找到最小外接矩形就是找到对应于黑色像素的最小和最大x和y .最简单的方法类似于:
// 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");
诚然,这不是最简洁的实现,但任何用于搜索最小值和最大值的算法都可以使用。 (你只需要对两个维度都这样做。)