OpenCV, C++ ile yazılmış açık kaynaklı (BSD Lisanslı) bir görüntü işleme kütüphanesidir. İlk olarak Intel tarafından geliştirilmiştir. Aynı zamanda Cross-platform dur. Windows, Linux, OS X, Android, iOS üzerinde çalışabilmektedir.
OpenCV sayısız özellikler barındıran bir kütüphane, bu özellikler ile neler yapılacağı tam olarak hayal gücünüze bağlı. İlk aşamada yapmak istediğim dikdörtgen algılaması yapmak. Örneğin masanın üzerinde duran bir kağıdı, kitabı vs. benzer geometrik şekilde olan nesneleri algılamak. Peki algıladıktan sonra ne olacak ? Benim hedefim optik form okuyusu yapmak. Bunun için sıralı bir şekilde gerekli aşamaları takip etmek gerekli.
İlk olarak dikdörtgen algılama işlevini başarıyla geçmek lazım. Bunun için yapılan işlemler mantıksal olarak basit fakat ufak ayarlamalar çok fazla değişikliklere yol açıyor.
-
Öncelikle renkli bir resmi gray yani gri ve tonlarına dönüştürüyoruz.
-
Sonrasında bilateralFilter uyguluyoruz. Bu filtre ne işe yarıyor derseniz; Aslında yaptığımız her işlem gri renkli resim üzerinden objeleri daha algılanabilir yapmak. Bu amaçla ufak ayrıntıları ortadan kaldırmak vs. vs. Bu filtre ile ne gibi bir değişim olacağını aşağıdaki resimden daha kolay bir şekilde anlayabilirsiniz
- Ufak ayrıntıları biraz yok ettikten sonra Canny fonksiyonundan yararlanarak köşeleri veya geçiş noktalarını elde edeceğiz. Bu filtre ile tamamen siyah-beyaz bir sonuç elde edeceğiz.
- Sonraki aşamalarda ise aradığımız geometrinin bir dikdörtgen olduğunu ve buna benzeyen şekilleri contour elde edip köşe sayılarına bakmak olacak. 4 adet köşeye sahip ise bizim için uygun bir geometri olacaktır. Elde ettiğimiz koordinatlara göre dörtgeni perspektif -> normal görünüme dönüştüreceğiz. Böylece dörtgeni normal bir görünümde elde etmiş olacağız.
Python kodları aşağıdaki gibidir. Webcam / Resim kullanabilirsiniz.
# -*- coding: utf-8 -*-
import cv2
import time
import numpy as np
"""
sudo apt-get install python-opencv
sudo apt-get install python-matplotlib
"""
##################
DELAY = 0.02
USE_CAM = False
IS_FOUND = 0
MORPH = 7
CANNY = 250
##################
# 420x600 oranı 105mmx150mm gerçek boyuttaki kağıt için
_width = 600.0
_height = 420.0
_margin = 0.0
##################
video_capture = None
if USE_CAM:
video_capture = cv2.VideoCapture(0)
corners = np.array(
[
[[_margin, _margin]],
[[_margin, _height + _margin]],
[[_width + _margin, _height + _margin]],
[[_width + _margin, _margin]],
]
)
pts_dst = np.array(corners, np.float32)
while True:
if video_capture:
ret, rgb = video_capture.read()
else:
ret = True
rgb = cv2.imread("img14.jpg", 1)
if ret:
out = None
gray = cv2.cvtColor(rgb, cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 1, 10, 120)
edges = cv2.Canny(gray, 10, CANNY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (MORPH, MORPH))
closed = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)
_, contours, h = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cont in contours:
# Küçük alanları pass geç
if cv2.contourArea(cont) > 5000:
arc_len = cv2.arcLength(cont, True)
approx = cv2.approxPolyDP(cont, 0.1 * arc_len, True)
if len(approx) == 4:
IS_FOUND = 1
# M = cv2.moments( cont )
# cX = int(M["m10"] / M["m00"])
# cY = int(M["m01"] / M["m00"])
# cv2.putText(rgb, "Center", (cX, cY), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 3)
pts_src = np.array(approx, np.float32)
h, status = cv2.findHomography(pts_src, pts_dst)
out = cv2.warpPerspective(rgb, h, (int(_width + _margin * 2), int(_height + _margin * 2)))
cv2.drawContours(rgb, [approx], -1, (255, 0, 0), 2)
else:
pass
# cv2.imshow( 'closed', closed )
# cv2.imshow( 'gray', gray )
cv2.namedWindow('edges')
cv2.imshow('edges', edges)
cv2.namedWindow('rgb')
cv2.imshow('rgb', rgb)
if IS_FOUND:
cv2.namedWindow('out')
cv2.imshow('out', out)
if cv2.waitKey(27) & 0xFF == ord('q'):
break
if cv2.waitKey(99) & 0xFF == ord('c'):
current = str(time.time())
cv2.imwrite('ocvi_' + current + '_edges.jpg', edges)
cv2.imwrite('ocvi_' + current + '_gray.jpg', gray)
cv2.imwrite('ocvi_' + current + '_org.jpg', rgb)
print("Pictures saved")
time.sleep(DELAY)
else:
print("Stopped")
break
if USE_CAM:
video_capture.release()
cv2.destroyAllWindows()
# end
OpenCV Kaynakları
- Resmi Site: OpenCV
- Resmi Github Sayfası: OpenCV | Github
- #opencv tagı ile stackoverflow'da birçok kaynak koda ulaşabilirsiniz.