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)