Change of Direction

Direction Change

Instead of trying to segment the objects out of the images very clearly and then take the associated colors to classify them , We are now trying a completely different angle which is manually extracting the colors into a mask , applying Canny Edge Detection and then finding the contours of the results in order to find the insides of the cups

However this technique is quite hack and slash I believe we can upgrade this to make it more effective and for the time being I believe were going to follow this path as its the first time we have gotten decent results in the direction we need.

Performance

Although the current performance of the algorithm implemented is quite low , I plan to soon cut a lot of redundant or ineffective code therefore increasing its efficiency and giving it a more dynamic nature as a programmer wouldn’t need to manually enter in each extra color but simply add a key to a dictionary with its associated ranges of color.

In the coming days I hope to implement these changes.

Code

```# import the necessary packages:
import numpy as np
import cv2
from matplotlib import pyplot as plt
from matplotlib import image as image
import easygui
import math

# Opening an image and backing it up
ori = img.copy()

counts = {}
total = 0
#Colours to look for
colors = ["pink", "blue", "dark blue", "green", "yellow","orange"]

for color in colors:
counts[color] = 0

#Define the ranges
if (color == str(colors)):
lower = np.array([128,7,252])
upper = np.array([223,175,254])
elif (color == str(colors)):
lower = np.array([195, 148, 13])
upper = np.array([255, 238, 77])
elif (color == str(colors)):
lower = np.array([229, 70, 20])
upper = np.array([255, 166, 89])
elif (color == str(colors)):
lower = np.array([12, 182, 69])
upper = np.array([66, 254, 189])
elif (color == str(colors)):
lower = np.array([51, 209, 239])
upper = np.array([120, 252, 252])
elif (color == str(colors)):
lower = np.array([8, 63, 252])
upper = np.array([84, 88, 255])

#Create mask then apply it to the image to extract color

edge = cv2.Canny(gray, 100, 200)
edge = cv2.dilate(edge, None, iterations = 1)

(_, contours, _) = cv2.findContours(edge.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
area = cv2.contourArea(c)
#Change this to percentage/find a way tp use the largest one
if (area < 1000):
continue

hull = cv2.convexHull(c)
for i in colors:
if(color == colors[i])
cv2.drawContours(img, [hull], 0, (0, 0, 0))

counts[color] += 1
total += 1
#Tell user how many objects of that color
print("{} {} object(s)".format(counts[color], color))

print("{} object(s) total".format(total))

cv2.imshow("asd", img)
key = cv2.waitKey(0)
```

I believe this to be our current direction however I also hope to use some of the techniques we used while doing research and experimenting when further upgrading.

Output References

Docs.opencv.org. (2017). OpenCV: Contour Features. [online] Available at: https://docs.opencv.org/3.3.0/dd/d49/tutorial_py_contour_features.html [Accessed 28 Oct. 2017].

henrydangprg. (2016). Color Detection in Python with OpenCV. [online] Available at: https://henrydangprg.com/2016/06/26/color-detection-in-python-with-opencv/ [Accessed 28 Oct. 2017].

*This one is actually really useful. Shows a nice way to do Color Detection.