Неделя 12 - Прикладные задачи компьютерного зрения
1. Детекция и распознавание текста (OCR)
1.1. Использование Tesseract OCR
python
Copy
import cv2
import pytesseract
# Настройка пути к Tesseract (если требуется)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def extract_text(image_path):
# Загрузка изображения
img = cv2.imread(image_path)
# Предварительная обработка
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
# Распознавание текста
custom_config = r'--oem 3 --psm 6'
text = pytesseract.image_to_string(thresh, config=custom_config)
return text
# Пример использования
text = extract_text('document.jpg')
print("Распознанный текст:\n", text)
1.2. Улучшение качества распознавания
python
Copy
def preprocess_for_ocr(img):
# Увеличение резкости
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
sharpened = cv2.filter2D(img, -1, kernel)
# Удаление шума
denoised = cv2.fastNlMeansDenoisingColored(sharpened, None, 10, 10, 7, 21)
# Бинаризация
gray = cv2.cvtColor(denoised, cv2.COLOR_BGR2GRAY)
adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
return adaptive
2. Дополненная реальность (AR)
2.1. Наложение 3D объектов
python
Copy
def draw_3d_axis(img, corners, imgpts):
corner = tuple(corners[0].ravel().astype(int))
img = cv2.line(img, corner, tuple(imgpts[0].ravel().astype(int)), (255,0,0), 5)
img = cv2.line(img, corner, tuple(imgpts[1].ravel().astype(int)), (0,255,0), 5)
img = cv2.line(img, corner, tuple(imgpts[2].ravel().astype(int)), (0,0,255), 5)
return img
# Параметры камеры (из калибровки)
mtx = np.load('calibration.npz')['mtx']
dist = np.load('calibration.npz')['dist']
# 3D точки объекта
objp = np.float32([[0,0,0], [3,0,0], [0,3,0], [0,0,-3]]).reshape(-1,3)
# Нахождение углов шахматной доски
ret, corners = cv2.findChessboardCorners(gray, (9,6), None)
if ret:
# Решение PnP задачи
_, rvecs, tvecs = cv2.solvePnP(objp, corners, mtx, dist)
# Проекция 3D точек
imgpts, _ = cv2.projectPoints(objp, rvecs, tvecs, mtx, dist)
# Отрисовка осей
img = draw_3d_axis(img, corners, imgpts)
2.2. Наложение изображений
python
Copy
def overlay_image(background, overlay, position):
h, w = overlay.shape[:2]
x, y = position
# Создание маски
overlay_gray = cv2.cvtColor(overlay, cv2.COLOR_BGR2GRAY)
_, mask = cv2.threshold(overlay_gray, 1, 255, cv2.THRESH_BINARY)
# Область интереса
roi = background[y:y+h, x:x+w]
# Наложение с маской
roi_bg = cv2.bitwise_and(roi, roi, mask=cv2.bitwise_not(mask))
roi_fg = cv2.bitwise_and(overlay, overlay, mask=mask)
background[y:y+h, x:x+w] = cv2.add(roi_bg, roi_fg)
return background
3. Обработка документов
3.1. Выравнивание документа
python
Copy
def align_document(img):
# Предварительная обработка
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
edged = cv2.Canny(blur, 75, 200)
# Поиск контуров
contours, _ = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:5]
# Поиск контура документа
for cnt in contours:
peri = cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, 0.02*peri, True)
if len(approx) == 4:
doc_cnt = approx
break
# Перспективное преобразование
warped = four_point_transform(img, doc_cnt.reshape(4,2))
return warped
def four_point_transform(image, pts):
rect = order_points(pts)
(tl, tr, br, bl) = rect
# Вычисление ширины и высоты
widthA = np.sqrt(((br[0]-bl[0])**2) + ((br[1]-bl[1])**2))
widthB = np.sqrt(((tr[0]-tl[0])**2) + ((tr[1]-tl[1])**2))
maxWidth = max(int(widthA), int(widthB))
heightA = np.sqrt(((tr[0]-br[0])**2) + ((tr[1]-br[1])**2))
heightB = np.sqrt(((tl[0]-bl[0])**2) + ((tl[1]-bl[1])**2))
maxHeight = max(int(heightA), int(heightB))
# Матрица преобразования
dst = np.array([
[0, 0],
[maxWidth-1, 0],
[maxWidth-1, maxHeight-1],
[0, maxHeight-1]], dtype="float32")
M = cv2.getPerspectiveTransform(rect, dst)
warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
return warped
4. Системы трекинга
4.1. Мультитрекинг объектов
python
Copy
from collections import defaultdict
class ObjectTracker:
def __init__(self):
self.next_object_id = 0
self.objects = defaultdict(dict)
def update(self, detections):
# Простая реализация трекинга по расстоянию
updated_objects = {}
for box in detections:
x, y, w, h = box
cx, cy = x + w//2, y + h//2
# Поиск ближайшего существующего объекта
min_dist = float('inf')
obj_id = None
for id, data in self.objects.items():
dist = np.sqrt((cx - data['cx'])**2 + (cy - data['cy'])**2)
if dist < min_dist and dist < 50: # Пороговое расстояние
min_dist = dist
obj_id = id
if obj_id is not None:
updated_objects[obj_id] = {'box': box, 'cx': cx, 'cy': cy}
else:
updated_objects[self.next_object_id] = {'box': box, 'cx': cx, 'cy': cy}
self.next_object_id += 1
self.objects = updated_objects
return self.objects
5. Практическое задание
1. Реализуйте систему распознавания текста с фотографии документа
2. Создайте простой AR-маркер на основе шахматной доски
3. Разработайте систему выравнивания сканированных документов
4. Реализуйте трекинг нескольких объектов на видео
5. (Дополнительно) Создайте систему подсчета посетителей магазина
6. Итоги
OpenCV предоставляет инструменты для решения прикладных задач
OCR позволяет извлекать текст из изображений
AR-технологии могут накладывать виртуальные объекты
Обработка документов включает выравнивание и улучшение
Системы трекинга полезны для анализа видео
Следующая тема: Оптимизация производительности и развертывание решений