前面0度匹配已经算是结束了。
我们轻微旋转一度图像,然后匹配,发现也是ok的,只不过得分下降的很快。
现在我们讲+-10度内,尺度没有变化,我们是怎么匹配的?
首先,我们先匹配0度,然后找-2,-1,1,2度,看会不会出现最佳得分
其次处理-5度和+5度的匹配,然后寻找最佳在-7,-6,-4,-3,以及3,4,6,7中
你也看出来了,我们一次只找5度,这已经找了15度了,剩下就剩-8,-9,-10和8,9,10这六度了,一共找21度,也就是+-10.
好,我们看代码:关键在于我们学习到的0度结果要旋转5度和-5度,+-10度也是相同处理。
///零度失误的话
//先搜索-10度和9度的结果,看x,y,与零度比较,优选一下,新增
int 得分对比基础 = 0;//防止0度失败,但0度怎么可能失败?0度匹配放在学习里不好
得分对比基础 = (int)((1 - (pipeiRes1[0] / 255) / (1.0f * hebingllp1.Count)) * 100);//最好大于0.3
//分三步走,第一,原来的,第二,如果取-10;第三如果取9;确定不同的限定框
if (pipeiRespt.Count == 0) return;
PointF PtF10 = new PointF();
PointF pt9 = new PointF();
int scoreF10 = 0; int score9 = 0;Point pipeidian=new Point(pipeiRespt[0].X,pipeiRespt[0].Y);
if (得分对比基础 < 0.3)
{
//-10度和9度去找,如果大于0.3,重新制定搜索区域//如果都小于0.3,则失败
PtF10 = 正负10度匹配搜索测试(-10, ref scoreF10);
if (scoreF10 > 0.6)
{
return;
}
pt9 = 正负10度匹配搜索测试(9, ref score9);
if (score9 > 0.6)
{
return;
}
if (scoreF10 > score9)
{
if (scoreF10 > 0.3)
{
pipeidian.X = (int)PtF10.X; pipeidian.Y = (int)PtF10.Y;//往0度方向走,看-5度
Rectangle rc限定区域 = new Rectangle(pipeidian.X - 5, pipeidian.Y - 5, 10, 10);
int hescore = 0;
正负15度匹配搜索测试(-5, rc限定区域, ref hescore);
if (hescore > scoreF10)
{
//fangxiangzhengque,0--5zhijian
}
else {
//-6,-7,-8,-9 ,-10
}
}
}
else
{
if (score9 > 0.3)
{
pipeidian.X = (int)pt9.X; pipeidian.Y = (int)pt9.Y;//往0度方向走,看5度
Rectangle rc限定区域 = new Rectangle(pipeidian.X - 5, pipeidian.Y - 5, 10, 10);
int hescore1 = 0;
正负15度匹配搜索测试(5, rc限定区域, ref hescore1);
if (hescore1 > scoreF10)
{
//fangxiangzhengque,0-5zhijian
}
else
{
//6,7,8,9
}
}
}
}
正负10度匹配搜索测试函数和 正负15度匹配搜索测试函数基本没什么区别,只是不用全图去找,只需要在得分低的范围内搜索有无得分高的。(感觉像是在说亚像素寻找的方法,其实是相同的)
PointF 正负10度匹配搜索测试(int 度, ref int score)
{
string hello = "";
List<Point> 返回结果1 = new List<Point>(); List<long> 返回结果2 = new List<long>();
//if (hebingllp1.Count != 0 && pipeiRespt.Count != 0)//在0度匹配基础之上,匹配1度,进行测试1度匹配算法稳定性
if (hebingllp1.Count != 0 //&& pipeiRespt.Count != 0
)//在0度匹配基础之上,匹配1度,进行测试1度匹配算法稳定性
{
// DateTime dt = DateTime.Now;
List<Point> contour6 = new List<Point>();
int m_CenterX = 匹配www / 2; int m_CenterY = 匹配hhh / 2;
int 临时性www = 匹配www;
int 临时性hhh = 匹配hhh;
float jilufushux = 0; float jilufushuy = 0;
float jilumaxX = 0; float jilufmaxy = 0;
//int dushu = Convert.ToInt32(textBox48.Text);
int dushu = 度;
if (dushu < 0)
dushu = 360 + dushu;
for (int i = 0; i < hebingllp1.Count; i++)
{//旋转也可以搞到外头去,提高效率
float x2 = (hebingllp1[i].X - m_CenterX) * cos360[dushu] + (hebingllp1[i].Y - m_CenterY) * sin360[dushu];//即就是x0,y0-cx,cy
float y2 = (hebingllp1[i].Y - m_CenterY) * cos360[dushu] - (hebingllp1[i].X - m_CenterX) * sin360[dushu];//即就是用完之后,x1,y1+cx,xy
x2 += m_CenterX;
y2 += m_CenterY;
//contour6zhong出现负数-1,怎么处理?
//contour6.Add(new Point((int)x2, (int)y2));
if (x2 < jilufushux)
{
jilufushux = x2;
}
if (x2 > jilumaxX)
{
jilumaxX = x2;
}
if (y2 < jilufushuy)
{
jilufushuy = y2;
}
if (y2 > jilufmaxy)
{
jilufmaxy = y2;
}
contour6.Add(new Point((int)(x2), (int)(y2)));
}
List<Point> contour6gengxin = new List<Point>();
if (jilufushux < 0 || jilufushuy < 0)
{
//float tempfushu = minmin(jilufushux, jilufushuy);
//int guiyi = -(int)(tempfushu - 1);
int guiyi1 = -(int)(jilufushux - 1); int guiyi2 = -(int)(jilufushuy - 1);
for (int i = 0; i < contour6.Count; i++)
{
contour6gengxin.Add(new Point(contour6[i].X + guiyi1, contour6[i].Y + guiyi2));//加上更小,当初是负数,取绝对值
}
//临时性www = 临时性www + guiyi+1+2; 临时性hhh = 临时性hhh + guiyi+1+2;
临时性www = 临时性www + guiyi1 + 1 + 2 + 2; 临时性hhh = 临时性hhh + guiyi2 + 1 + 2 + 2;
//这样加下去不是办法,4可以应付+-10度,5可以应付+-30度,45度就挂了,实际是够用了,但要彻底解决问题,
//必须判断轮廓中的最大值和最小值,而www和hhh必须比其大,相等也不行,至少大一,202210281339,这个问题不难解决,埋个雷吧!
int delx = (int)(jilufmaxy - jilufushuy);
if (临时性www <= delx)
临时性www = delx + 1;
int dely = (int)(jilumaxX - jilufushux);
if (临时性hhh <= dely)
临时性hhh = dely + 1;
}
else
{
for (int i = 0; i < contour6.Count; i++)
{
contour6gengxin.Add(new Point(contour6[i].X, contour6[i].Y));
}
}
xuanzhuanyidupipei(临时性www, 临时性hhh, contour6gengxin, ref 返回结果1, ref 返回结果2);
//for (int i = 0; i < 返回结果2.Count; i++)
//{
// hello += "(" + 返回结果1[i].X.ToString() + "," + 返回结果1[i].Y + ");Er" + (返回结果2[i] / 255).ToString() + ";Sc:" + (1 - (返回结果2[i] / 255) / (1.0f * hebingllp1.Count)).ToString() + "\r\n";
//}
score = (int)((1 - (返回结果2[0] / 255) / (1.0f * hebingllp1.Count)) * 100);
}
return 返回结果1[0];
}
xuanzhuanyidupipei(旋转一度匹配),这个函数就是我们前头那个0度匹配的算法,只不过这里换成找5度,换成找-5度,以及找-10和+10度。其实这个旋转我们可以事先在学习中备用好,那么匹配时就把时间省出来了。
这+-5度找了,+-10度也找了,我们不放心,细节每一度都找了发现,一个经验+-3度范围内得分变化不大,也就是说,你找0度,-3,-2,-1,1,2,3度,变化基本不大,所以到最后,我们+-10寻找,只需要找0度,7度,-7度三个就可以了,这样的话就不必找21次了。
这是试过所有后的经验,提高办事效率的经验,如果我们是学习,不必绕过去。
cnn中也有相同的话,我们发现图像角度变化不大时,仍然可以很好的识别。
这也是经验的话,但谁能证明这个经验公式?是你吗?