首页 > 其他分享 >opencvsharp surf 图像拼接

opencvsharp surf 图像拼接

时间:2023-05-17 16:34:07浏览次数:35  
标签:surf Mat src1 Cv2 src2 拼接 opencvsharp alpha new

代码如下:

 1             Mat src1 = Cv2.ImRead(@"C:\Users\sa\Pictures\Saved Pictures\3.png");
 2             Mat src2 = Cv2.ImRead(@"C:\Users\sa\Pictures\Saved Pictures\4.png");
 3             Cv2.ImShow("src1", src1);
 4             Cv2.ImShow("src2", src2);
 5 
 6             SURF surf = SURF.Create(2000, upright: true);
 7             KeyPoint[] kp1, kp2;
 8             Mat dst1 = new Mat(), dst2 = new Mat();
 9             surf.DetectAndCompute(src1, null, out kp1, dst1);
10             surf.DetectAndCompute(src2, null, out kp2, dst2);
11 
12             FlannBasedMatcher flann = new FlannBasedMatcher();
13             DMatch[][] dm = flann.KnnMatch(dst1, dst2, 2);
14 
15             var dmWhere = dm.Where(x => x[0].Distance < 0.7 * x[1].Distance).ToArray();
16             Point2f[] goodPoints1 = dmWhere.Select(i => kp1[i[0].QueryIdx].Pt).ToArray();
17             Point2f[] goodPoints2 = dmWhere.Select(i => kp2[i[0].TrainIdx].Pt).ToArray();
18             
19             //List<Point2f> goodPoints3 = new List<Point2f>();
20             //List<Point2f> goodPoints4 = new List<Point2f>();
21             //for (int i = 0; i < dm.Length; i++)
22             //{
23             //    if (dm[i][0].Distance < 0.7 * dm[i][1].Distance)
24             //    {
25             //        goodPoints3.Add(kp1[dm[i][0].QueryIdx].Pt);
26             //        goodPoints4.Add(kp2[dm[i][0].TrainIdx].Pt);
27             //    }
28             //}
29             
30             Mat mask12 = new Mat();
31             Mat homography12 = Cv2.FindHomography(InputArray.Create(goodPoints2.ToArray()), InputArray.Create(goodPoints1.ToArray()), HomographyMethods.Ransac, 5, mask12);
32             
33             OpenCvSharp.Size size = new OpenCvSharp.Size(src1.Width + src2.Width, src1.Height);
34             Mat result = new Mat(size, MatType.CV_8UC3);
35             Cv2.WarpPerspective(src2, result, homography12, new OpenCvSharp.Size(src1.Width + src2.Width, src1.Height));
36 
37             ImageFusion(src1, result, 100);
38 
39             src1.CopyTo(result[new OpenCvSharp.Rect(0, 0, src1.Width, src1.Height)]);
40             Cv2.ImShow("Result", result);
 1         /// <summary>
 2         /// 图像交界处平滑处理
 3         /// </summary>
 4         /// <param name="src1"></param>
 5         /// <param name="src2"></param>
 6         /// <param name="width"></param>
 7         private void ImageFusion(Mat src1, Mat src2, int width)
 8         {
 9             float widthF = width;
10             int height = src1.Height;
11             int start = src1.Cols - width;
12             float alpha = 0f;
13             unsafe
14             {
15                 for (int i = 0; i < height; i++)
16                 {
17                     var ptr1 = (byte*)src1.Ptr(i);
18                     var ptr2 = (byte*)src2.Ptr(i);
19                     for (int j = start; j < src1.Cols; j++)
20                     {
21                         if (ptr2[j * 3] == 0 && ptr2[j * 3 + 1] == 0 && ptr2[j * 3 + 2] == 0)
22                         {
23                             alpha = 0f;
24                         }
25                         else
26                         {
27                             alpha = (j - start) / widthF;
28                         }
29                         ptr1[j * 3] = (byte)(ptr1[j * 3] * (1 - alpha) + ptr2[j * 3] * alpha);
30                         ptr1[j * 3 + 1] = (byte)(ptr1[j * 3 + 1] * (1 - alpha) + ptr2[j * 3 + 1] * alpha);
31                         ptr1[j * 3 + 2] = (byte)(ptr1[j * 3 + 2] * (1 - alpha) + ptr2[j * 3 + 2] * alpha);
32                     }
33                 }
34             }
35         }

效果:

 

 

标签:surf,Mat,src1,Cv2,src2,拼接,opencvsharp,alpha,new
From: https://www.cnblogs.com/JustWantToStudy/p/17409214.html

相关文章

  • python - moviepy音频剪切与拼接
    pip3installmoviepy-ihttps://pypi.tuna.tsinghua.edu.cn/simplefrommoviepy.audio.io.AudioFileClipimportAudioFileClipfrommoviepy.editorimportconcatenate_audioclipsa=AudioFileClip('a.mp3')#读入音频audio1=a.subclip(0,83)#剪切0-83秒......
  • 使用dapper命令参数动态拼接出最安全的sql语句
    多条件查询--使用dapper命令参数动态拼接出最安全的sql语句publicList<MSys_Admin>GetAdminList(MSys_Adminmodel){stringsqlText="selectcount(1)fromSys_Adminwhere1=1";varp=newDynamicParameters();if(!string.IsNullOrEmpty(model.LoginName)){sqlText+=&qu......
  • 用画图软件将两张图片拼接在一起
    网上查了几种方式。我发现最简单的方式是打开图片,点 导入新的图片即可。难道是因为系统不一样操作不一样?有的方法是复制新的图片后粘贴到画图软件上,我的不能粘贴。......
  • java8 数组使用流和收集器格式化拼接数组中字符串并以“,”间隔,且首尾分别用 “[” 和
    方法:Stringresult=artist.stream().map(Art::getName).collect(Collectors.joining(",","[","]"));(注:joining(CharSequencedelimiter,CharSequenceprefix,CharSequencesuffix)方法接受一个字符串序列作为拼接符,并在拼接完成后添加传递的前缀和后缀。假如我们传递的分......
  • 【Oracle】使用xmlagg(xmlparse(content()).getclobval()拼接信息
    使用xmlagg(xmlparse(content()).getclobval()拼接信息简单来说格式如下xmlagg(xmlparse(content(内容||分割符)).getclobval()内容就是使用显示的数据部分,分隔符不同效果不同,分隔符可以使用chr()函数无分隔符xmlagg(xmlparse(content('这是一个字段:'||v.supercode||'、......
  • sql 将每组查询结果用逗号拼接成字符串
    selectatype,name_listfrom( selectlistagg(aname,',')withingroup(orderbyatype)name_list,atypefromlisttablewhereage>0 groupbyatype)a; /*查询listtable表里面所有age大于0的name,按照atype输出,name之间用,拼接起来成为字符串,该字段......
  • #PowerBi 1分钟学会,powerbi中行列值拼接(COMBINEVALUES与CONCATENATEX)
    在日常的工作中,我们往往需要对表格数据的拼接,用来生成一些复合数据列,如下图类似场景。其实,在powerbi中,我们同样也可以对表格文本进行拼接。今天我们就介绍两个DAX函数,COMBINEVALUES(表函数,新建列)与 CONCATENATEX(度量值)。示例数据表: 一:COMBINEVALUES(表函数,新建列),行值拼接。1.......
  • 拼接最大数(栈、贪心)、发奖金问题、二叉搜索树迭代器(栈、树)
    拼接最大数(栈、贪心)给定长度分别为m和n的两个数组,其元素由0-9构成,表示两个自然数各位上的数字。现在从这两个数组中选出k(k<=m+n)个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。求满足该条件的最大数。结果返回一个表示该最大......
  • 实现字符串的拼接---Java
    定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回调用此方法,并在控制台输出结果 例如: 数组为:int[]arr={1,2,3}; 执行后输出结果为:[1,2,3]packagestring.practice;/**实现字符串的拼接*定义一个方法,把int数组中的数据按照指定的格式拼接成一个字......
  • 多个Sql字段拼接为一个字段,并判断是否为空,为空时赋默认值
    在这里记录一下怕后面自己忘了,直接看代码吧,这是我数据库需要查询的两张表--库区表select*fromReservoir--仓库表select*fromWarehouse 需要的效果是将同一库区下的仓库的仓库名合并到同一字段中在进行查询,就是下图的效果--将多个查询出的字段拼接到一个......