Contours : More Functions

  • مدرس: علی بیگدلی
  • تاریخ انتشار: Sep 05, 2020

هدف

  • نقص های محدب و نحوه یافتن آنها.
  • یافتن کمترین فاصله از یک نقطه تا چند ضلعی
  • مطابقت با اشکال مختلف

1. Convexity Defects

دیدیم که بدنه محدب در فصل دوم در مورد خطوط است. هرگونه انحراف جسم از این بدنه را می توان نقص تحدب دانست.

OpenCV با یک عملکرد ، cv.convexityDefects () آماده برای یافتن این نقص همراه است. فراخوانی عملکرد اصلی مانند زیر است:

hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)

توجه : بخاطر بسپارید برای یافتن نقص تحدب باید مقدار ReturnPoints = false را هنگام پیدا کردن بدنه محدب وارد کنیم.

آرایه ای را برمی گرداند که هر سطر حاوی این مقادیر است - [نقطه شروع ، نقطه پایان ، دورترین نقطه ، فاصله تقریبی تا دورترین نقطه]. با استفاده از یک تصویر می توانیم آن را تجسم کنیم. ما یک خط اتصال به نقطه شروع و نقطه پایان را رسم می کنیم ، سپس یک دایره را در دورترین نقطه رسم می کنیم. به یاد داشته باشید که اولین سه مقدار برگشتی شاخص های cnt هستند. بنابراین ما باید این مقادیر را از cnt بیاوریم.

import cv2
import numpy as np
img = cv2.imread('star.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(img_gray, 127, 255,0)
contours,hierarchy = cv2.findContours(thresh,2,1)
cnt = contours[0]
hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)
for i in range(defects.shape[0]):
    s,e,f,d = defects[i,0]
    start = tuple(cnt[s][0])
    end = tuple(cnt[e][0])
    far = tuple(cnt[f][0])
    cv2.line(img,start,end,[0,255,0],2)
    cv2.circle(img,far,5,[0,0,255],-1)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

و نتیجه را ببینید:

2. Point Polygon Test

این تابع کمترین فاصله بین یک نقطه از تصویر و یک کانتور را پیدا می کند. این فاصله را هنگامی که نقطه خارج از کانتور منفی است ، هنگامی که نقطه در داخل است مثبت و اگر نقطه روی کانتور باشد صفر برمی گرداند.

به عنوان مثال ، می توانیم نقطه (50،50) را به صورت زیر بررسی کنیم:

dist = cv2.pointPolygonTest(cnt,(50,50),True)

در تابع ، آرگومان سوم اندازه گیری است. اگر درست باشد ، فاصله امضا شده را پیدا می کند. اگر False باشد ، می فهمد که این نقطه در داخل یا خارج است یا روی کانتور (به ترتیب +1 ، -1 ، 0 برمی گردد).

توجه :اگر نمی خواهید فاصله را پیدا کنید ، مطمئن شوید که استدلال سوم نادرست است ، زیرا این یک فرآیند زمان بر است. بنابراین ساخت False حدود 2-3 برابر سرعت دارد.

3. Match Shapes

OpenCV دارای یک تابع cv.matchShapes () است که به ما امکان مقایسه دو شکل یا دو خط را می دهد و یک متریک را نشان می دهد که شباهت را نشان می دهد. هرچه نتیجه کمتر باشد ، مطابقت بهتری دارد. براساس مقادیر لحظه hu محاسبه می شود. روش های مختلف اندازه گیری در اسناد توضیح داده شده است.

import cv2
import numpy as np
img1 = cv2.imread('star.jpg',0)
img2 = cv2.imread('star2.jpg',0)
ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
contours,hierarchy = cv2.findContours(thresh2,2,1)
cnt2 = contours[0]
ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print( ret )

سعی کردم اشکال را با اشکال مختلفی که در زیر آورده شده مطابقت دهم:

من نتایج زیر را بدست آوردم:

  • تطبیق تصویر A با خودش = 0.0
  • تطبیق تصویر A با تصویر B = 0.001946
  • تطبیق تصویر A با تصویر C = 0.326911

ببینید ، حتی چرخش تصویر نیز در این مقایسه تأثیر زیادی ندارد.

ثبت دیدگاه
نام *
ایمیل*
دیدگاه *
0دیدگاه