c2.createTrackbar изменение параметров при движении ползунков
В реальном времени у меня отображается окно с видеокамерой. Я хочу, чтобы ползунками можно было менять значение функции cv2.threshold (в методе threshold), однако не понимаю как правильно это сделать. Ниже пример программы, в которой эти ползунки работают некорректно. Остальное же работает как надо. Менять хочу переменные thr1 и thr2.
import numpy as np
import cv2
import easyocr
def threshold(gray, thr1, thr2):
thresh = cv2.threshold(gray, thr1, thr2, cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]
return thresh
def text_recognition_en(file_path):
reader = easyocr.Reader(["en"])
result = reader.readtext(file_path, detail=0, paragraph=True)
return result
def save_text_en(image_to_scan, count_en):
result = text_recognition_en(image_to_scan)
with open("result_en" + str(count_en) + ".txt", "w") as file:
for line in result:
file.write(f"{line}\n\n")
file.close()
def text_recognition_ru(file_path):
reader = easyocr.Reader(["ru"])
result = reader.readtext(file_path, detail=0, paragraph=True)
return result
def save_text_ru(image_to_scan, count_ru):
result = text_recognition_ru(image_to_scan)
with open("result_ru" + str(count_ru) + ".txt", "w") as file:
for line in result:
file.write(f"{line}\n\n")
file.close()
def main():
root_window = "main";
cv2.namedWindow(root_window)
# Параметры Threshold
thr1 = 0
thr2 = 255
# Слайдеры для изменения параметров Threshold
cv2.createTrackbar('threshold par 1', root_window, thr1, 255, threshold)
cv2.setTrackbarPos('threshold par 1', root_window, 0)
cv2.createTrackbar('threshold par 2', root_window, thr2, 255, threshold)
cv2.setTrackbarPos('threshold par 2', root_window, 255)
# Все параметры камеры
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FPS, 24) # Частота кадров
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) # Ширина кадров в видеопотоке.
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # Высота кадров в видеопотоке.
# img / gray / thresh / cnts / img
count_ru = 1 # Нумерация картинок и текстов
count_en = 1
while True:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = threshold(gray, thr1, thr2)
# Поиск контуров и сортировка
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
# Поиск рамки
for c in cnts:
x, y, w, h = cv2.boundingRect(c)
ROI = img[y:y + h, x:x + w]
break
cv2.imshow(root_window, thresh)
if cv2.waitKey(1) == ord('e'):
cv2.imwrite('image_en' + str(count_en) + '.jpg', ROI)
image_to_scan = 'image_en' + str(count_en) + '.jpg'
#cv2.imwrite('image_en_thresh' + str(count_en) + '.jpg', thresh)
save_text_en(image_to_scan, count_en)
count_en += 1
if cv2.waitKey(1) == ord('r'):
cv2.imwrite('image_ru' + str(count_ru) + '.jpg', ROI)
image_to_scan = 'image_ru' + str(count_ru) + '.jpg'
#cv2.imwrite('image_ru_thresh' + str(count_ru) + '.jpg', thresh)
save_text_ru(image_to_scan, count_ru)
count_ru += 1
if cv2.waitKey(1) == 27: # Клавиша Esc
break
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
Ответы (1 шт):
Моё решение данной проблемы: Алгоритм прост - Создаём слайдер с вызовом метода, который ничего не делает, а позицию слайдера читаем через getTrackbarPos и загружаем в нужную переменную. Выглядит это так:
# Создание Trackbar и установка дефолтного значения
cv2.createTrackbar('threshold par 1', root_window, 0, 255, nothing)
cv2.setTrackbarPos('threshold par 1', root_window, 0)
# Считывание в цикле актуального значения на Trackbar
# (эта строка должна быть в цикле, у меня это был цикл
# while true, тк я постоянно обновлял изображение с камеры)
par = cv2.getTrackbarPos('threshold par 1', root_window)
# То, где применяются у меня полученные значения
cv2.threshold(gray, par, par2, cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]
# Метод nothing
def nothing(x):
pass
Не уверен в том, что это истинно верное решение данной проблемы, однако на мой взгляд всё логично и правильно. Надеюсь, в будущем это кому-то поможет. Отдельное спасибо моему другу, который помог с этим разобраться <З
Полезные ссылки: