我正在寻找在 C# 中制作程序的指导,该程序接收一堆 bmp 图像并检测图像上的一个框,并将裁剪后的框作为 bmp 图像返回到单独的文件夹中。
我正在使用 Visual Basic 2010。
我研究了 .NET 服务器具有的所有不同的内置算法,并且我还下载并尝试了 Emgucv 示例等等。我找到了一个程序,它使用预设图像并将其裁剪到用户单击http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=30725的位置指定的某个矩形, 并试图合并部分这与内置于 Emgucv 参考的 Example.ShapeDetection.exe 一起使用。
using System;
using System.Drawing.Drawing2D;
using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Text;
using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
namespace Project1{
public static class Project1 {
public static void main()
{
//load in desired images to be processed
//Load the image from file
//for loop that runs all the code below for all the files in a certain folder
//for example
//for(int i = 0; i<"number of images in image folder"; i++){
//code that loads the bmp images
Image<Bgr, Byte> img = new Image<Bgr, byte>(fileNameTextBox.Text).Resize(400, 400, true);
Image<Gray, Byte> gray = img.Convert<Gray, Byte>().PyrDown().PyrUp();
Gray cannyThreshold = new Gray(180);
Gray cannyThresholdLinking = new Gray(120);
Gray circleAccumulatorThreshold = new Gray(120);
Image<Gray, Byte> cannyEdges = gray.Canny(cannyThreshold, cannyThresholdLinking);
LineSegment2D[] lines = cannyEdges.HoughLinesBinary(
1, //Distance resolution in pixel-related units
Math.PI / 45.0, //Angle resolution measured in radians.
20, //threshold
10, //min Line width
10 //gap between lines
)[0]; //Get the lines from the first channel
#region Find rectangles
List<MCvBox2D> boxList = new List<MCvBox2D>();
using (MemStorage storage = new MemStorage()) //allocate storage for contour approximation
for (Contour<Point> contours = cannyEdges.FindContours(); contours != null; contours = contours.HNext)
{
Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.05, storage);
if (contours.Area > 100) //only consider contours with area greater than 250
{
if (currentContour.Total == 4) //The contour has 4 vertices.
{
#region determine if all the angles in the contour are 90 degree's
bool isRectangle = true;
Point[] pts = currentContour.ToArray();
LineSegment2D[] edges = PointCollection.PolyLine(pts, true);
for (int i = 0; i < edges.Length; i++)
{
double angle = Math.Abs(
edges[(i + 1) % edges.Length].GetExteriorAngleDegree(edges[i]));
if (angle < 89 || angle > 91)
{
isRectangle = false;
break;
}
}
#endregion
if (isRectangle) boxList.Add(currentContour.GetMinAreaRect());
}
}
}
#endregion
originalImageBox.Image = img;
#region draw rectangles
Image<Bgr, Byte> RectangleImage = img.Copy();
foreach (MCvBox2D box in boxList)
RectangleImage.Draw(box, new Bgr(Color.Green), 2);
RectangleImageBox.Image = RectangleImage;
#endregion
}
}
}
这是我目前拥有的代码,我知道它有几个问题,但我似乎找不到解决它们的方法。
当前上下文中不存在 filenameImageBox、originalImageBox 和 RectangleImageBox。我的猜测是,这是因为他们引用了一个不再存在的图像。
正如我在评论中所说,我正在尝试编写一个循环,遍历资源中的所有 *.bmp 图像并将它们加载到程序中。我不知道该去哪里。
最重要的是,这段代码希望能检测到我正在寻找的矩形,并简单地在空白图像上的相同位置重新绘制一个具有相同尺寸的矩形。我想做的是简单地将矩形裁剪为全屏的大小。上面链接的裁剪图像程序中有一些部分可以做到这一点,但我正在努力使用 ShapeDetection 算法的矩形检测将裁剪与该程序隔离开来。
建议将不胜感激。我只在 C# 中工作了几周,虽然之前有 C++ 和 Java 方面的经验。