فرض کنید تصویر یک شی را دارید و میخواهید آن شی را در یک تصویر پیدا کنید. به این کار بازشناسی میگویند. در این پست یا استفاده از OpenCV و نقاط کلیدی که با استفاده از روش ORB استخراج میشود این کار را انجام میدهیم.
keypoint یا همان نقاط کلیدی یک سری نقاط در تصویر هستند که دارای ویژگیهای خاصی هستند. تعریفهای مختلفی میتوان ارائه داد به عنوان مثال محل برخورد لبهها و یا گوشهها را میتوان نقطه کلیدی در نظر گرفت. بهطور مثال میتوان محل برخورد لبهها در تصویر را به عنوان نقطه کلیدی در نظر گرفت.
روشهای مختلفی برای برای استخراجی نقاط کلیدی وجود دارد که میتوان به SIFT،SURF،FAST و ORB اشاره کرد. هر کدام یک سری خاصیتها دارند. مثلا بعضی از آنها نسبت به چرخش حساس نیستند یا بعضی از آنها نسبت به تغییر مقیاس تصویر حساس نیستند. میتوان با یک سرچ ویژگیهای هر کدام را پیدا کرد و براساس کاربرد از استخراج کننده نقاط کلیدی مناسب استفاده کرد. ما در این روش از ORB استفاده میکنیم. در صورت علاقه میتوانید مقالههای مربوط به این روشها را بخوانید.
دانستن نقاط کلیدی به تنهایی کافی نیست. برای اینکه بتوان یک نقطه کلیدی را در تصویر جدید پیدا کرد نیاز به توصیفگر یا descriptor است. توصیفگر یک بردار ویژگی است که برای یک نقطه کلیدی استخراج میشود و با توجه اطلاعات مختلفی مثلا نحوه تغییر شدت روشنایی در اطراف نقطه کلیدی به دست میآید. فرض کنید یک انسان یک نقطه کلیدی باشد آنگاه قد، رنگ چشم، جنسیت، رنگ پوست، رنگ مو توصیفگرهای آن میشود.
با اسخراج نقاط کلیدی در دو تصویر و مقایسه بردار ویژگی نقاط کلیدی (توصیفگرها) میتوان نقاط کلیدی متناظر در دو تصویر را پیدا کرد و اینگونه یک شی را درون یک تصویر پیدا کرد.
برای این کار کد زیر را نوشتهایم:
import cv2 # read image 1 img1 = cv2.imread(filename='books1.JPG') # read image 2 img2 = cv2.imread(filename='books3.JPG') # to gray scale img1_gray = cv2.cvtColor(src=img1, code=cv2.COLOR_BGR2GRAY) img2_gray = cv2.cvtColor(src=img2, code=cv2.COLOR_BGR2GRAY) # orb object orb_obj = cv2.ORB_create(nfeatures=1500) # extract sift keypoints and descriptor for both images key_point_1, descriptor_1 = orb_obj.detectAndCompute(image=img1_gray, mask=None) key_point_2, descriptor_2 = orb_obj.detectAndCompute(image=img2_gray, mask=None) # draw keypoints img_1_keypoints = cv2.drawKeypoints(image=img1, keypoints=key_point_1, outImage=img1_gray) img_2_keypoints = cv2.drawKeypoints(image=img2, keypoints=key_point_2, outImage=img2_gray) # keypoints matcher norm = cv2.NORM_L2 bruteForce = cv2.BFMatcher(norm) # match keypoints in both image matches = bruteForce.match(queryDescriptors=descriptor_1, trainDescriptors=descriptor_2) # select proper matches matches = sorted(matches, key=lambda match: match.distance) matches = matches[:100] # draw matches matched_img = cv2.drawMatches(img1=img1, keypoints1=key_point_1, img2=img2, keypoints2=key_point_2, matches1to2=matches, outImg=img2.copy()) cv2.imshow(winname='img1_keypoint', mat=img_1_keypoints) cv2.imshow(winname='img2_keypoint', mat=img_2_keypoints) cv2.imshow(winname='matched_img', mat=matched_img) cv2.waitKey()
imread دستور است که برای خواندن تصویر استفاده میشود و با استفاده از آن تصویر شی و تصویر صحنه را خواندهایم.
cvtColor دستوری است که با استفاده از آن تصویرهای رنگی را بهصورت سطح خاکستری در میآوریم.
ORB_create دستوری است که با استفاده از آن یک استخراج کننده نقاط و توصیفگر نقاط کلیدی ORB را با استفاده از آن ایجاد میکنیم.
detectAndCompute دستوری است که نقاط کلیدی را استخراج میکند و آنها را به همراه توصیفگرهایشان باز میگرداند.
drawKeypoints دستوری است که با استفاده از آن نقاط کلیدی را در تصویر رسم میکنیم.
BFMatcher دستوری است که با استفاده از آن یک منطبق کننده نقاط کلیدی ساخته میشود. کار منطبق کننده نقاط کلیدی این است که یک سری توصیفگر بگیرد و براساس فاصله بردارهای توصیفگرها مشخص کنند کدام نقاط کلیدی با یکدیگر منطبق هستند. که این کار با دستور match انجام میشود.
همانطور که در کد نشان داده شده است برای حفظ کیفیت تطابقها، بر اساس فاصله بردارهای ویژگی آنها را مرتب کردهایم و فقط ۱۰۰ تطبیق اول را که کمترین فاصله را با هم داشتهاند حفظ کردهایم.
drawMatches دو تصویر را رسم میکند و نقاط کلیدی که متناظر را در دو تصویر نشان میدهد.
از دو تصویر زیر برای این کار استفاده کردهایم:
هدف پیدا کردن کتاب در تصویر دوم است. همانطور که در دو تصویر دیده میشود، کتاب از نظر فاصله، نور پردازی، جهت قرارگیری و … در دو تصویر بسیار متفاوت است.
در دو تصویر زیر نقاط کلیدی استخراج شده نمایش داده شدهاست
در تصویر زیر نقاط کلیدی متناظر پیدا شده مشخص شده است
با استفاده از این کار میتوان کلی کارهای متفاوت انجام داد.
نوشته بازشناسی یک شی در تصویر با استفاده از OpenCV اولین بار در اوپن مایند. پدیدار شد.