Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
AccAOI
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 7317aaf8
由
SK
编写于
2019-08-01 09:18:06 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
Mark点改为模板匹配
1 个父辈
6b869d1d
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
93 行增加
和
7 行删除
AOI/mark/AoiMarkMethod.cs
AOI/mark/AoiMarkMethod.cs
查看文件 @
7317aaf
...
...
@@ -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
=
fals
e
;
bool
needCut
=
tru
e
;
//标准图中的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!
Cancel
请
注册
或
登录
后发表评论