Merhabalar,
İki çizgi arasındaki açıyı OpenCV ile bulmak istiyoruz. Yazdığımız kod ile, belirleyemediğimiz bir sorun nedeniyle istediğimiz şekilde açı hesaplaması yapamıyoruz.
Amacımız, resimde bulunan kırmızı renkteki bir cisim ile resimde bulunan farklı renkteki bazı cisimlerin arasındaki açıyı hesaplamak. Bunun için kırmızı renkteki nesnenin ortasından sağ tarafına doğru bir X ekseni çizdik ve açıyı bulmasını sağlayacak kodu yazdık. Ancak bu kod istediğimiz şekilde açı hesaplaması yapmıyor. Şöyleki:
Koordinat sistemine göre, 0-90° alanındaki açıları negatif, 90-180° alanındaki açıları ise pozitif olacak şekilde gösteriyor. Görseller üzerinden daha kolay anlaşılacaktır. Örnek olarak bir açı ölçerin üzerine çizdiğimiz bu resimlere bakalım:
Bu resimde kırmızı ile mavi nesne arasındaki açı -65° olarak ölçülmüş:
(yeni kullanıcılar 1 foto ile sınırlandırılmış diğer fotoları da farklı bir hesaptan yükleyeceğim)
Kısacası bizler açının 360° üzerinden ve pozitif olarak hesaplanmasını istiyoruz. Kodun tamamını aşağıya bırakıyorum. Python ve OpenCV bilgimiz kısıtlı. Yardımcı olacak arkadaşlara şimdiden teşekkür eder hayırlı akşamlar dilerim.
(açı hesaplaması ile ilgili kodları “def kırmızı()” fonksiyonu ve sonraki satırlarda bulabilirsiniz. Gözden kaçan yer olması ihtimaline karşın kodların tümünü yazdım)
import cv2 as cv
import numpy as np
import math
data = cv.imread("angle1.jpg")
x, y, w, h = 0, 0, 0, 0
data = cv.medianBlur(data,5)
dataHsv=cv.cvtColor(data,cv.COLOR_BGR2HSV)
a = 0
b = 0
maviDeg = None
sariDeg = None
kirmiziDeg = None
xDeg = None
yesilDeg = None
def mavi():
global a
global b
global maviDeg
mlower_color = np.array([75,100,100])#Mavi renk eşik değerleri.
mupper_color = np.array([130,255,255])
mask = cv.inRange(dataHsv, mlower_color,mupper_color)
mask = cv.dilate(mask,(3,3),iterations=3)
contour, _ = cv.findContours(mask,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
for cnt in contour:
area = cv.contourArea(cnt)
if area > 480:#Kontur minimum değeri.
x, y, w, h = cv.boundingRect(cnt) #Diktörtgen kutu çizimi.
cv.rectangle(data, (x, y), (x + w, y + h), (0, 255, 0), 3)
cv.putText( data, "Mavi Hedef", (x-35,y), cv.FONT_HERSHEY_SIMPLEX, 1,(0,0,0), 2, cv.LINE_AA )
a = x+(w/2) # Çerçeve genişliğinin yarısı
b = y+(h/2) # Çerçeve yüksekliğinin yarısı
cv.circle(data,((int(a)),(int(b))), 1, (0,255,0), 6)
maviDeg = ([int(a),int(b)])
#print("mavi",a,b)
def sarı():
global a
global b
global sariDeg
slower_color = np.array([22,100,100])#Sarı renk eşik değerleri.
supper_color = np.array([38,255,255])
mask = cv.inRange(dataHsv, slower_color,supper_color)
mask = cv.dilate(mask,(3,3),iterations=3)
contour, _ = cv.findContours(mask,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
for cnt in contour:
area = cv.contourArea(cnt)
if area > 480:#Kontur minimum değeri.
x, y, w, h = cv.boundingRect(cnt) #Diktörtgen kutu çizimi.
cv.rectangle(data, (x, y), (x + w, y + h), (0, 255, 0), 3)
cv.putText( data, "Sari Hedef", (x-35,y), cv.FONT_HERSHEY_SIMPLEX, 1,(0,0,0), 2, cv.LINE_AA )
a = x+(w/2) # Çerçeve genişliğinin yarısı
b = y+(h/2) # Çerçeve yüksekliğinin yarısı
cv.circle(data,((int(a)),(int(b))), 1, (0,255,0), 6)
sariDeg = ([int(a),int(b)])
def yeşil():
global a
global b
global yesilDeg
ylower_color = np.array([38,100,100])#Yeşil renk eşik değerleri.
yupper_color = np.array([75,255,255])
mask = cv.inRange(dataHsv, ylower_color,yupper_color)
mask = cv.dilate(mask,(3,3),iterations=3)
contour, _ = cv.findContours(mask,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
for cnt in contour:
area = cv.contourArea(cnt)
if area > 480:#Kontur minimum değeri.
x, y, w, h = cv.boundingRect(cnt) #Diktörtgen kutu çizimi.
cv.rectangle(data, (x, y), (x + w, y + h), (0, 255, 0), 3)
cv.putText( data, "Yesil Hedef", (x-35,y), cv.FONT_HERSHEY_SIMPLEX, 1,(0,0,0), 2, cv.LINE_AA )
a = x+(w/2) # Çerçeve genişliğinin yarısı
b = y+(h/2) # Çerçeve yüksekliğinin yarısı
cv.circle(data,((int(a)),(int(b))), 1, (0,255,0), 6)
yesilDeg = ([int(a),int(b)])
def kırmızı():
global kirmiziDeg
global xDeg
klower_color = np.array([160,100,100])#Kırrmızı renk eşik değerleri.
kupper_color = np.array([179,255,255])
mask = cv.inRange(dataHsv, klower_color,kupper_color)
mask = cv.dilate(mask,(3,3),iterations=3)
contour, _ = cv.findContours(mask,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
for cnt in contour:
area = cv.contourArea(cnt)
if area > 480:#Kontur minimum değeri.
x, y, w, h = cv.boundingRect(cnt) #Diktörtgen kutu çizimi.
cv.rectangle(data, (x, y), (x + w, y + h), (0, 255, 0), 3)
cv.putText( data, "Kirmizi", (x,y), cv.FONT_HERSHEY_SIMPLEX, 1,(0,0,0), 2, cv.LINE_AA )
a1 = x+(w/2) # Çerçeve genişliğinin yarısı
b1 = y+(h/2) # Çerçeve yüksekliğinin yarısı
cv.circle(data,((int(a1)),(int(b1))), 1, (0,255,0), 6)
kirmiziDeg = ([int(a1),int(b1)])
cv.line(data, (int(a1), int(b1)), (int(a), int(b)), (0, 0, 0), 5)
cv.line(data, (int(a1), int(b1)), (int(a1+a1), int(b1)), (0, 0, 0), 5)
xDeg = ([a1+a1,b1])
def gradient(pt1,pt2):
return (pt2[1]-pt1[1])/(pt2[0]-pt1[0])
def getAngle(pointsList):
pt1, pt2, pt3 = pointsList[-3:]
m1 = gradient(pt1,pt2)
m2 = gradient(pt1,pt3)
angR = math.atan((m2-m1)/(1+(m2*m1)))
angD = round(math.degrees(angR))
print(angD,"°",sep="")
cv.putText(data,str(angD),(pt1[0]+30,pt1[1]),cv.FONT_HERSHEY_COMPLEX,1.5,(0,0,0),2)
renk = input("sarı, yeşil, mavi\nÇizgi çekilecek renk: ")
if(renk == "sarı"):
sarı()
kırmızı()
spointsList =(kirmiziDeg, xDeg, sariDeg)
getAngle(spointsList)
cv.imshow('Resim', data)
elif(renk == "mavi"):
mavi()
kırmızı()
mpointsList =(kirmiziDeg, xDeg, maviDeg)
getAngle(mpointsList)
cv.imshow('Resim', data)
elif(renk == "yeşil"):
yeşil()
kırmızı()
ypointsList =(kirmiziDeg, xDeg, yesilDeg)
getAngle(ypointsList)
cv.imshow('Resim', data)
cv.waitKey(0)
cv.destroyAllWindows()