OpenCVSharp 基于特征的图像拼接
生活随笔
收集整理的這篇文章主要介紹了
OpenCVSharp 基于特征的图像拼接
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
拼接有多個意思,有的只是簡單的兩個圖片懟成一張圖,比如這樣:
?
懟成這樣:
?
OpenCVSharp 有這樣的函數,簡單說一下,就不上完整代碼了:
//上下拼接 兩圖像寬度必須一樣 Cv2.VConcat(srcImg1, srcImg2, ret);//左右拼接 兩圖像高度必須一樣 Cv2.HConcat(srcImg1, srcImg2, ret);?
但多數時候,我們要拼接的圖像們之間是有重合的部分,比如這樣:
?
?
對于這種場景,OpenCVSharp 提供了一個用于 圖像拼接的 拼接器?Stitcher:
//智能拼接,圖像們有共同的重疊部分Mat srcImg2 = new Mat(strImg2);Mat srcImg3 = new Mat(strImg3);Mat[] images = new Mat[] { srcImg2, srcImg3 }; //數量兩個以上Stitcher stitcher = Stitcher.Create(Stitcher.Mode.Scans);Mat pano = new Mat();var status = stitcher.Stitch(images, pano);if (status != Stitcher.Status.OK){Console.WriteLine("失敗:" + status.ToString());return;}?
Stitcher 對于沒有透視變形的圖片們拼接效果較好,如果有透視變形,就不適用了,因為它會發生這樣的事情:
?
雖然是拼到一起了,但因為兩個照片是從不同的視角拍的,拼接后的圖像是扭曲的,我們可能更想要這樣的效果:
?
?
這時我們就要用到 基于特征的圖像拼接:
int w = img2.Width;int h = img2.Height;Mat img0 = new Mat(new Size(w * 2, h * 2), img2.Type());img0[0, h, w, w + w] = img2;ORB orb = ORB.Create(10000);Mat dscrip1 = new Mat();Mat dscrip2 = new Mat();orb.DetectAndCompute(img1, null, out KeyPoint[] keyPoint1, dscrip1);orb.DetectAndCompute(img0, null, out KeyPoint[] keyPoint2, dscrip2);// 暴力匹配BFMatcher matcher = new BFMatcher(NormTypes.Hamming, true);DMatch[] match = matcher.Match(dscrip1, dscrip2);match = match.OrderBy(x => x.Distance).ToArray();var goodmatch = match.Take(1600);if (goodmatch.Count() < 4) return;//畫出匹配關系Mat outImg = new Mat();Cv2.DrawMatches(img1, keyPoint1, img0, keyPoint2, goodmatch, outImg, flags: DrawMatchesFlags.DrawRichKeypoints | DrawMatchesFlags.NotDrawSinglePoints);Cv2.ImShow("ORB", outImg);// 提取匹配的位置var pointsSrc = new List<Point2f>();var pointsDst = new List<Point2f>();foreach (var m in goodmatch){pointsSrc.Add(keyPoint1[m.QueryIdx].Pt);pointsDst.Add(keyPoint2[m.TrainIdx].Pt);}var pSrc = pointsSrc.ConvertAll(Point2fToPoint2d);var pDst = pointsDst.ConvertAll(Point2fToPoint2d);//獲得變換矩陣var M = Cv2.FindHomography(pSrc, pDst, HomographyMethods.Ransac);Console.WriteLine(M);Console.WriteLine(Cv2.Format(M));// 對 img1 透視變換var result = new Mat();Cv2.WarpPerspective(img1, result, M, new Size(w * 2, h * 2));// 將img2拼接到結果result[0, h, w, w + w] = img2;?
總結
以上是生活随笔為你收集整理的OpenCVSharp 基于特征的图像拼接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 去掉首尾空格
- 下一篇: 二维爆管分析