parent
b7d6bf738b
commit
f56c14e2fe
@ -0,0 +1,3 @@ |
||||
{ |
||||
"python.pythonPath": "/usr/bin/python3" |
||||
} |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 86 KiB |
After Width: | Height: | Size: 579 KiB |
@ -0,0 +1,46 @@ |
||||
import cv2 |
||||
import numpy as np |
||||
|
||||
# IT IS WORK !!!!!! |
||||
|
||||
cam = cv2.VideoCapture(0) |
||||
|
||||
while True: |
||||
_, frame = cam.read() |
||||
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) |
||||
hsv = cv2.blur(hsv,(5,5)) |
||||
|
||||
mask = cv2.inRange(hsv, (78,154,93),(86,224,255)) |
||||
|
||||
(contours, hierarchy) = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) |
||||
cv2.drawContours(frame, contours, -1, (255,0,0), 3, cv2.LINE_AA, hierarchy, 1 ) |
||||
|
||||
max_radius = 0 |
||||
center = (0,0) |
||||
|
||||
for contour in contours: |
||||
(x,y),radius = cv2.minEnclosingCircle(contour) |
||||
if max_radius < int(radius): |
||||
max_radius = int(radius) |
||||
center = (int(x),int(y)) |
||||
|
||||
frame = cv2.circle(frame,center,max_radius,(0,255,0),2) |
||||
|
||||
S = 3.1415 * max_radius * max_radius |
||||
cv2.putText(frame, str(S), (30, 30),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 10, 10), 2) |
||||
|
||||
if S > 100: |
||||
if S > 10000: |
||||
cv2.putText(frame, "UP", (30, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 10, 10), 2) |
||||
elif S < 5000: |
||||
cv2.putText(frame, "DOWN", (30, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 10, 10), 2) |
||||
|
||||
#cv2.imshow("Image with opening", mask) |
||||
#cv2.imshow("Image with closing", hsv) |
||||
|
||||
cv2.imshow("Image", frame) |
||||
|
||||
k = cv2.waitKey(2) |
||||
if k == 27: |
||||
cv2.destroyAllWindows() |
||||
break |
@ -0,0 +1,66 @@ |
||||
import cv2 |
||||
import numpy as np |
||||
|
||||
if __name__ == '__main__': |
||||
def nothing(*arg): |
||||
pass |
||||
|
||||
h1_old = 0 |
||||
s1_old = 0 |
||||
v1_old = 0 |
||||
h2_old = 0 |
||||
s2_old = 0 |
||||
v2_old = 0 |
||||
|
||||
cv2.namedWindow( "result" ) # создаем главное окно |
||||
cv2.namedWindow( "settings" ) # создаем окно настроек |
||||
|
||||
cam = cv2.VideoCapture(0) |
||||
# создаем 6 бегунков для настройки начального и конечного цвета фильтра |
||||
cv2.createTrackbar('h1', 'settings', 0, 255, nothing) |
||||
cv2.createTrackbar('s1', 'settings', 0, 255, nothing) |
||||
cv2.createTrackbar('v1', 'settings', 0, 255, nothing) |
||||
cv2.createTrackbar('h2', 'settings', 255, 255, nothing) |
||||
cv2.createTrackbar('s2', 'settings', 255, 255, nothing) |
||||
cv2.createTrackbar('v2', 'settings', 255, 255, nothing) |
||||
crange = [0,0,0, 0,0,0] |
||||
|
||||
while True: |
||||
flag, img = cam.read() |
||||
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV ) |
||||
|
||||
# считываем значения бегунков |
||||
h1 = cv2.getTrackbarPos('h1', 'settings') |
||||
s1 = cv2.getTrackbarPos('s1', 'settings') |
||||
v1 = cv2.getTrackbarPos('v1', 'settings') |
||||
h2 = cv2.getTrackbarPos('h2', 'settings') |
||||
s2 = cv2.getTrackbarPos('s2', 'settings') |
||||
v2 = cv2.getTrackbarPos('v2', 'settings') |
||||
|
||||
# формируем начальный и конечный цвет фильтра |
||||
h_min = np.array((h1, s1, v1), np.uint8) |
||||
h_max = np.array((h2, s2, v2), np.uint8) |
||||
|
||||
# накладываем фильтр на кадр в модели HSV |
||||
thresh = cv2.inRange(hsv, h_min, h_max) |
||||
|
||||
cv2.imshow('result', thresh) |
||||
|
||||
ch = cv2.waitKey(5) |
||||
|
||||
if h1 != h1_old or s1 != s1_old or v1 != v1_old \ |
||||
or h2 != h2_old or s2 != s2_old or v2 != v2_old : |
||||
print ("resault: (%d,%d,%d),(%d,%d,%d)"%(h1,s1,v1,h2,s2,v2)) |
||||
|
||||
h1_old = h1 |
||||
s1_old = s1 |
||||
v1_old = v1 |
||||
h2_old = h2 |
||||
s2_old = s2 |
||||
v2_old = v2 |
||||
|
||||
if ch == 27: |
||||
break |
||||
|
||||
cam.release() |
||||
cv2.destroyAllWindows() |
Binary file not shown.
@ -0,0 +1,98 @@ |
||||
import cv2 |
||||
import numpy as np |
||||
import keras |
||||
|
||||
''' |
||||
задачи |
||||
1) находить контур цифры |
||||
2) получать его координаты, вывести отдельным изображением |
||||
3) масштабировать его под нужный размер |
||||
4) загнать это на нейронную сеть https://habr.com/ru/post/466565/ |
||||
5) вывести результат |
||||
|
||||
очень сильно шумит изображение |
||||
''' |
||||
|
||||
|
||||
def find_number(frame): |
||||
# функция выполняет предобработку изображения |
||||
# находит область с цифрой по контурам |
||||
# далее в цикле перебераем найденные контуры |
||||
# если контур найден, то меняем разрешение на 28*28 |
||||
# выполняем бинаризацию, делим на 255 и инвертируем вычитая 1 |
||||
# flag нужен, чтобы он не выводил единицу, если цифра не найдена |
||||
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) |
||||
blur = cv2.GaussianBlur(gray,(3,3), 0) |
||||
edges = cv2.Canny(blur, 50, 100) |
||||
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) |
||||
img2 = np.zeros((28, 28), np.uint8) |
||||
img_rec = np.zeros((1, 28, 28, 1), np.uint8) |
||||
fail = True |
||||
|
||||
for contr in contours: |
||||
|
||||
if cv2.contourArea(contr) < 500: |
||||
continue |
||||
x,y,w,h = cv2.boundingRect(contr) |
||||
img2 = frame[y-5:y+h+5, x-5:x+w+5] |
||||
|
||||
# Проверка на некорректное изображение |
||||
if img2.shape[0] <= 0 or img2.shape[1]<= 0: |
||||
continue |
||||
|
||||
#Фильтер по вертикальности рамки |
||||
if img2.shape[0] < img2.shape[1]: |
||||
continue |
||||
|
||||
img2 = cv2.resize(img2, (28, 28)) |
||||
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) |
||||
|
||||
# th3 = cv2.adaptiveThreshold(img2,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ |
||||
# cv2.THRESH_BINARY,11,2) |
||||
|
||||
_, th3 = cv2.threshold(img2,127,255,cv2.THRESH_BINARY) |
||||
|
||||
# Фильтруем по следнему цвету, должно быть много белого |
||||
avg_color_per_row = np.average(th3, axis=0) |
||||
avg_color = np.average(avg_color_per_row, axis=0) |
||||
if avg_color < 180: |
||||
continue |
||||
|
||||
# Если все норм то рисуем рамки на исходном изображении. |
||||
img = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) |
||||
|
||||
cv2.imshow("img2", img2) |
||||
cv2.imshow("th3", th3) |
||||
|
||||
img_rec = th3/255.0 |
||||
img_rec = 1 - img_rec |
||||
img_rec = img_rec.reshape((1,28,28,1)) |
||||
|
||||
fail = False |
||||
return img2, img_rec, fail |
||||
|
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
cam = cv2.VideoCapture(0) |
||||
model = keras.models.load_model('mnist_trained_model.h5') |
||||
try: |
||||
while True: |
||||
_, frame = cam.read() |
||||
img_show, img_rec, fail = find_number(frame) |
||||
if fail == False: |
||||
result = model.predict_classes([img_rec]) |
||||
cv2.putText(frame,str(result[0]),(10,460), cv2.FONT_HERSHEY_SIMPLEX, 1,(0,0,255),2,cv2.LINE_AA) |
||||
|
||||
|
||||
cv2.imshow("Image", frame) |
||||
|
||||
k = cv2.waitKey(2) |
||||
if k == 27: |
||||
#cv2.imwrite('diff_robot_nn/nine.jpg', img_show) |
||||
cv2.destroyAllWindows() |
||||
break |
||||
except Exception as e: |
||||
cam.release() |
||||
cv2.destroyAllWindows() |
||||
print(e) |
@ -0,0 +1,46 @@ |
||||
import cv2 |
||||
import numpy as np |
||||
|
||||
# NOT WORCK !!!! |
||||
|
||||
def find_contours_of_cards(image): |
||||
blurred = cv2.GaussianBlur(image, (3, 3), 0) |
||||
T, thresh_img = cv2.threshold(blurred, 215, 255, |
||||
cv2.THRESH_BINARY) |
||||
(cnts, _) = cv2.findContours(thresh_img, |
||||
cv2.RETR_EXTERNAL, |
||||
cv2.CHAIN_APPROX_SIMPLE) |
||||
return cnts |
||||
|
||||
def find_coordinates_of_cards(cnts, image): |
||||
cards_coordinates = {} |
||||
for i in range(0, len(cnts)): |
||||
x, y, w, h = cv2.boundingRect(cnts[i]) |
||||
if w > 20 and h > 30: |
||||
img_crop = image[y - 15:y + h + 15, |
||||
x - 15:x + w + 15] |
||||
cards_name = find_features(img_crop) |
||||
cards_coordinates[cards_name] = (x - 15, |
||||
y - 15, x + w + 15, y + h + 15) |
||||
return cards_coordinates |
||||
|
||||
|
||||
|
||||
cam = cv2.VideoCapture(0) |
||||
|
||||
while True: |
||||
_, frame = cam.read() |
||||
img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) |
||||
img = cv2.GaussianBlur(img, (3, 3), 0) |
||||
# Все больше 215 станет 255, все что меньше 0 |
||||
T, thresh_img = cv2.threshold(img, 215, 255, cv2.THRESH_BINARY) |
||||
|
||||
|
||||
cv2.imshow("Image", img) |
||||
cv2.imshow("Image with opening", thresh_img) |
||||
#cv2.imshow("Image with closing", res) |
||||
|
||||
k = cv2.waitKey(2) |
||||
if k == 27: |
||||
cv2.destroyAllWindows() |
||||
break |
Loading…
Reference in new issue