如何在图像中查找图像?
How do I find images inside an image?
如何在图像中查找图像?
现在我正在使用 EmguCV,我已经根据本教程编写了以下代码:
https://www.emgu.com/wiki/index.php/Shape_(Triangle,_Rectangle,_Circle,_Line)_Detection_in_CSharp
using (UMat gray = new UMat())
using (UMat cannyEdges = new UMat())
{
CvInvoke.CvtColor(img, gray, ColorConversion.Bgr2Gray);
CvInvoke.GaussianBlur(gray, gray, new Size(3, 3), 2);
CvInvoke.Canny(gray, cannyEdges, 0, 10, 3);
LineSegment2D[] lines = CvInvoke.HoughLinesP(
cannyEdges,
1, //Distance resolution in pixel-related units
Math.PI / 2, //Angle resolution measured in radians.
0, //threshold
40, //min Line width
1); //gap between lines
foreach (LineSegment2D line in lines)
{
CvInvoke.Line(img, line.P1, line.P2, new Bgr(Color.Red).MCvScalar, 1);
}
}
第一步
第2步
步骤 3
这是我迄今为止最好的结果,但它并不完美,因为我仍然需要一些边缘才能在图像周围创建所有边界框。
步骤 4
我想要的是找到图像中每个图像的所有边缘,这样我就可以像这样制作完美的边界框。
我是 EmguCV/OpenCV 的新手,但我仍然认为我最好的选择是使用这个库来解决这个问题。
我只需要找到合适的工具并正确使用它们,这就是我希望这里有人能帮助我的:)
您可以执行以下操作:
- 加载图像
- 反转 -
img.Not()
- 转换为灰度 -
img.Convert<Gray,byte>()
- 执行二进制阈值处理 -
img.Convert<Gray, byte>().ThresholdBinary(new Gray(54), new Gray(255))
会得到如下图,优化阈值以获得更好的结果:
得到凸包和边界框。执行过滤,以便获得符合条件的对象。可以使用轮廓面积、周长等
var Contours = new List<Contour<Point>>();
for (Contour<Point> contours = _gray.FindContours(
HAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, RETR_TYPE.CV_RETR_EXTERNAL);
contours != null; contours = contours.HNext)
{
Seq<Point> pts = contours.GetConvexHull(ORIENTATION.CV_CLOCKWISE);
double diff = Math.Round(Math.Abs(pts.Area - contours.Area) /
pts.Area, 2);
//additional constraint
double q = contours.Area / contours.Perimeter;
//bounding box of the counter
Rectangle rect = contours.BoundingRectangle;
//customize the value to suit your need
if (contours.BoundingRectangle.Height > 5 &&
contours.BoundingRectangle.Width > 5)
{
Contours.Add(contours);
}
}
用Contours
做你想做的事(例如,填充并用作提取每个图像的蒙版,绘制边界框等)
如何在图像中查找图像?
现在我正在使用 EmguCV,我已经根据本教程编写了以下代码: https://www.emgu.com/wiki/index.php/Shape_(Triangle,_Rectangle,_Circle,_Line)_Detection_in_CSharp
using (UMat gray = new UMat())
using (UMat cannyEdges = new UMat())
{
CvInvoke.CvtColor(img, gray, ColorConversion.Bgr2Gray);
CvInvoke.GaussianBlur(gray, gray, new Size(3, 3), 2);
CvInvoke.Canny(gray, cannyEdges, 0, 10, 3);
LineSegment2D[] lines = CvInvoke.HoughLinesP(
cannyEdges,
1, //Distance resolution in pixel-related units
Math.PI / 2, //Angle resolution measured in radians.
0, //threshold
40, //min Line width
1); //gap between lines
foreach (LineSegment2D line in lines)
{
CvInvoke.Line(img, line.P1, line.P2, new Bgr(Color.Red).MCvScalar, 1);
}
}
第一步
这是我迄今为止最好的结果,但它并不完美,因为我仍然需要一些边缘才能在图像周围创建所有边界框。
步骤 4
我想要的是找到图像中每个图像的所有边缘,这样我就可以像这样制作完美的边界框。
我是 EmguCV/OpenCV 的新手,但我仍然认为我最好的选择是使用这个库来解决这个问题。 我只需要找到合适的工具并正确使用它们,这就是我希望这里有人能帮助我的:)
您可以执行以下操作:
- 加载图像
- 反转 -
img.Not()
- 转换为灰度 -
img.Convert<Gray,byte>()
- 执行二进制阈值处理 -
img.Convert<Gray, byte>().ThresholdBinary(new Gray(54), new Gray(255))
会得到如下图,优化阈值以获得更好的结果:
得到凸包和边界框。执行过滤,以便获得符合条件的对象。可以使用轮廓面积、周长等
var Contours = new List<Contour<Point>>(); for (Contour<Point> contours = _gray.FindContours( HAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, RETR_TYPE.CV_RETR_EXTERNAL); contours != null; contours = contours.HNext) { Seq<Point> pts = contours.GetConvexHull(ORIENTATION.CV_CLOCKWISE); double diff = Math.Round(Math.Abs(pts.Area - contours.Area) / pts.Area, 2); //additional constraint double q = contours.Area / contours.Perimeter; //bounding box of the counter Rectangle rect = contours.BoundingRectangle; //customize the value to suit your need if (contours.BoundingRectangle.Height > 5 && contours.BoundingRectangle.Width > 5) { Contours.Add(contours); } }
用
Contours
做你想做的事(例如,填充并用作提取每个图像的蒙版,绘制边界框等)