تشخیص قسمتهای مشابه تصاویر در OpenCV
در شکل زیر، دو تصویر سمت چپ و راست، اندکی با هم تفاوت دارند و در تصویر سوم، نقاط مشابه یافت شدهی توسط OpenCV ترسیم شدهاند:
کدهای مثال فوق را در ذیل مشاهده میکنید:
در ابتدا نیاز به یک تشخیص دهنده یا Detector داریم. در OpenCVSharp، الگوریتمها و کلاسهای FastFeatureDetector, StarDetector, SIFT, SURF, ORB, BRISK, MSER, GFTTDetector, DenseFeatureDetector, SimpleBlobDetector برای اینکار قابل استفاده هستند. برای مثال در اینجا از الگوریتم SURF آن استفاده شدهاست.
کار این تشخیص دهنده، تشخیص نقاط کلیدی تصاویر است. برای مثال تشخیص گوشهها، لبهها و غیره.
سپس اطلاعات نواحی اطراف هر نقطهی کلیدی را تحت عنوان descriptors استخراج میکنیم.
بعد از محاسبهی نقاط کلیدی هر تصویر، اینبار نیاز است این نقاط را بین دو تصویر با هم مقایسه کرد و مشابهها را یافت. برای مثال الگوریتم BFMatcher یک Brute force matcher است که بر اساس اطلاعات نواحی اطراف هر نقطهی کلیدی، سعی در یافتن نقاط مشابه میکند.
پس از یافتن نقاط مشابه، نیاز است بر اساس آنها نگاشتی بین دو تصویر صورت گیرد و مشابهها ترسیم شوند. متد DrawMatches اینکار را انجام میشود.
اگر علاقمند هستید که با ریز جزئیات ریاضی الگوریتمهای استفاده شده نیز آشنا شوید، سری مطالب descriptorsرا دنبال نمائید.
کدهای کامل این مثال را از اینجامیتوانید دریافت کنید.
در شکل زیر، دو تصویر سمت چپ و راست، اندکی با هم تفاوت دارند و در تصویر سوم، نقاط مشابه یافت شدهی توسط OpenCV ترسیم شدهاند:
کدهای مثال فوق را در ذیل مشاهده میکنید:
var img1 = new Mat(@"..\..\Images\left.png", LoadMode.GrayScale); Cv2.ImShow("Left", img1); Cv2.WaitKey(1); // do events var img2 = new Mat(@"..\..\Images\right.png", LoadMode.GrayScale); Cv2.ImShow("Right", img2); Cv2.WaitKey(1); // do events // detecting keypoints // FastFeatureDetector, StarDetector, SIFT, SURF, ORB, BRISK, MSER, GFTTDetector, DenseFeatureDetector, SimpleBlobDetector // SURF = Speeded Up Robust Features var detector = new SURF(hessianThreshold: 400); //SurfFeatureDetector var keypoints1 = detector.Detect(img1); var keypoints2 = detector.Detect(img2); // computing descriptors, BRIEF, FREAK // BRIEF = Binary Robust Independent Elementary Features var extractor = new BriefDescriptorExtractor(); var descriptors1 = new Mat(); var descriptors2 = new Mat(); extractor.Compute(img1, ref keypoints1, descriptors1); extractor.Compute(img2, ref keypoints2, descriptors2); // matching descriptors var matcher = new BFMatcher(); var matches = matcher.Match(descriptors1, descriptors2); // drawing the results var imgMatches = new Mat(); Cv2.DrawMatches(img1, keypoints1, img2, keypoints2, matches, imgMatches); Cv2.ImShow("Matches", imgMatches); Cv2.WaitKey(1); // do events Cv2.WaitKey(0); Cv2.DestroyAllWindows(); img1.Dispose(); img2.Dispose();
کار این تشخیص دهنده، تشخیص نقاط کلیدی تصاویر است. برای مثال تشخیص گوشهها، لبهها و غیره.
سپس اطلاعات نواحی اطراف هر نقطهی کلیدی را تحت عنوان descriptors استخراج میکنیم.
بعد از محاسبهی نقاط کلیدی هر تصویر، اینبار نیاز است این نقاط را بین دو تصویر با هم مقایسه کرد و مشابهها را یافت. برای مثال الگوریتم BFMatcher یک Brute force matcher است که بر اساس اطلاعات نواحی اطراف هر نقطهی کلیدی، سعی در یافتن نقاط مشابه میکند.
پس از یافتن نقاط مشابه، نیاز است بر اساس آنها نگاشتی بین دو تصویر صورت گیرد و مشابهها ترسیم شوند. متد DrawMatches اینکار را انجام میشود.
اگر علاقمند هستید که با ریز جزئیات ریاضی الگوریتمهای استفاده شده نیز آشنا شوید، سری مطالب descriptorsرا دنبال نمائید.
کدهای کامل این مثال را از اینجامیتوانید دریافت کنید.