Commit 7317aaf8 SK

Mark点改为模板匹配

1 个父辈 6b869d1d
......@@ -19,6 +19,10 @@ namespace AOI
/// 放大RoiPath作为SearchPath
/// </summary>
public float SearchPathZoom = 2.0f;
/// <summary>
/// 相似度百分比
/// </summary>
public float SamePercent = 50;
/// <summary>
/// 放大RoiPath作为SearchPath
......@@ -69,24 +73,106 @@ namespace AOI
return resultBean;
}
public Image FixImage(Image standardImage, Image imageToCheck)
public Mat Fix(Image standardImage, Image imageToCheck)
{
bool needCut = false;
bool needCut = true;
//标准图中的Mart区域
Image markImage = GetRoiImage(standardImage, RoiPath, needCut);
//搜索区域
var SearchPath = GetSearchPath();
Image searchImage = GetRoiImage(imageToCheck, SearchPath, needCut);
//searchImage = imageToCheck;
if (markImage != null && searchImage != null)
{
var affine = GetAffineMat(markImage, searchImage);
if (affine != null)
Mat searchMat = ImageUtil.ToMat(new Bitmap(searchImage));
Mat markMat = ImageUtil.ToMat(new Bitmap(markImage));
//Cv2.CvtColor(searchMat, searchMat, ColorConversionCodes.RGB2GRAY);
//Cv2.CvtColor(markMat, markMat, ColorConversionCodes.RGB2GRAY);
Mat result = new Mat(searchMat.Cols - markMat.Cols + 1, searchMat.Rows - markMat.Cols + 1, MatType.CV_32FC1);
//进行匹配(1母图,2模版子图,3返回的result,4匹配模式_这里的算法比opencv少,具体可以看opencv的相关资料说明)
Cv2.MatchTemplate(searchMat, markMat, result, TemplateMatchModes.CCoeffNormed);
//对结果进行归一化(这里我测试的时候没有发现有什么用,但在opencv的书里有这个操作,应该有什么神秘加成,这里也加上)
//Cv2.Normalize(result, result, 1, 0, NormTypes.MinMax, -1);
/// 通过函数 minMaxLoc 定位最匹配的位置
/// (这个方法在opencv里有5个参数,这里我写的时候发现在有3个重载,看了下可以直接写成拿到起始坐标就不取最大值和最小值了)
/// minLocation和maxLocation根据匹配调用的模式取不同的点
Cv2.MinMaxLoc(result, out double minVal, out double maxVal, out OpenCvSharp.Point minLocation, out OpenCvSharp.Point maxLocation);
//画出匹配的矩,
// Cv2.Rectangle(mat1, maxLocation, new Point (maxLocation.X+mat2.Cols, maxLocation.Y+mat2.Rows), Scalar.Red, 2);
Cv2.Rectangle(searchMat, maxLocation, new OpenCvSharp.Point(maxLocation.X + markMat.Cols, maxLocation.Y + markMat.Rows), Scalar.Red, 2);
Cv2.ImShow("mat1", searchMat);
//Console.WriteLine(minValue);
//Console.WriteLine(maxValue);
Console.WriteLine(minLocation + "=" + minVal);
Console.WriteLine(maxLocation + "=" + maxVal);
if (maxVal * 100 > 20)
{
var matToCheck = ImageUtil.ToMat(imageToCheck);
var fixedMat = FixImage(affine, matToCheck);
return ImageUtil.ToImage(fixedMat);
//大于相似度,开始平移图像
var searchBounds = SearchPath.GetBounds();
var srcPoints = new Point2f[] {
new Point2f(searchBounds.X + maxLocation.X, searchBounds.Y + maxLocation.Y),
new Point2f(searchBounds.X + maxLocation.X+markMat.Cols, searchBounds.Y + maxLocation.Y),
new Point2f(searchBounds.X + maxLocation.X, searchBounds.Y + maxLocation.Y + markMat.Rows),
new Point2f(searchBounds.X + maxLocation.X+markMat.Cols, searchBounds.Y + maxLocation.Y + markMat.Rows),
};
//变换后的四点
var markBounds = RoiPath.GetBounds();
var dstPoints = new Point2f[] {
new Point2f(markBounds.X , markBounds.Y),
new Point2f(markBounds.X + markMat.Cols , markBounds.Y),
new Point2f(markBounds.X , markBounds.Y + markMat.Rows),
new Point2f(markBounds.X + markMat.Cols , markBounds.Y + markMat.Rows),
};
//根据变换前后四个点坐标,获取变换矩阵
Mat mm = Cv2.GetAffineTransform(srcPoints, dstPoints);
return mm;
}
}
return null;
}
public Image FixImage(Image standardImage, Image imageToCheck)
{
//Fix(standardImage, imageToCheck);
var affine = Fix(standardImage, imageToCheck);
if (affine != null)
{
var matToCheck = ImageUtil.ToMat(imageToCheck);
Mat fixedMat = new Mat();
Cv2.WarpAffine(matToCheck, fixedMat, affine,new OpenCvSharp.Size(standardImage.Width, standardImage.Height));
//var fixedMat = FixImage(affine, matToCheck);
Image markImage = GetRoiImage(ImageUtil.ToImage(fixedMat), RoiPath, true);
//Cv2.ImShow("Fixed", ImageUtil.ToMat(markImage));
//return ImageUtil.ToImage(fixedMat);
return markImage;
}
//bool needCut = false;
////标准图中的Mart区域
//Image markImage = GetRoiImage(standardImage, RoiPath, needCut);
////搜索区域
//var SearchPath = GetSearchPath();
//Image searchImage = GetRoiImage(imageToCheck, SearchPath, needCut);
//if (markImage != null && searchImage != null)
//{
// var affine = GetAffineMat(markImage, searchImage);
// if (affine != null)
// {
// var matToCheck = ImageUtil.ToMat(imageToCheck);
// var fixedMat = FixImage(affine, matToCheck);
// return ImageUtil.ToImage(fixedMat);
// }
//}
return null;
}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!