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 csv
|
||||
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 concept import Concept
|
||||
from feature import Feature
|
||||
|
||||
img_path = "D:/uni/master/machine_learning/StreetsignRecognition/data/processed"
|
||||
vector_path = "D:/uni/master/machine_learning/StreetsignRecognition/data/vectors"
|
||||
img_path = "/Users/denysseredenko/StreetsignRecognition/data"
|
||||
vector_path = "/Users/denysseredenko/StreetsignRecognition/vector"
|
||||
|
||||
def get_concept(path) -> Concept:
|
||||
if "fahrtrichtung_links" in path:
|
||||
@@ -36,26 +37,35 @@ if __name__ == "__main__":
|
||||
|
||||
for fname in fnames:
|
||||
image_path = os.path.join(dirpath, fname)
|
||||
print(image_path)
|
||||
try:
|
||||
# extract features
|
||||
# prepare image
|
||||
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_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:
|
||||
print("Failed for ", image_path)
|
||||
continue
|
||||
|
||||
|
||||
concept: Concept = get_concept(image_path)
|
||||
if concept == Concept.UNKNOWN:
|
||||
print("no concept found for ", image_path)
|
||||
continue
|
||||
|
||||
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.RASTER_COLOR_PERCENTAGE, color_percentage_rasters)
|
||||
# add more
|
||||
|
||||
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)
|
||||
@@ -67,3 +67,23 @@ def get_raster_color_percentage(image: cv.Mat, rows: int, cols: int) -> list[lis
|
||||
ret.append(new)
|
||||
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()
|
||||
CORNERS = auto()
|
||||
EDGES = auto()
|
||||
COUNTOURS = auto()
|
||||
|
||||
@@ -26,7 +26,6 @@ class FeatureVector:
|
||||
feature_data: dict
|
||||
for val in feature_data.values():
|
||||
ret.append(val)
|
||||
print(ret)
|
||||
return ret
|
||||
|
||||
elif feature == Feature.RASTER_COLOR_PERCENTAGE:
|
||||
@@ -36,15 +35,17 @@ class FeatureVector:
|
||||
for data in feature_data1d:
|
||||
for val in data.values():
|
||||
ret.append(val)
|
||||
print(ret)
|
||||
return ret
|
||||
|
||||
elif feature == Feature.CORNERS:
|
||||
#feature_data: int #?
|
||||
return [-1]
|
||||
ret.append(feature_data)
|
||||
return ret
|
||||
elif feature == Feature.EDGES:
|
||||
#feature_data: int #?
|
||||
return [-1]
|
||||
ret.append(feature_data)
|
||||
return ret
|
||||
elif feature == Feature.COUNTOURS:
|
||||
ret.append(feature_data)
|
||||
return ret
|
||||
|
||||
|
||||
def add_feature(self, key: Feature, value: Any) -> None:
|
||||
|
||||
Reference in New Issue
Block a user