|
@@ -0,0 +1,103 @@ |
|
|
|
|
|
# -- coding: UTF-8 |
|
|
|
|
|
import cv2 |
|
|
|
|
|
import matplotlib.pyplot as plt |
|
|
|
|
|
from sklearn.cluster import KMeans |
|
|
|
|
|
import os |
|
|
|
|
|
|
|
|
|
|
|
boundaries = [ |
|
|
|
|
|
([100,80,0],[240,220,110]), # yellow |
|
|
|
|
|
([0,40,50],[110,180,250]), # blue |
|
|
|
|
|
([0,60,0],[60,160,70]), # green |
|
|
|
|
|
] |
|
|
|
|
|
color_attr = ["黄牌","蓝牌",'绿牌','白牌','黑牌'] |
|
|
|
|
|
|
|
|
|
|
|
threhold_green = 13 |
|
|
|
|
|
threhold_blue = 13 |
|
|
|
|
|
threhold_yellow1 = 50 |
|
|
|
|
|
threhold_yellow2 = 70 |
|
|
|
|
|
|
|
|
|
|
|
# plt.figure() |
|
|
|
|
|
# plt.axis("off") |
|
|
|
|
|
# plt.imshow(image) |
|
|
|
|
|
# plt.show() |
|
|
|
|
|
|
|
|
|
|
|
import numpy as np |
|
|
|
|
|
def centroid_histogram(clt): |
|
|
|
|
|
numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1) |
|
|
|
|
|
(hist, _) = np.histogram(clt.labels_, bins=numLabels) |
|
|
|
|
|
|
|
|
|
|
|
# normalize the histogram, such that it sums to one |
|
|
|
|
|
hist = hist.astype("float") |
|
|
|
|
|
hist /= hist.sum() |
|
|
|
|
|
|
|
|
|
|
|
# return the histogram |
|
|
|
|
|
return hist |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def plot_colors(hist, centroids): |
|
|
|
|
|
bar = np.zeros((50, 300, 3), dtype="uint8") |
|
|
|
|
|
startX = 0 |
|
|
|
|
|
|
|
|
|
|
|
for (percent, color) in zip(hist, centroids): |
|
|
|
|
|
|
|
|
|
|
|
endX = startX + (percent * 300) |
|
|
|
|
|
cv2.rectangle(bar, (int(startX), 0), (int(endX), 50), |
|
|
|
|
|
color.astype("uint8").tolist(), -1) |
|
|
|
|
|
startX = endX |
|
|
|
|
|
|
|
|
|
|
|
# return the bar chart |
|
|
|
|
|
return bar |
|
|
|
|
|
|
|
|
|
|
|
def search_boundaries(color): |
|
|
|
|
|
for i,color_bound in enumerate(boundaries): |
|
|
|
|
|
if np.all(color >= color_bound[0]) and np.all(color <= color_bound[1]): |
|
|
|
|
|
return i |
|
|
|
|
|
return -1 |
|
|
|
|
|
|
|
|
|
|
|
def judge_color(color): |
|
|
|
|
|
r = color[0] |
|
|
|
|
|
g = color[1] |
|
|
|
|
|
b = color[2] |
|
|
|
|
|
if g - r >= threhold_green and g - b >= threhold_green: |
|
|
|
|
|
return 2 |
|
|
|
|
|
if b - r >= threhold_blue and b - g >= threhold_blue: |
|
|
|
|
|
return 1 |
|
|
|
|
|
if r- b > threhold_yellow2 and g - b > threhold_yellow2: |
|
|
|
|
|
return 0 |
|
|
|
|
|
if r > 200 and b > 200 and g > 200: |
|
|
|
|
|
return 3 |
|
|
|
|
|
if r < 50 and b < 50 and g < 50: |
|
|
|
|
|
return 4 |
|
|
|
|
|
return -1 |
|
|
|
|
|
|
|
|
|
|
|
def judge_plate_color(img): |
|
|
|
|
|
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) |
|
|
|
|
|
image = image.reshape((image.shape[0] * image.shape[1], 3)) |
|
|
|
|
|
clt = KMeans(n_clusters=2) |
|
|
|
|
|
clt.fit(image) |
|
|
|
|
|
|
|
|
|
|
|
hist = centroid_histogram(clt) |
|
|
|
|
|
index = np.argmax(hist) |
|
|
|
|
|
#print clt.cluster_centers_[index] |
|
|
|
|
|
#color_index = search_boundaries(clt.cluster_centers_[index]) |
|
|
|
|
|
color_index = judge_color(clt.cluster_centers_[index]) |
|
|
|
|
|
if color_index == -1: |
|
|
|
|
|
if index == 0: |
|
|
|
|
|
secound_index = 1 |
|
|
|
|
|
else: |
|
|
|
|
|
secound_index = 0 |
|
|
|
|
|
color_index = judge_color(clt.cluster_centers_[secound_index]) |
|
|
|
|
|
|
|
|
|
|
|
if color_index == -1: |
|
|
|
|
|
print clt.cluster_centers_ |
|
|
|
|
|
bar = plot_colors(hist, clt.cluster_centers_) |
|
|
|
|
|
# show our color bart |
|
|
|
|
|
plt.figure() |
|
|
|
|
|
plt.axis("off") |
|
|
|
|
|
plt.imshow(bar) |
|
|
|
|
|
plt.show() |
|
|
|
|
|
|
|
|
|
|
|
if color_index != -1: |
|
|
|
|
|
return color_attr[color_index],clt.cluster_centers_[index] |
|
|
|
|
|
else: |
|
|
|
|
|
return None,clt.cluster_centers_[index] |