c# 基于sift的 马赛克检测

而相同的视频文件,经不同机顶盒的解码和图像采集设备的抓取,可能会产生图像明暗的差异和整体的颜色值变化,但极值和边角的变化极少。而图像马赛克出现,则对图像中的极值点会产生数量和位置的变化。通过对极值点的数量、位置的变化对比,来检测图像跟原始图像的差异,来判断图像的异常是本文介绍方法的核心
using System;
using OpenCvSharp;
using OpenCvSharp.CPlusPlus;

namespace CppStyleSamplesCS
{
    class sift_a
    {
        public void MatchBySift(Mat src1, Mat src2)
        {
            
            Mat gray1 = new Mat();
            Mat gray2 = new Mat();

            Cv2.CvtColor(src1, gray1, ColorConversion.BgrToGray);
            Cv2.CvtColor(src2, gray2, ColorConversion.BgrToGray);
            Cv2.NamedWindow("gray", 0);
            Cv2.ImShow("gray", gray1);

            SIFT sift = new SIFT();

            /*将特征,极值点放入keypoint*/
            KeyPoint[] keypoints1, keypoints2;
            MatOfFloat descriptors1 = new MatOfFloat();
            MatOfFloat descriptors2 = new MatOfFloat();
            sift.Run(gray1, null, out keypoints1, descriptors1);
            sift.Run(gray2, null, out keypoints2, descriptors2);
            /*keypoints内部有以下内容
            angle: 特征点的方向,值在0-360
            class_id: 用于聚类id,没有进行聚类时为-1
            octave: 特征点所在的高斯金差分字塔组
            pt: 特征点坐标
            response: 特征点响应强度,代表了该点时特征点的程度(特征点分数排序时,会根据特征点强度)
            size:特征点领域直径*/
            int len = keypoints1.Length;
            int len1 = keypoints2.Length;
            int same = 0;
            foreach (dynamic j in keypoints1)
            {
                foreach(dynamic i in keypoints2)
                {
                    if((int)j.Pt.X==(int)i.Pt.X && (int)j.Pt.Y == (int)i.Pt.Y)
                    {
                        if (j.Angle == i.Angle && j.Size == i.Size)
                        {
                            Console.WriteLine("{0},{1}", j.Angle, i.Angle);
                            same++;
                        }
                    }
                }
               
            }
            Console.WriteLine("{0},{1}",same,len);
            Console.ReadKey();
        }
        class test
        {
            static void Main(string[] args)
            {
                Mat src1 = new Mat(@"C:\Users\林皓天\Desktop\城市\6.jpg",LoadMode.Unchanged);
                Mat src2 = Cv2.ImRead(@"C:\Users\林皓天\Desktop\城市\9.jpg");
                /*两种方法将将图像文件存入src1,2*/

            Cv2.NamedWindow("gbr", 0);
                /*这样图像才能显示完全*/
                Cv2.ImShow("gbr", src1);

                sift_a test1 = new sift_a();
                test1.MatchBySift(src1, src2);

                Cv2.WaitKey(0);
                /*让图像显示,until摁下0*/
            }
        }
    }
}

 库的选择

 资料网站:

sift原理:SIFT算法 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/343522892

图像金字塔介绍:OpenCV计算机视觉学习(7)——图像金字塔(高斯金字塔,拉普拉斯金字塔,图像缩放resize函数) - 战争热诚 - 博客园 (cnblogs.com)https://www.cnblogs.com/wj-1314/p/11981974.html

c#sift算法实现:C# (CSharp) Code Examples - HotExampleshttps://csharp.hotexamples.com/site/file?hash=0xfc89e8b0fc0e96f38d1b11d4fa83ab681b52fe0174375ddd7038a934ff458b01&fullName=sample/CppStyleSamplesCS/SiftSurfSample.cs&project=0sv/opencvsharp

匹配算法了解:OpenCV - BF和FLANN特征匹配算法 - AI备忘录 (aiuai.cn)https://www.aiuai.cn/aifarm1636.html

具体参数理解:sift算法使用 - silence_cho - 博客园实际项目中一般都直接使用封装好的sift算法。以前为了用sift,都是用的旧版本:opencv-contib-python=3.4.2.17,现在sift专利过期了,新版的opencv直接可以使用sihttps://www.cnblogs.com/silence-cho/p/15170216.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值