The classification of the photos was made using the OpenCv template Matching method.
Use the package manager pip to install OpenCV and Matplotlib
pip install opencv-python
pip install matplotlib
'''Taking all images that we want to classify for them'''
path= "..\\FeatureBasedTemplateMatching\\Class\\"
images = []
classname = []
image_list = os.listdir(path)
'''Creating classes via image names'''
for clss in image_list:
imgCurrent = cv2.imread(f'{path}{clss}',0)
images.append(imgCurrent)
classname.append(os.path.splitext(clss)[0])
About ORB
'''Creating ORB object'''#Fast and Free to use
orb = cv2.ORB_create()
Computed descriptors. Output concatenated vectors of descriptors. Each descriptor is a 32-element vector, as returned by cv.ORB.descriptorSize, so the total size of descriptors will be numel(keypoints) * obj.descriptorSize(), i.e a matrix of size N-by-32 of class uint8, one row per keypoint.
'''Finding All Descriptors'''
def findDesc(images):
descList = []
for image in images:
kp,desc = orb.detectAndCompute(image,None)
descList.append(desc)
return descList
'''Finding image id via using descritor list'''
def findID(img, descList):
kp2, desc2 = orb.detectAndCompute(img,None)
bf = cv2.BFMatcher()
matchList = []
finalval = -1
try:
for des in descList:
matches = bf.knnMatch(des,desc2,k=2)
goodmatches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
goodmatches.append([m])
matchList.append(len(goodmatches))
except:
pass
if matchList:
if max(matchList) > TRESHOLD:
finalval = matchList.index(max(matchList))
return finalval
'''Image that we want to detect'''
detection_image = cv2.imread("..\\FeatureBasedTemplateMatching\\10kmmatch.jpg")
img_gray = cv2.cvtColor(detection_image,cv2.COLOR_BGR2GRAY)
descList = findDesc(images)
id =findID(img_gray,descList)
if id != -1:
cv2.putText(detection_image,classname[id],(50,50),cv2.FONT_HERSHEY_PLAIN,5,(255,0,0),3)
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.