基于形状匹配原始版放出来(给有用的人参考4)

前面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中也有相同的话,我们发现图像角度变化不大时,仍然可以很好的识别。

这也是经验的话,但谁能证明这个经验公式?是你吗?

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
指纹是人类最常用的生物特征之一,也是识别个体身份的一种有效手段。而指纹识别技术的核心就是指纹特征提取。基于纹线的方法是指纹特征提取领域中最常用的一种方法之一,下面为您综述一些相关文献。 1. Ojala, T., & Pietikäinen, M. (2002). Multiresolution gray-scale and rotation invariant texture classification with local binary patterns. IEEE transactions on pattern analysis and machine intelligence, 24(7), 971-987. 本文提出了一种基于局部二值模式(LBP)的纹线特征提取方法。该方法可以对灰度图像进行多尺度和旋转不变的纹线特征提取,具有较高的识别率和实时性。 2. Zhang, D., & Lu, G. (2002). A comparative study on shape representation and feature extraction methods for automatic fingerprint recognition. Pattern recognition, 35(3), 643-656. 本文比较了不同形状表示和特征提取方法对指纹识别效果的影响,其中包括了基于纹线的特征提取方法。实验结果表明,基于纹线的方法在指纹识别中具有较高的识别率和稳定性。 3. Kaur, A., & Kaur, M. (2015). Fingerprint recognition using minutiae extraction and singular point detection. International Journal of Advanced Research in Computer Science and Software Engineering, 5(6), 108-113. 本文提出了一种基于纹线的指纹特征提取方法,该方法包括细节提取和奇点检测两个步骤。实验结果表明,该方法可以有效地提取指纹特征,并具有较高的识别率和鲁棒性。 4. Nandakumar, K., & Jain, A. K. (2010). Multibiometric template security using fingerprint minutiae and ridge-based features. IEEE transactions on information forensics and security, 5(1), 127-138. 本文提出了一种基于纹线和细节的多模态生物特征融合方法,可以提高指纹识别的准确性和鲁棒性。该方法结合了基于纹线和细节的指纹特征提取方法,同时采用了密码学技术保护生物特征模板的安全性。 5. Cappelli, R., Maio, D., Maltoni, D., & Wayman, J. L. (2006). Performance evaluation of fingerprint verification systems. Springer Science & Business Media. 本书对指纹识别系统的性能评估进行了全面而深入的探讨,其中包括了基于纹线的指纹特征提取方法。该书对指纹识别领域的研究者和从业者都具有重要的参考价值。 6. Rathgeb, C., & Busch, C. (2016). A survey on biometric cryptosystems and cancelable biometrics. ACM Computing Surveys (CSUR), 48(2), 22. 本文综述了生物特征加密系统和可撤销生物特征技术的最新研究进展,其中包括了基于纹线的指纹特征提取方法。该文对指纹识别技术的安全性和可靠性方面进行了深入的探讨。 7. Xu, Y., Shen, H. T., & Li, S. (2014). Fingerprint indexing based on minutia cylinder-code. IEEE Transactions on Image Processing, 23(5), 2227-2239. 本文提出了一种基于细节和纹线的指纹特征提取方法,该方法可以将指纹图像转换为三维空间中的细节柱码,从而实现高效的指纹检索和匹配。 8. Ratha, N. K., Connell, J. H., & Bolle, R. M. (2001). Enhancing security and privacy in biometrics-based authentication systems. IBM systems journal, 40(3), 614-634. 本文探讨了基于生物特征的身份认证系统的安全性和隐私保护问题,其中包括了基于纹线的指纹特征提取方法。该文提出了一些解决方案,可以有效地提高生物特征身份认证系统的安全性和隐私保护性。 9. Jain, A. K., Ross, A., & Nandakumar, K. (2016). Handbook of biometrics (pp. 1-22). Springer, Cham. 本书是生物特征识别领域的一本重要参考书,其中包括了基于纹线的指纹特征提取方法。该书系统地介绍了生物特征识别的原理和技术,对新手和从业者都具有较高的参考价值。 10. Maio, D., Maltoni, D., Cappelli, R., & Wayman, J. L. (2002). Fingerprint recognition. Springer Science & Business Media. 本书是指纹识别领域的一本经典著作,其中包括了基于纹线的指纹特征提取方法。该书系统地介绍了指纹识别的原理、技术和应用,对指纹识别领域的研究者和从业者都具有重要的参考价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值