def plaka_tespit_et(imgOriginalScene): listOfPossiblePlates = [] # this will be the return value height, width, numChannels = imgOriginalScene.shape imgGrayscaleScene = np.zeros((height, width, 1), np.uint8) imgThreshScene = np.zeros((height, width, 1), np.uint8) imgContours = np.zeros((height, width, 3), np.uint8) cv2.destroyAllWindows() if Main.adimleri_goster == True: # show steps ####################################################### cv2.imshow("0", imgOriginalScene) # end if # show steps ######################################################################### imgGrayscaleScene, imgThreshScene = on_hazirlik.onhazirlikislemi( imgOriginalScene) # preprocess to get grayscale and threshold images if Main.adimleri_goster == True: # show steps ####################################################### cv2.imshow("1a", imgGrayscaleScene) cv2.imshow("1b", imgThreshScene) # end if # show steps ######################################################################### # find all possible chars in the scene, # this function first finds all contours, then only includes contours that could be chars (without comparison to other chars yet) listOfPossibleCharsInScene = findPossibleCharsInScene(imgThreshScene) if Main.adimleri_goster == True: # show steps ####################################################### print("step 2 - len(listOfPossibleCharsInScene) = " + str(len(listOfPossibleCharsInScene))) # 131 with MCLRNF1 image imgContours = np.zeros((height, width, 3), np.uint8) contours = [] for possibleChar in listOfPossibleCharsInScene: contours.append(possibleChar.contour) # end for cv2.drawContours(imgContours, contours, -1, Main.beyaz) cv2.imshow("2b", imgContours) # end if # show steps ######################################################################### # given a list of all possible chars, find groups of matching chars # in the next steps each group of matching chars will attempt to be recognized as a plate listOfListsOfMatchingCharsInScene = KarakterTespitEt.findListOfListsOfMatchingChars( listOfPossibleCharsInScene) if Main.adimleri_goster == True: # show steps ####################################################### print("step 3 - listOfListsOfMatchingCharsInScene.Count = " + str( len(listOfListsOfMatchingCharsInScene))) # 13 with MCLRNF1 image imgContours = np.zeros((height, width, 3), np.uint8) for listOfMatchingChars in listOfListsOfMatchingCharsInScene: intRandomBlue = random.randint(0, 255) intRandomGreen = random.randint(0, 255) intRandomRed = random.randint(0, 255) contours = [] for matchingChar in listOfMatchingChars: contours.append(matchingChar.contour) # end for cv2.drawContours(imgContours, contours, -1, (intRandomBlue, intRandomGreen, intRandomRed)) # end for cv2.imshow("3", imgContours) # end if # show steps ######################################################################### for listOfMatchingChars in listOfListsOfMatchingCharsInScene: # for each group of matching chars possiblePlate = extractPlate( imgOriginalScene, listOfMatchingChars) # attempt to extract plate if possiblePlate.imgPlate is not None: # if plate was found listOfPossiblePlates.append( possiblePlate) # add to list of possible plates # end if # end for print("\n" + str(len(listOfPossiblePlates)) + " possible plates found") # 13 with MCLRNF1 image if Main.adimleri_goster == True: # show steps ####################################################### print("\n") cv2.imshow("4a", imgContours) for i in range(0, len(listOfPossiblePlates)): p2fRectPoints = cv2.boxPoints( listOfPossiblePlates[i].rrLocationOfPlateInScene) cv2.line(imgContours, tuple(p2fRectPoints[0]), tuple(p2fRectPoints[1]), Main.kirmizi, 2) cv2.line(imgContours, tuple(p2fRectPoints[1]), tuple(p2fRectPoints[2]), Main.kirmizi, 2) cv2.line(imgContours, tuple(p2fRectPoints[2]), tuple(p2fRectPoints[3]), Main.kirmizi, 2) cv2.line(imgContours, tuple(p2fRectPoints[3]), tuple(p2fRectPoints[0]), Main.kirmizi, 2) cv2.imshow("4a", imgContours) print("possible plate " + str(i) + ", click on any image and press a key to continue . . .") cv2.imshow("4b", listOfPossiblePlates[i].imgPlate) cv2.waitKey(0) # end for print( "\nPlaka tespiti tamamlandı, herhangi bir resme tıkla ve bir tuşa tıkla ve karakter tanımayı başlat . . .\n" ) cv2.waitKey(0) # end if # show steps ######################################################################### return listOfPossiblePlates
def plakada_karakter_tespit_et(listOfPossiblePlates): intPlateCounter = 0 imgContours = None contours = [] if len(listOfPossiblePlates) == 0: # if list of possible plates is empty return listOfPossiblePlates # return # end if # at this point we can be sure the list of possible plates has at least one plate for possiblePlate in listOfPossiblePlates: # for each possible plate, this is a big for loop that takes up most of the function possiblePlate.imgGrayscale, possiblePlate.imgThresh = on_hazirlik.onhazirlikislemi( possiblePlate.imgPlate ) # preprocess to get grayscale and threshold images if Main.adimleri_goster == True: # show steps ################################################### cv2.imshow("5a", possiblePlate.imgPlate) cv2.imshow("5b", possiblePlate.imgGrayscale) cv2.imshow("5c", possiblePlate.imgThresh) # end if # show steps ##################################################################### # increase size of plate image for easier viewing and char detection possiblePlate.imgThresh = cv2.resize(possiblePlate.imgThresh, (0, 0), fx=1.6, fy=1.6) # threshold again to eliminate any gray areas thresholdValue, possiblePlate.imgThresh = cv2.threshold( possiblePlate.imgThresh, 0.0, 255.0, cv2.THRESH_BINARY | cv2.THRESH_OTSU) if Main.adimleri_goster == True: # show steps ################################################### cv2.imshow("5d", possiblePlate.imgThresh) # end if # show steps ##################################################################### # find all possible chars in the plate, # this function first finds all contours, then only includes contours that could be chars (without comparison to other chars yet) listOfPossibleCharsInPlate = findPossibleCharsInPlate( possiblePlate.imgGrayscale, possiblePlate.imgThresh) if Main.adimleri_goster == True: # show steps ################################################### height, width, numChannels = possiblePlate.imgPlate.shape imgContours = np.zeros((height, width, 3), np.uint8) del contours[:] # clear the contours list for possibleChar in listOfPossibleCharsInPlate: contours.append(possibleChar.contour) # end for cv2.drawContours(imgContours, contours, -1, Main.beyaz) cv2.imshow("6", imgContours) # end if # show steps ##################################################################### # given a list of all possible chars, find groups of matching chars within the plate listOfListsOfMatchingCharsInPlate = findListOfListsOfMatchingChars( listOfPossibleCharsInPlate) if Main.adimleri_goster == True: # show steps ################################################### imgContours = np.zeros((height, width, 3), np.uint8) del contours[:] for listOfMatchingChars in listOfListsOfMatchingCharsInPlate: intRandomBlue = random.randint(0, 255) intRandomGreen = random.randint(0, 255) intRandomRed = random.randint(0, 255) for matchingChar in listOfMatchingChars: contours.append(matchingChar.contour) # end for cv2.drawContours(imgContours, contours, -1, (intRandomBlue, intRandomGreen, intRandomRed)) # end for cv2.imshow("7", imgContours) # end if # show steps ##################################################################### if (len(listOfListsOfMatchingCharsInPlate) == 0 ): # if no groups of matching chars were found in the plate if Main.adimleri_goster == True: # show steps ############################################### print( "chars found in plate number " + str(intPlateCounter) + " = (none), click on any image and press a key to continue . . ." ) intPlateCounter = intPlateCounter + 1 cv2.destroyWindow("8") cv2.destroyWindow("9") cv2.destroyWindow("10") cv2.waitKey(0) # end if # show steps ################################################################# possiblePlate.strChars = "" continue # go back to top of for loop # end if for i in range(0, len(listOfListsOfMatchingCharsInPlate) ): # within each list of matching chars listOfListsOfMatchingCharsInPlate[i].sort( key=lambda matchingChar: matchingChar.intCenterX ) # sort chars from left to right listOfListsOfMatchingCharsInPlate[i] = removeInnerOverlappingChars( listOfListsOfMatchingCharsInPlate[i] ) # and remove inner overlapping chars # end for if Main.adimleri_goster == True: # show steps ################################################### imgContours = np.zeros((height, width, 3), np.uint8) for listOfMatchingChars in listOfListsOfMatchingCharsInPlate: intRandomBlue = random.randint(0, 255) intRandomGreen = random.randint(0, 255) intRandomRed = random.randint(0, 255) del contours[:] for matchingChar in listOfMatchingChars: contours.append(matchingChar.contour) # end for cv2.drawContours(imgContours, contours, -1, (intRandomBlue, intRandomGreen, intRandomRed)) # end for cv2.imshow("8", imgContours) # end if # show steps ##################################################################### # within each possible plate, suppose the longest list of potential matching chars is the actual list of chars intLenOfLongestListOfChars = 0 intIndexOfLongestListOfChars = 0 # loop through all the vectors of matching chars, get the index of the one with the most chars for i in range(0, len(listOfListsOfMatchingCharsInPlate)): if len(listOfListsOfMatchingCharsInPlate[i] ) > intLenOfLongestListOfChars: intLenOfLongestListOfChars = len( listOfListsOfMatchingCharsInPlate[i]) intIndexOfLongestListOfChars = i # end if # end for # suppose that the longest list of matching chars within the plate is the actual list of chars longestListOfMatchingCharsInPlate = listOfListsOfMatchingCharsInPlate[ intIndexOfLongestListOfChars] if Main.adimleri_goster == True: # show steps ################################################### imgContours = np.zeros((height, width, 3), np.uint8) del contours[:] for matchingChar in longestListOfMatchingCharsInPlate: contours.append(matchingChar.contour) # end for cv2.drawContours(imgContours, contours, -1, Main.beyaz) cv2.imshow("9", imgContours) # end if # show steps ##################################################################### possiblePlate.strChars = recognizeCharsInPlate( possiblePlate.imgThresh, longestListOfMatchingCharsInPlate) if Main.adimleri_goster == True: # show steps ################################################### print("chars found in plate number " + str(intPlateCounter) + " = " + possiblePlate.strChars + ", click on any image and press a key to continue . . .") intPlateCounter = intPlateCounter + 1 cv2.waitKey(0) # end if # show steps ##################################################################### # end of big for loop that takes up most of the function if Main.adimleri_goster == True: print( "\nchar detection complete, click on any image and press a key to continue . . .\n" ) cv2.waitKey(0) # end if return listOfPossiblePlates