1. 磐创AI首页
  2. Medium

OpenCV ile Nesnelerin Profillerini圣ı业力

Geçtiğimiz YazıMDA OpenCV in uzunluklarınıbulma konusundan bahsetmiştim[3]。Bu Yazımızda ise PCA yönteminden Elde ettiğimiz simetriçizgimiz ile nesnelerin kritik noktalarınıçıkarmaya odaklanacağız.Biröznitelikçıkarım yöntemi Profilçıkarma nelerinşekill eri hakkıdaha fazla bilgi Sahibi olmamızıörneğinşekil olarak Birden Fazlaçeşit anahtarısınıFlandırmak istiyorsak anahtarların yapılarıile ilgili Daha fala bilgiye ihtiyacımız olacaktır.bu duumda anahtarların proilleriniçıkarmak oldukçaşimize ya ayacaktır.başkaBu Yazımızda Profilçıkarma yönteminden nesnelerin kritik noktalarıarasında Kalan bölgenin Yaklaşık uzunluğUNU bulmak için ya arlanacağız.

https://github.com/helinozgur/Measurements-With-OpenCV-PCA:Yazıda Verilen Kodlarhttps://github.com/helinozgur/Measurements-With-OpenCV-PCA

阿纳赫塔尔·克利梅勒:OpenCV,OCR,GörüntüİşLeme,Bilgisayar Görüsü,ProfileSaintıKarma,Karakter Analizi

您的位置:我也知道>生活/生活>ıKarma Nedir?

şcismin veya karakterin dışşeklini tanımlamak Için belirli noktalar arasımesafeyi hesaplar.ından x veya y koedatıdoğrultusundaçizilmişBir simetriçizgisinden başlayıp Konturün Kenar noktalarına Kadar Olan Piksel uzunluğudur.

Profilçıkarma yöntemi karakter analyizi yapmada karakterinöznitelikleriniçıkarmak Için kullanılan bir yöntemdir ve genelde iki adımdan oluşur.1.Üst-Alt Profile无ı业力,2.Sağ-Sol Profile无ı业力。

Alt-alt profilçıkarma yöntemindeöncelikle yatay doğrultuda karakter görüsüsünüikiye bölecek ve görünün ağırlık merkezinden geçecekşekilde Birçizgi(y=yt)çizilir.Sankizilençizgi ile Görüsınırına(Karakterin dışsınırları)牦牛ın piksellerin arasındaki uzaklık hesaplanır.

SAğ-sol profilçıkarma yönteminde ise Dikey doğrultuda görütüikiye bölecek ve görünün ağırlık merkezinden geçecek Birçizgi(x=xT)çizilir。ındanÜst-alt profilçıkarma yönteminde yaptığımız Gibiçizilençizgi ile görüsınırına yakın piksellerin arasındaki uzaklık hesaplanır.

BIZISE PROFILE ProfilçıKarma yöntemini nesnelerin kritik noktalarının ArasıNDA Kalan kısmın uzunluklarınıbelirleyebilmek Için kullanacağız.Önce cismin konturunun Kenar noktalarınıçıKaracağız.ardından konturün kritik noktalarınNesne tanıma yöntemindeki amacımız ise tanıTTığımız Bir nesne ile Aynıözelliklere sahip başka Bir nesne koyduğumuz Zaman tanıTTığımız nesnenin entiketini Bize döndürmesidir.BU Işlemleri yapabilmek Için deÜst-alt profilçıkarma yönteminden ya arlanacağız.

配置文件圣ı业力:

OPENCELIKLE OpenCV cv2.imread fonksiyonu ile Girdi görüntümüzüalıyoruz.Ardından aldığımız Girdi görütüzübirönceki Yazımızda anlattığımız simetriçizgimizi bulmak Için PCA heasplamasınıyaptığımız fonksiyonumuza göndriyoruz.Ancakönceki yaptıklarımıZdan Farklıolarak Calculate WidthHeight fonksiyonumuza aşağıDaki Satırlarıekledik.

angle_line_dgree = (180 / np.pi) * angle_line
result = 180 + angle_line_dgree
(h, w) = img1.shape[:2]
(cX, cY) = (w // 2, h // 2)
M = cv.getRotationMatrix2D((cX, cY),result, 1.0)
rotated = cv.warpAffine(img1, M, (w, h))

Get Orientation fonksiyonundan aldığımız açıyıkullanarak maske halindeki görselimizi döndürdük.ARDından döndüğümüz Görünüyüve açımızıFonksiyonçıktılarımıza ekledik。CreateProfile is minde Bir fonksiyon oluşturduk,bu fonksiyon Girdi olarak CalculateWidthHeight fonksiyonundan aldığımız açıyıve döndürülmüşgörseli verdik。

def createProfile(self, image,angle):
global line_points, contour_edge
_, bw = cv.threshold(image, self.th_min, self.th_max, cv.THRESH_BINARY)
contours, _ = cv.findContours(bw, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
area_max = max(contours, key=cv.contourArea)

Global değişkenlerimizi tanımladık ve eşikleme fonksiyonumuzdan geçirdik.Eşikleme sonucunda aldığımız görüntüdeki konturleri Bulduk ve maksimum alanlıkonturlu heaspladık.

for indx, i in enumerate(contours):
if cv.contourArea(i) < cv.contourArea(area_max):
continue
mask = np.zeros(image.shape, np.uint8)
contour_edge = cv.drawContours(mask, [i], -1, self.beyaz, 3)
_, _, h, cntr, _ = self.getOrientation(i, contour_edge)
co_h_1, co_h_2, _, contour_image, line = self.getCoordinates(contour_edge, h)
line_points = np.where(line == 255)


Konturleri Bir döngüiçine aldıktan sonra maksimum konturbüyüklüğünden küçük Olan konturleri eliyoruz.BoşBir Maske tanımlıyoruz ve bu maskenin içine Konturiziyoruz.Konturçizili maskeyi sadess simetriçizgisiniçizdirmek Için get Orientation fonksiyonuna gydi olarak veriyoruz.在KontursınırlarıIçerisindeki bölümüve kooratlarınıalıyoruz中协调字体尺寸。Numpy kütüphanesin np.Fonksiyonu ile simetriçizgimizüzerindeki noktalarıBir Demet(Tuple)Içine Aktarıyoruz.

maske = np.zeros(image.shape, np.uint8)
#extreme olmayan noktalar
koordinat_array = []
#extreme noktalar
koordinat_array_extreme = []
mesafe_uzunluk = 0

İşlem yapmak için boşBir Maske tanımlıyoruz ve nesneüzerindeki Extreme Olan ve olmayan noktalar Için Birer liste tanımlıyoruz.

for i in range(0, len(line_points[0]), len(line_points[0]) // 100):
koordinat = (line_points[1][i], image.shape[1])
koordinat_2 = (line_points[1][i], 0)
maske_line = np.zeros(image.shape, np.uint8)
cv.line(maske_line, koordinat, koordinat_2, (255, 255, 255), 1)
line_intersect = np.where(maske_line & contour_edge == 255)

sıfırdan başlayıp simetriçizgimizinüzerindeki noktaların bulunduğu Demet uzunluğunda Yine Aynıdemetin%1‘i Kadar Nokta atlayarak Giden Bir döngütanıMladıK.y ekseni doğrultusunda simetriçizgisindeki Nokta başlangıçnoktası喀布尔版Sacizgi ile cismin Kenar noktalarının Kesişimlerini np.其中Fonksiyonu Yardımıile Bir demeteık.

kesisim_koordinat_ust = (line_intersect[1][0], line_intersect[0][0])
kesisim_koordinat_alt = (line_intersect[1][-1], line_intersect[0][-1])
kesisim_koordinat_h=(line_points[1][i],line_points[0][i])
mesafe = cv.norm(np.array(kesisim_koordinat_alt) - np.array(kesisim_koordinat_ust))
cv.line(maske, kesisim_koordinat_alt, kesisim_koordinat_ust, (255, 255, 255), 1)

KESIşim kochestratlarınıaldık veçizginin cismin Kenar noktasıile kesişen kısmının uzunluğunu bulduk.cv2.line fonksiyonu ile boşolarak tanımladığımız maskemizin içine keişim kocooratlarıbaz alıNarakçizgileriçizdirdik.

if abs(int(mesafe) - mesafe_uzunluk)>20:
koordinat_array_extreme.append([kesisim_koordinat_ust, kesisim_koordinat_alt])
else:
koordinat_array.append([kesisim_koordinat_ust, kesisim_koordinat_alt, mesafe])
mesafe_uzunluk = int(mesafe)

Eğerçizgiler arasımesafe belirli Bir OranıgeçmediğI Tabirde de Extreme de Extreme olmayan listeye eğer Belirlenen Oranınüzerinde ise Extreme noktalar listesine eklenmektedir.Uzunluk değişimini Takip edebilmek Için de mesafe uzunluk değişkenimize en son bulunan uzunluk değerini atadık.

koordinat_array = np.asarray(koordinat_array)
var = koordinat_array[0][2]
mesafe_array = []
maske_result = np.zeros(image.shape, np.uint8)

BAşlangıçkochestratınısimetriçizgisinde bulunan ilk kochestrat olarak tanımladık.BoşBir List e tanımladık ve Sonuçlarıçizdirebilmek Için boşBir Maske tanıMladık.

for i in range(len(koordinat_array)):
mesafe_array.append(koordinat_array[i])
if abs(int(var) - koordinat_array[i][2]) > 30 or i == (len(koordinat_array) - 1):
koordinat_x_y = mesafe_array[(len(mesafe_array) // 2) - 1]
x = koordinat_x_y[0]
y = koordinat_x_y[1]
cv.line(maske_result, x, y, (255, 0, 0), 5)
mesafe_array = []
var = koordinat_array[i][2]

科迪纳特阵列uzunluğunda Bir for döngüsütanımladık ve I.değeri meafe_array listesine ekledik.Ardından Yaklaşık olarak Aynıuzunlukta Olançizgileri karşılaştıRdık ve uzunluklarıAynıOlançizgileri gruplayarak orta noktalarının kochestratlarınıbulup o kochestratlaraçizgimizi maske_result maskemizeçizdirdik.mesafe_array listemizin Içini temizley ip Yeni var değerimizi tanımladık.

result=180 - angle
(h, w) = contour_edge.shape[:2]
(cX, cY) = (w // 2, h // 2)
M = cv.getRotationMatrix2D((cX, cY), result, 1.0)
rotated = cv.warpAffine(maske_result, M, (w, h))

Fonksiyona Girdi olarak Verdiğimiz görüntümüz orijinal görüntünün döndürülmüşbiçimiydi.Sonuçmaskemizi Orijinal Görüntüile Aynıbiçimde olacakşekilde döndürdük.Son olarak da createProfile fonksiyonumuz Bize旋转isimli görüntümüzüdündüdü。

import cv2
import matplotlib.pyplot as plt
from live_functions import Functions
image=cv2.imread('./images/gorsel3.png')
detector = Functions()
_,_,rotated_img,angle=detector.calculateWidhtHeight(image)
result = detector.createProfile(rotated_img,angle)
result=cv2.cvtColor(result,cv2.COLOR_GRAY2BGR)
btw= cv2.bitwise_or(result,image)
cv2.imshow("Profil",cv2.resize(btw,None,None,.25,.25))

Tekrardan Ana Kodumuza Glediğimizde Create Profile fonksiyonundan aldığımızçıktıgörününümyk(mavi-yeşil-kırmızı)renk dönüşümüyaptık ve orijinal Girdi görüntümüz ile cv2.bitwise_or fonksiyonun da yardımıile

CıvatalarÜzerinde Sonuçlar:

Kaynakça:

[1]孤立手写希腊语characters-https://www.researchgate.net/publication/234803723_Hybrid_off-line_OCR_for_isolated_handwritten_Greek_characters的混合离线光学字符识别https://www.researchgate.net/publication/234803723_Hybrid_off-line_OCR_for_isolated_handwritten_Greek_characters

[2]改进的草书字符recognition-https://www.researchgate.net/publication/267845216_Improved_statistical_features_for_cursive_character_recognition统计特征https://www.researchgate.net/publication/267845216_Improved_statistical_features_for_cursive_character_recognition

[3][3]Bulma-https://helinozgur.medium.com/opencv-ile-simetrik-cisimlerin-uzunluklar%C4%B1n%C4%B1-bulma-841f377e8f33)ınıOpenCV-Simetrik Cisimlerin ununluklar n OpenCVhttps://helinozgur.medium.com/opencv-ile-simetrik-cisimlerin-uzunluklar%C4%B1n%C4%B1-bulma-841f377e8f33

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/07/13/opencv-ile-nesnelerin-profillerini%e5%9c%a3i%e4%b8%9a%e5%8a%9b/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息