Commit bdc5a88c SK

颜色匹配

1 个父辈 c67e6e48
...@@ -61,6 +61,7 @@ ...@@ -61,6 +61,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="AoiProject.cs" /> <Compile Include="AoiProject.cs" />
<Compile Include="match\AoiColorMatchMethod.cs" />
<Compile Include="match\AoiTemplateMethod.cs" /> <Compile Include="match\AoiTemplateMethod.cs" />
<Compile Include="util\Base64Util.cs" /> <Compile Include="util\Base64Util.cs" />
<Compile Include="util\ImageUtil.cs" /> <Compile Include="util\ImageUtil.cs" />
......
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
using OpenCvSharp.Blob;
using OpenCvSharp.XFeatures2D;
namespace AOI
{
/// <summary>
/// 颜色匹配,各种颜色占比(灰度图的直方图)进行匹配,不方向无关
/// </summary>
public class AoiColorMatchMethod : AoiMethod
{
/// <summary>
/// 相似度百分比
/// </summary>
public double SamePercent = 50;
public override ResultBean Check(Image standardImage, Image imageToCheck)
{
ResultBean resultBean = new ResultBean(MethodName,4,SamePercent,SamePercent);
bool needCut = true;
Image standardRoiImg = GetRoiImage(standardImage, needCut);
resultBean.standardRoiImage = standardRoiImg;
double percent = GetColorMatchPercent(standardImage, imageToCheck, out Image cutImg);
bool result = false;
if(SamePercent > 100)
{
SamePercent = 100;
}
if(percent >= SamePercent)
{
result = true;
}
resultBean.currentRoiImage = cutImg;
resultBean.result = result;
resultBean.percentValue =Math.Round( percent,3);
return resultBean;
}
/// <summary>
/// 获取模板相似度
/// </summary>
/// <param name="standardImage"></param>
/// <param name="imageToCheck"></param>
/// <param name="cutImg"></param>
/// <returns></returns>
public double GetColorMatchPercent(Image standardImage, Image imageToCheck, out Image cutImg)
{
bool needCut = true;
//标准图中的Mart区域
Image templateImage = GetRoiImage(standardImage, RoiPath, needCut);
//搜索区域
Image searchImage = GetRoiImage(imageToCheck, RoiPath, needCut);
cutImg = searchImage;
try
{
//searchImage = imageToCheck;
if (templateImage != null && searchImage != null)
{
Mat searchMat = ImageUtil.ToMat(new Bitmap(searchImage));
Mat templateMat = ImageUtil.ToMat(new Bitmap(templateImage));
//转换为灰度图,对直方图进行匹配
Mat searchHist = ImageUtil.GetGrayHist(searchMat);
Mat templateHist = ImageUtil.GetGrayHist(templateMat);
double compareValue = Cv2.CompareHist(templateHist, searchHist, HistCompMethods.Correl);
return compareValue * 100;
}
}catch(Exception ex)
{
Console.Write(ex.ToString());
}
return 0;
}
}
}
...@@ -26,5 +26,22 @@ namespace AOI ...@@ -26,5 +26,22 @@ namespace AOI
return BitmapConverter.ToBitmap(mat); return BitmapConverter.ToBitmap(mat);
} }
} public static Mat GetGrayHist(Mat srcMat)
{
Mat grayMat = new Mat();
Cv2.CvtColor(srcMat, grayMat, ColorConversionCodes.BGRA2GRAY);
Mat[] mats = new Mat[] { grayMat };//一张图片,初始化为panda
Mat hist = new Mat();//用来接收直方图
int[] channels = new int[] { 0 };//一个通道,初始化为通道0
int[] histsize = new int[] { 256 };//一个通道,初始化为256箱子
Rangef[] range = new Rangef[1];//一个通道,值范围
range[0].Start = 0.0F;//从0开始(含)
range[0].End = 256.0F;//到256结束(不含)
Mat mask = new Mat();//不做掩码
Cv2.CalcHist(mats, channels, mask, hist, 1, histsize, range);//计算灰度图,dim为1 1维
return hist;
}
}
} }
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!