Computer Vision, Plate Recognition Project

Kategori: MATLAB , 11 Ağustos 2019 , JanFranco


Bu yazımda araçların plakalarındaki harf ve sayıları tespit edeceğiz. Daha sonrasında plakayı yazıya dökeceğiz. İlk olarak veri kümesini oluşturalım:


directory = dir('train');

fileNames = {directory.name};
fileNames = fileNames(3:end);

images = cell(2, length(fileNames));

for i=1:length(fileNames)
    images(1,i) = {imread(['train', '\', cell2mat(fileNames(i))])};
    fileName = cell2mat(fileNames(i));
    images(2,i) = {fileName(1)};
end

save('img_data.mat', 'images');
Burada train klasöründeki dosya isimlerini aldık. for döngüsü ile dosya isimlerini kullanarak imread() fonksiyonu ile resimleri aldık ve bir veri kümesi oluşturduk. save() fonksiyonu ile veri kümesini kaydettik. Başka bir dosya açtığımızı düşünelim. load() fonksiyonu ile veri kümesini alalım:


load('img_data.mat');
Kullanıcıya bir resim seçtirelim. Kullanıcının seçtiği resmi imread() ile okuyalım:


[file, filePath] = uigetfile({'*.jpg'; '*.bmp'}, 'Select an image');
file = [filePath, file];
image = imread(file);
Resmi yeninden boyutlandıralım ve eğer resim renkli ise yani RGB değerleri mevcut ise resmi grayscale resme çevirelim:


[~,dimension] = size(image);
image = imresize(image, [300 500]);
if size(image, 3) == 3
    image = rgb2gray(image);
end
Elimizde 300x500 boyutunda grayscale bir resim mevcut. Default olarak Otsu'nun methodunu kullanan imbinarize() fonksiyonu ile bir threshold değeri belirleyelim ve değerin üstünde kalan pikselleri 1 altında kalan pikselleri 0'a çevirelim.


image = imbinarize(image);
figure,imshow(image);

plate recognition
Resimdeki beyaz kısımları siyah, siyah kısımları beyaz yapalım:


reversedImage = ~image;
figure,imshow(reversedImage);

plate recognition
bwareaopen() fonksiyonu ile 3500 birim alandan büyük olan objeleri silelim. Daha sonra binary resim ile elde ettiğimiz resmi birbirinden çıkaralım:


if dimension > 2000
    clearedImage = bwareaopen(reversedImage, 3500);
else
    clearedImage = bwareaopen(reversedImage, 3000);
end
figure,imshow(clearedImage);

plate = reversedImage - clearedImage;
plate = bwareaopen(plate, 250);
figure,imshow(plate);

plate recognition
Bu işlemi yapmamızın sebebi plaka dışındaki objeleri temizlemekti. bwlabel() fonksiyonu ile objeleri etiketleyelim ve BoundingBox bilgisini alalım:


[tags, Objects] = bwlabel(plate);
objectProperties = regionprops(tags,'BoundingBox');
Objelerin etrafına BoundingBox bilgilerini kullanarak dikdörtgenler çizelim:


hold on

for n=1:size(objectProperties, 1)
    rectangle('Position', objectProperties(n).BoundingBox, 'EdgeColor', 'g', 'LineWidth', 2);
end

hold off
Buraya kadar yaptığımız işlemlerle resmi hazır hale getirdik. Şimdi train klasöründeki harf ve sayı resimlerini kullanarak plakayı yazıya dökelim. Algoritma şu şekilde çalışacak, her bir obje için (plakadaki karakterler) train klasöründeki resimler ile karşılaştırılma yapılacak ve correlation değeri bulunacak. Yani benzerlik kat sayısı. Bu değer 0.4 üzeri ise bizim için doğru sonuç diyeceğiz:


figure

output = [];
t = [];

for n=1:Objects
    [r, c] = find(tags == n);
    char = plate(min(r):max(r), min(c):max(c));
    char = imresize(char, [42,24]);
    figure,imshow(char);
    
    x = [];
    noChar = size(images,2);
    
    for k=1:noChar
        y = corr2(images{1,k}, char);
        x = [x y];
    end
    
    t = [t max(x)];
    
    if max(x) > 0.4
        biggestIndex = find(x == max(x));
        outputChar = cell2mat(images(2, biggestIndex));
        output = [output, outputChar];
    end
end

plate recognition
Tüm işlemler bittiğinde output değişkeni: 'UP14CB7145'. Diğer projeler gibi bu projeyi de github hesabımda paylaşacağım. Matlab-projects klasöründe train ve test klasörlerini görebilirsiniz.


Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın