mirror of
https://github.com/3x4byte/StreetsignRecognition.git
synced 2025-12-21 01:15:52 +00:00
added corners,edges,counters to FV
This commit is contained in:
@@ -1,50 +0,0 @@
|
|||||||
import cv2
|
|
||||||
import numpy as np
|
|
||||||
from os import walk
|
|
||||||
import csv
|
|
||||||
|
|
||||||
def detect_corners(gray_image, max_corners=100, quality_level=0.14, min_distance=1):
|
|
||||||
corners = cv2.goodFeaturesToTrack(cv2.blur(gray_image, (5,5)), maxCorners=max_corners, qualityLevel=quality_level, minDistance=min_distance)
|
|
||||||
if corners is not None:
|
|
||||||
corners = np.int0(corners)
|
|
||||||
return len(corners), corners
|
|
||||||
else:
|
|
||||||
return 0, []
|
|
||||||
|
|
||||||
def detect_edges(gray_image):
|
|
||||||
edges = cv2.Canny(cv2.blur(gray_image, (5,5)), threshold1=100, threshold2=200)
|
|
||||||
edge_count = np.count_nonzero(edges)
|
|
||||||
return edge_count, edges
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def detect_contours(edge_image):
|
|
||||||
contours, _ = cv2.findContours(edge_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
|
||||||
contour_count = len(contours)
|
|
||||||
return contour_count, contours
|
|
||||||
|
|
||||||
|
|
||||||
def feature_vector(image_path):
|
|
||||||
resultVector = {}
|
|
||||||
img = cv2.imread(image_path)
|
|
||||||
image_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
||||||
|
|
||||||
corners_count, _ = detect_corners(image_gray)
|
|
||||||
edges_count, edges = detect_edges(image_gray)
|
|
||||||
contours_count, _ = detect_contours(edges)
|
|
||||||
|
|
||||||
resultVector["corners"] = corners_count % 100
|
|
||||||
resultVector["edges"] = edges_count / 1000
|
|
||||||
resultVector["contours"] = contours_count * 0.1
|
|
||||||
|
|
||||||
return resultVector
|
|
||||||
|
|
||||||
|
|
||||||
filenames = next(walk("images"), (None, None, []))[2] # [] if no file
|
|
||||||
|
|
||||||
with open('dict.csv', 'w') as csv_file:
|
|
||||||
writer = csv.DictWriter(csv_file, fieldnames=['corners', 'edges', 'contours'])
|
|
||||||
writer.writeheader()
|
|
||||||
for filename in filenames:
|
|
||||||
result = feature_vector(f'images/{filename}')
|
|
||||||
writer.writerow(result)
|
|
||||||
@@ -1 +1,2 @@
|
|||||||
opencv-python
|
opencv-python
|
||||||
|
np
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
import os
|
import os
|
||||||
|
import csv
|
||||||
import cv2 as cv
|
import cv2 as cv
|
||||||
|
|
||||||
from featue_extraction import get_color_percentage, get_raster_color_percentage
|
from featue_extraction import get_color_percentage, get_raster_color_percentage, get_edges, get_corners, get_contours
|
||||||
from feature_vector import FeatureVector
|
from feature_vector import FeatureVector
|
||||||
from concept import Concept
|
from concept import Concept
|
||||||
from feature import Feature
|
from feature import Feature
|
||||||
|
|
||||||
img_path = "D:/uni/master/machine_learning/StreetsignRecognition/data/processed"
|
img_path = "/Users/denysseredenko/StreetsignRecognition/data"
|
||||||
vector_path = "D:/uni/master/machine_learning/StreetsignRecognition/data/vectors"
|
vector_path = "/Users/denysseredenko/StreetsignRecognition/vector"
|
||||||
|
|
||||||
def get_concept(path) -> Concept:
|
def get_concept(path) -> Concept:
|
||||||
if "fahrtrichtung_links" in path:
|
if "fahrtrichtung_links" in path:
|
||||||
@@ -36,12 +37,18 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
for fname in fnames:
|
for fname in fnames:
|
||||||
image_path = os.path.join(dirpath, fname)
|
image_path = os.path.join(dirpath, fname)
|
||||||
|
print(image_path)
|
||||||
try:
|
try:
|
||||||
# extract features
|
# prepare image
|
||||||
image = cv.imread(image_path)
|
image = cv.imread(image_path)
|
||||||
|
gray_image = cv.imread(image_path, cv.IMREAD_GRAYSCALE)
|
||||||
|
#extract features
|
||||||
color_percentage_overall = get_color_percentage(image)
|
color_percentage_overall = get_color_percentage(image)
|
||||||
color_percentage_rasters = get_raster_color_percentage(image, 4, 4)
|
color_percentage_rasters = get_raster_color_percentage(image, 4, 4)
|
||||||
# add more
|
edges_amount, edged_image = get_edges(gray_image)
|
||||||
|
edges_amount = round(edges_amount / 1000)
|
||||||
|
corners_amount = get_corners(gray_image)
|
||||||
|
contours_amount = get_contours(edged_image)
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
print("Failed for ", image_path)
|
print("Failed for ", image_path)
|
||||||
@@ -53,9 +60,12 @@ if __name__ == "__main__":
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
vec: FeatureVector = FeatureVector(concept)
|
vec: FeatureVector = FeatureVector(concept)
|
||||||
|
vec.add_feature(Feature.CORNERS, corners_amount)
|
||||||
|
vec.add_feature(Feature.EDGES, edges_amount)
|
||||||
|
vec.add_feature(Feature.COUNTOURS, contours_amount)
|
||||||
vec.add_feature(Feature.OVERALL_COLOR_PERCENTAGE, color_percentage_overall)
|
vec.add_feature(Feature.OVERALL_COLOR_PERCENTAGE, color_percentage_overall)
|
||||||
vec.add_feature(Feature.RASTER_COLOR_PERCENTAGE, color_percentage_rasters)
|
vec.add_feature(Feature.RASTER_COLOR_PERCENTAGE, color_percentage_rasters)
|
||||||
# add more
|
|
||||||
print(vec.get_vector())
|
print(vec.get_vector())
|
||||||
vec_path = os.path.join(save_path, fname)
|
vec_path = os.path.join(save_path, fname.split('.')[0])
|
||||||
vec.save(vec_path)
|
vec.save(vec_path)
|
||||||
@@ -67,3 +67,23 @@ def get_raster_color_percentage(image: cv.Mat, rows: int, cols: int) -> list[lis
|
|||||||
ret.append(new)
|
ret.append(new)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
def get_edges(gray_image: cv.Mat):
|
||||||
|
edges = cv.Canny(cv.blur(gray_image, (5,5)), threshold1=100, threshold2=200)
|
||||||
|
edge_count = np.count_nonzero(edges)
|
||||||
|
return edge_count, edges
|
||||||
|
|
||||||
|
def get_corners(gray_image: cv.Mat):
|
||||||
|
max_corners = 100
|
||||||
|
quality_level = 0.14
|
||||||
|
min_distance = 1
|
||||||
|
corners = cv.goodFeaturesToTrack(cv.blur(gray_image, (5,5)), maxCorners=max_corners, qualityLevel=quality_level, minDistance=min_distance)
|
||||||
|
if corners is not None:
|
||||||
|
corners = np.int0(corners)
|
||||||
|
return len(corners)
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def get_contours(edged_gray_image: cv.Mat):
|
||||||
|
contours, _ = cv.findContours(edged_gray_image, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
|
||||||
|
contour_count = len(contours)
|
||||||
|
return contour_count
|
||||||
|
|||||||
@@ -5,3 +5,4 @@ class Feature(Enum):
|
|||||||
RASTER_COLOR_PERCENTAGE = auto()
|
RASTER_COLOR_PERCENTAGE = auto()
|
||||||
CORNERS = auto()
|
CORNERS = auto()
|
||||||
EDGES = auto()
|
EDGES = auto()
|
||||||
|
COUNTOURS = auto()
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ class FeatureVector:
|
|||||||
feature_data: dict
|
feature_data: dict
|
||||||
for val in feature_data.values():
|
for val in feature_data.values():
|
||||||
ret.append(val)
|
ret.append(val)
|
||||||
print(ret)
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
elif feature == Feature.RASTER_COLOR_PERCENTAGE:
|
elif feature == Feature.RASTER_COLOR_PERCENTAGE:
|
||||||
@@ -36,15 +35,17 @@ class FeatureVector:
|
|||||||
for data in feature_data1d:
|
for data in feature_data1d:
|
||||||
for val in data.values():
|
for val in data.values():
|
||||||
ret.append(val)
|
ret.append(val)
|
||||||
print(ret)
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
elif feature == Feature.CORNERS:
|
elif feature == Feature.CORNERS:
|
||||||
#feature_data: int #?
|
ret.append(feature_data)
|
||||||
return [-1]
|
return ret
|
||||||
elif feature == Feature.EDGES:
|
elif feature == Feature.EDGES:
|
||||||
#feature_data: int #?
|
ret.append(feature_data)
|
||||||
return [-1]
|
return ret
|
||||||
|
elif feature == Feature.COUNTOURS:
|
||||||
|
ret.append(feature_data)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def add_feature(self, key: Feature, value: Any) -> None:
|
def add_feature(self, key: Feature, value: Any) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user