Untitled
unknown
plain_text
4 years ago
9.0 kB
5
Indexable
import cv2
import numpy as np
import math
cap = cv2.VideoCapture(0)
cap.set(3,640) # ID no.3 is for width
cap.set(4,480) # ID no.4 is for height
cap.set(10,100) #ID no.5 is for brightness'
# the getContour function for detecting the contour in our image
def getContours(img):
norm_min = 1000000
cX_min=1000
cY_min=1000
cnt_min= None
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
if area>=5000:
# for detecting the largest contour in all detected contours we used the max function
#largestcontour = max(contours, key=cv2.contourArea)
# for detecting the center of each contour we used the following functions
M = cv2.moments(cnt)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
norm=math.sqrt(math.pow((cX-960),2)+math.pow((cY-550),2))
if norm<norm_min:
norm_min=norm
cnt_min=cnt
cX_min=cX
cY_min=cY
cv2.drawContours(imgContour, cnt, -1, (255, 255, 0), 1)
# for determine the 4 parameter of the bounding rectangle to draw it around our area of interest
# for drawing rectangle around our area of interest we used the rectangle function
else:
pass
x, y, w, h = cv2.boundingRect(cnt_min)
cv2.putText(imgContour, '.', (x + (w // 2), y + (h // 2)), cv2.FONT_ITALIC, 1, (255, 0, 255), 2)
#cv2.putText(imgContour, ".", (cX_min, cY_min),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 255), 2)
print('Module Center= ', ((x + (w // 2), y + (h // 2) + 10))) # center of each contour
cv2.rectangle(imgContour, (x, y), (x + w, y + h), (0, 255, 255), 2)
#print('contour center 2', cX_min, cY_min)
def empty (a):
pass
# The name and the size of our center detection Track bar window
cv2.namedWindow('Module center TrackBars')
cv2.resizeWindow('Module center TrackBars', 650,430)
# The name and the size of our center detection Track bar window
cv2.namedWindow('String angel TrackBars')
cv2.resizeWindow('String angel TrackBars', 650,430)
# create Trackbar function to create a track bar
cv2.createTrackbar('Hue Min', 'Module center TrackBars',0, 179, empty ) #Max value of Hue in OpenCV is 179
cv2.createTrackbar('Hue Max', 'Module center TrackBars',179, 179, empty )
cv2.createTrackbar('Sat Min', 'Module center TrackBars',0, 255, empty )
cv2.createTrackbar('Sat Max', 'Module center TrackBars',255, 255, empty )
cv2.createTrackbar('Val Min', 'Module center TrackBars',0, 255, empty )
cv2.createTrackbar('Val Max', 'Module center TrackBars',255, 255, empty )
cv2.createTrackbar('Can Min', 'Module center TrackBars',0, 255, empty )
cv2.createTrackbar('Can Max', 'Module center TrackBars',255, 255, empty )
# create Trackbar function to create a track bar
cv2.createTrackbar('Hue Min', 'String angel TrackBars',0, 179, empty ) #Max value of Hue in OpenCV is 179
cv2.createTrackbar('Hue Max', 'String angel TrackBars',179, 179, empty )
cv2.createTrackbar('Sat Min', 'String angel TrackBars',0, 255, empty )
cv2.createTrackbar('Sat Max', 'String angel TrackBars',255, 255, empty )
cv2.createTrackbar('Val Min', 'String angel TrackBars',0, 255, empty )
cv2.createTrackbar('Val Max', 'String angel TrackBars',255, 255, empty )
cv2.createTrackbar('Can Min', 'String angel TrackBars',0, 255, empty )
cv2.createTrackbar('Can Max', 'String angel TrackBars',255, 255, empty )
# Stacking function for stacking images together
def stackImages(imgArray,scale,lables=[]):
sizeW= imgArray[0][0].shape[1]
sizeH = imgArray[0][0].shape[0]
rows = len(imgArray)
cols = len(imgArray[0])
rowsAvailable = isinstance(imgArray[0], list)
width = imgArray[0][0].shape[1]
height = imgArray[0][0].shape[0]
if rowsAvailable:
for x in range ( 0, rows):
for y in range(0, cols):
imgArray[x][y] = cv2.resize(imgArray[x][y], (sizeW, sizeH), None, scale, scale)
if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)
imageBlank = np.zeros((height, width, 3), np.uint8)
hor = [imageBlank]*rows
hor_con = [imageBlank]*rows
for x in range(0, rows):
hor[x] = np.hstack(imgArray[x])
hor_con[x] = np.concatenate(imgArray[x])
ver = np.vstack(hor)
ver_con = np.concatenate(hor)
else:
for x in range(0, rows):
imgArray[x] = cv2.resize(imgArray[x], (sizeW, sizeH), None, scale, scale)
if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
hor= np.hstack(imgArray)
hor_con= np.concatenate(imgArray)
ver = hor
if len(lables) != 0:
eachImgWidth= int(ver.shape[1] / cols)
eachImgHeight = int(ver.shape[0] / rows)
print(eachImgHeight)
for d in range(0, rows):
for c in range (0,cols):
cv2.rectangle(ver,(c*eachImgWidth,eachImgHeight*d),(c*eachImgWidth+len(lables[d][c])*13+27,30+eachImgHeight*d),(255,255,255),cv2.FILLED)
cv2.putText(ver,lables[d][c],(eachImgWidth*c+10,eachImgHeight*d+20),cv2.FONT_HERSHEY_COMPLEX,0.7,(255,0,255),2)
return ver
while True:
success, img = cap.read()
# imgContour is a copy from our original image
imgContour = img.copy()
# for extracting a certain value of the trace bar we added the getTrackbarpos Function
h_min = cv2.getTrackbarPos('Hue Min','Module center TrackBars')
h_max = cv2.getTrackbarPos('Hue Max', 'Module center TrackBars')
s_min = cv2.getTrackbarPos('Sat Min', 'Module center TrackBars')
s_max = cv2.getTrackbarPos('Sat Max', 'Module center TrackBars')
v_min = cv2.getTrackbarPos('Val Min', 'Module center TrackBars')
v_max = cv2.getTrackbarPos('Val Max', 'Module center TrackBars')
C_min = cv2.getTrackbarPos('Can Min', 'Module center TrackBars')
C_max = cv2.getTrackbarPos('Can Max', 'Module center TrackBars')
# for extracting a certain value of the trace bar we added the getTrackbarpos Function
hue_min = cv2.getTrackbarPos('Hue Min', 'String angel TrackBars')
hue_max = cv2.getTrackbarPos('Hue Max', 'String angel TrackBars')
sat_min = cv2.getTrackbarPos('Sat Min', 'String angel TrackBars')
sat_max = cv2.getTrackbarPos('Sat Max', 'String angel TrackBars')
val_min = cv2.getTrackbarPos('Val Min', 'String angel TrackBars')
val_max = cv2.getTrackbarPos('Val Max', 'String angel TrackBars')
Cat_min = cv2.getTrackbarPos('Can Min', 'String angel TrackBars')
Cat_max = cv2.getTrackbarPos('Can Max', 'String angel TrackBars')
# for creating a mask we need to creat a numpy array to put them in the inRange function (for module center)
lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
# for creating a mask we need to creat a numpy array to put them in the inRange function (for module center)
lower_2 = np.array([hue_min, sat_min, val_min])
upper_2 = np.array([hue_max, sat_max, val_max])
# Img - Blur - HSV - Mask - imgResult by comparing our original image with the mask
imgBlur = cv2.GaussianBlur(img, (3, 3), 0.5)
imgHSV = cv2.cvtColor(imgBlur,cv2.COLOR_BGR2HSV)
mask = cv2.inRange(imgHSV, lower, upper)
mask_2 = cv2.inRange(imgHSV, lower_2, upper_2)
imgResult = cv2.bitwise_and(img, img, mask=mask)
imgResult_2 = cv2.bitwise_and(img, img, mask=mask_2)
imgCanny = cv2.Canny(mask, C_min, C_max)
# Hough line function for detection the lines in our image
lines = cv2.HoughLines(mask_2, 1, np.pi / 180, 200)
for rho, theta in lines[0]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * (a))
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
print('String angle in radians=',theta)
print('String angle in degrees=', math.degrees(theta))
#cv2.imwrite('pv.png', imgResult_2)
# Just as extra information to see how canny function react to detect the edges in our imgResult photo
getContours(img)
cv2.imshow('Original', img)
#cv2.imshow('Blur', imgBlur)
#cv2.imshow('Gray', imgGray)
cv2.imshow('Canny', imgCanny)
#cv2.imshow('Blank', imgBlank)
cv2.imshow('imgcontour',imgContour)
cv2.imshow('HSV',imgHSV)
cv2.imshow('Result', imgResult)
cv2.imshow('mask',mask)
#StackedImages = stackImages(([img, imgResult_2, mask_2 ], [imgContour, imgResult, mask]), 5)
#cv2.imshow('stackedimages', StackedImages)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
Editor is loading...