Compare commits

...

28 Commits
master ... v2

Author SHA1 Message Date
  tunm 546e2ade1f
Update README.md 4 years ago
  netdrop 23244a72d3
Update README.md 5 years ago
  AlanNewImage a1cec63028
Update README.md 5 years ago
  AlanNewImage a2192dc700
Update README.md 5 years ago
  AlanNewImage e8386708af
Merge pull request #260 from AlanNewImage/v2 5 years ago
  xsl f6e43f38a0 Prj-linux and Prj-win add double-deck support 5 years ago
  xsl 8df8e2adca delete PrjIOS and PrjPHP 5 years ago
  netdrop d1709cdfc3
Update hyperlpr.py 5 years ago
  syan 8e7a054b35
Update main.cpp 5 years ago
  syan ce71005f11
Update README.md 5 years ago
  syan 8b7ea5502b
Merge pull request #235 from gaoxinge/code_format 5 years ago
  xg.gao 19e5264e3c cv2 4.x.x version support 5 years ago
  xg.gao 430bcb5389 comment print 5 years ago
  xg.gao 184531c058 python code format 5 years ago
  syan d7569db790
Update README.md 5 years ago
  syan b7225809b9
Update test_pipeline.cpp 5 years ago
  AlanNewImage afa2da27fc
Merge pull request #220 from AlanNewImage/v2 5 years ago
  xsl 74e758e403 support double-deck license plate recognition 5 years ago
  AlanNewImage 97f7e235c5
Merge pull request #1 from zeusees/v2 5 years ago
  syan 7be4edb899
Update hyperlpr.py 5 years ago
  syan 49ab6d2ba3
Merge pull request #214 from AlanNewImage/v2 5 years ago
  redmine c91bc9cbc4 fix 5 years ago
  redmine 573a51a885 update proj-Win to v2 5 years ago
  syan d5a5f8264a
Update PlateDetection.cpp 5 years ago
  jackyu1127 a1652cd69b update 5 years ago
  jackyu1127 574ede7d8e update models 5 years ago
  jackyu1127 d7d45b2da6 update models 5 years ago
  jackyu1127 27764bfed7 v2.0 5 years ago
100 changed files with 3634 additions and 17133 deletions
Split View
  1. +1
    -0
      .gitignore
  2. +0
    -155
      HyperLPRLite.py
  3. +0
    -794
      HyperLprGUI.py
  4. +1
    -1
      Prj-Linux/CMakeLists.txt
  5. +3
    -0
      Prj-Linux/lpr/.idea/dictionaries/yujinke.xml
  6. +6
    -0
      Prj-Linux/lpr/.idea/encodings.xml
  7. +408
    -0
      Prj-Linux/lpr/.idea/lpr.iml
  8. +51
    -0
      Prj-Linux/lpr/.idea/misc.xml
  9. +8
    -0
      Prj-Linux/lpr/.idea/modules.xml
  10. +355
    -0
      Prj-Linux/lpr/.idea/workspace.xml
  11. +5
    -45
      Prj-Linux/lpr/CMakeLists.txt
  12. +0
    -24
      Prj-Linux/lpr/include/CNNRecognizer.h
  13. +0
    -18
      Prj-Linux/lpr/include/FastDeskew.h
  14. +0
    -32
      Prj-Linux/lpr/include/FineMapping.h
  15. +18
    -0
      Prj-Linux/lpr/include/Finetune.h
  16. +39
    -59
      Prj-Linux/lpr/include/Pipeline.h
  17. +0
    -33
      Prj-Linux/lpr/include/PlateDetection.h
  18. +5
    -5
      Prj-Linux/lpr/include/PlateInfo.h
  19. +15
    -0
      Prj-Linux/lpr/include/PlateRecognation.h
  20. +0
    -35
      Prj-Linux/lpr/include/PlateSegmentation.h
  21. +23
    -0
      Prj-Linux/lpr/include/Platedetect.h
  22. +0
    -23
      Prj-Linux/lpr/include/Recognizer.h
  23. +0
    -28
      Prj-Linux/lpr/include/SegmentationFreeRecognizer.h
  24. +0
    -107
      Prj-Linux/lpr/include/niBlackThreshold.h
  25. BIN
      Prj-Linux/lpr/model/CharacterRecognization.caffemodel
  26. +0
    -123
      Prj-Linux/lpr/model/CharacterRecognization.prototxt
  27. BIN
      Prj-Linux/lpr/model/HorizonalFinemapping.caffemodel
  28. +11
    -0
      Prj-Linux/lpr/model/README.md
  29. BIN
      Prj-Linux/lpr/model/SegmenationFree-Inception.caffemodel
  30. BIN
      Prj-Linux/lpr/model/Segmentation.caffemodel
  31. +0
    -114
      Prj-Linux/lpr/model/Segmentation.prototxt
  32. +0
    -12117
      Prj-Linux/lpr/model/cascade.xml
  33. +504
    -0
      Prj-Linux/lpr/model/cascade_double.xml
  34. BIN
      Prj-Linux/lpr/model/mininet_ssd_v1.caffemodel
  35. +1462
    -0
      Prj-Linux/lpr/model/mininet_ssd_v1.prototxt
  36. BIN
      Prj-Linux/lpr/model/refinenet.caffemodel
  37. +300
    -0
      Prj-Linux/lpr/model/refinenet.prototxt
  38. BIN
      Prj-Linux/lpr/res/test.jpg
  39. BIN
      Prj-Linux/lpr/res/test_db1.jpg
  40. +0
    -19
      Prj-Linux/lpr/src/CNNRecognizer.cpp
  41. +0
    -108
      Prj-Linux/lpr/src/FastDeskew.cpp
  42. +0
    -170
      Prj-Linux/lpr/src/FineMapping.cpp
  43. +67
    -0
      Prj-Linux/lpr/src/FineTune.cpp
  44. +64
    -79
      Prj-Linux/lpr/src/Pipeline.cpp
  45. +87
    -16
      Prj-Linux/lpr/src/PlateDetection.cpp
  46. +61
    -0
      Prj-Linux/lpr/src/PlateRecognation.cpp
  47. +0
    -404
      Prj-Linux/lpr/src/PlateSegmentation.cpp
  48. +0
    -23
      Prj-Linux/lpr/src/Recognizer.cpp
  49. +0
    -89
      Prj-Linux/lpr/src/SegmentationFreeRecognizer.cpp
  50. +0
    -67
      Prj-Linux/lpr/src/util.h
  51. +28
    -0
      Prj-Linux/lpr/tests/testPipeLine.cpp
  52. +0
    -34
      Prj-Linux/lpr/tests/test_detection.cpp
  53. +0
    -34
      Prj-Linux/lpr/tests/test_fastdeskew.cpp
  54. +0
    -25
      Prj-Linux/lpr/tests/test_finemapping.cpp
  55. +0
    -199
      Prj-Linux/lpr/tests/test_pipeline.cpp
  56. +0
    -54
      Prj-Linux/lpr/tests/test_recognization.cpp
  57. +0
    -43
      Prj-Linux/lpr/tests/test_segmentation.cpp
  58. +0
    -54
      Prj-Linux/lpr/tests/test_segmentationFree.cpp
  59. +0
    -46
      Prj-PHP/CMakeLists.txt
  60. +0
    -50
      Prj-PHP/README.MD
  61. +0
    -24
      Prj-PHP/include/CNNRecognizer.h
  62. +0
    -18
      Prj-PHP/include/FastDeskew.h
  63. +0
    -32
      Prj-PHP/include/FineMapping.h
  64. +0
    -60
      Prj-PHP/include/Pipeline.h
  65. +0
    -33
      Prj-PHP/include/PlateDetection.h
  66. +0
    -126
      Prj-PHP/include/PlateInfo.h
  67. +0
    -39
      Prj-PHP/include/PlateSegmentation.h
  68. +0
    -23
      Prj-PHP/include/Recognizer.h
  69. +0
    -28
      Prj-PHP/include/SegmentationFreeRecognizer.h
  70. +0
    -107
      Prj-PHP/include/niBlackThreshold.h
  71. +0
    -19
      Prj-PHP/lpr/CNNRecognizer.cpp
  72. +0
    -108
      Prj-PHP/lpr/FastDeskew.cpp
  73. +0
    -170
      Prj-PHP/lpr/FineMapping.cpp
  74. +0
    -101
      Prj-PHP/lpr/Pipeline.cpp
  75. +0
    -32
      Prj-PHP/lpr/PlateDetection.cpp
  76. +0
    -404
      Prj-PHP/lpr/PlateSegmentation.cpp
  77. +0
    -23
      Prj-PHP/lpr/Recognizer.cpp
  78. +0
    -89
      Prj-PHP/lpr/SegmentationFreeRecognizer.cpp
  79. +0
    -67
      Prj-PHP/lpr/util.h
  80. +0
    -107
      Prj-PHP/main.cpp
  81. +0
    -2
      Prj-PHP/platescan.ini
  82. BIN
      Prj-PHP/tests/demo.png
  83. +0
    -21
      Prj-PHP/tests/model/README.md
  84. +0
    -13
      Prj-PHP/tests/platescan.php
  85. BIN
      Prj-Win/.vs/Prj-Win/v14/.suo
  86. BIN
      Prj-Win/Prj-Win.VC.db
  87. +10
    -17
      Prj-Win/Prj-Win/Prj-Win.vcxproj
  88. +7
    -37
      Prj-Win/Prj-Win/Prj-Win.vcxproj.filters
  89. +16
    -0
      Prj-Win/Prj-Win/Release/Prj-Win.Build.CppClean.log
  90. +1
    -0
      Prj-Win/Prj-Win/Release/Prj-Win.log
  91. +1
    -0
      Prj-Win/Prj-Win/x64/Debug/Prj-Win.log
  92. +0
    -24
      Prj-Win/lpr/include/CNNRecognizer.h
  93. +0
    -18
      Prj-Win/lpr/include/FastDeskew.h
  94. +0
    -32
      Prj-Win/lpr/include/FineMapping.h
  95. +18
    -0
      Prj-Win/lpr/include/Finetune.h
  96. +39
    -59
      Prj-Win/lpr/include/Pipeline.h
  97. +0
    -33
      Prj-Win/lpr/include/PlateDetection.h
  98. +5
    -5
      Prj-Win/lpr/include/PlateInfo.h
  99. +15
    -0
      Prj-Win/lpr/include/PlateRecognation.h
  100. +0
    -35
      Prj-Win/lpr/include/PlateSegmentation.h

+ 1
- 0
.gitignore View File

@@ -7,3 +7,4 @@ Prj-Linux/lpr/TEST_*
Prj-Linux/*build*/
*.pyc
/Prj-PHP/build
*.idea*

+ 0
- 155
HyperLPRLite.py View File

@@ -1,155 +0,0 @@
#coding=utf-8
import cv2
import numpy as np
from keras import backend as K
from keras.models import *
from keras.layers import *

chars = [u"京", u"沪", u"津", u"渝", u"冀", u"晋", u"蒙", u"辽", u"吉", u"黑", u"苏", u"浙", u"皖", u"闽", u"赣", u"鲁", u"豫", u"鄂", u"湘", u"粤", u"桂",
u"琼", u"川", u"贵", u"云", u"藏", u"陕", u"甘", u"青", u"宁", u"新", u"0", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"A",
u"B", u"C", u"D", u"E", u"F", u"G", u"H", u"J", u"K", u"L", u"M", u"N", u"P", u"Q", u"R", u"S", u"T", u"U", u"V", u"W", u"X",
u"Y", u"Z",u"港",u"学",u"使",u"警",u"澳",u"挂",u"军",u"北",u"南",u"广",u"沈",u"兰",u"成",u"济",u"海",u"民",u"航",u"空"
]

class LPR():
def __init__(self,model_detection,model_finemapping,model_seq_rec):
self.watch_cascade = cv2.CascadeClassifier(model_detection)
self.modelFineMapping = self.model_finemapping()
self.modelFineMapping.load_weights(model_finemapping)
self.modelSeqRec = self.model_seq_rec(model_seq_rec)

def computeSafeRegion(self,shape,bounding_rect):
top = bounding_rect[1] # y
bottom = bounding_rect[1] + bounding_rect[3] # y + h
left = bounding_rect[0] # x
right = bounding_rect[0] + bounding_rect[2] # x + w
min_top = 0
max_bottom = shape[0]
min_left = 0
max_right = shape[1]
if top < min_top:
top = min_top
if left < min_left:
left = min_left
if bottom > max_bottom:
bottom = max_bottom
if right > max_right:
right = max_right
return [left,top,right-left,bottom-top]

def cropImage(self,image,rect):
x, y, w, h = self.computeSafeRegion(image.shape,rect)
return image[y:y+h,x:x+w]

def detectPlateRough(self,image_gray,resize_h = 720,en_scale =1.08 ,top_bottom_padding_rate = 0.05):
if top_bottom_padding_rate>0.2:
print("error:top_bottom_padding_rate > 0.2:",top_bottom_padding_rate)
exit(1)
height = image_gray.shape[0]
padding = int(height*top_bottom_padding_rate)
scale = image_gray.shape[1]/float(image_gray.shape[0])
image = cv2.resize(image_gray, (int(scale*resize_h), resize_h))
image_color_cropped = image[padding:resize_h-padding,0:image_gray.shape[1]]
image_gray = cv2.cvtColor(image_color_cropped,cv2.COLOR_RGB2GRAY)
watches = self.watch_cascade.detectMultiScale(image_gray, en_scale, 2, minSize=(36, 9),maxSize=(36*40, 9*40))
cropped_images = []
for (x, y, w, h) in watches:
x -= w * 0.14
w += w * 0.28
y -= h * 0.15
h += h * 0.3
cropped = self.cropImage(image_color_cropped, (int(x), int(y), int(w), int(h)))
cropped_images.append([cropped,[x, y+padding, w, h]])
return cropped_images

def fastdecode(self,y_pred):
results = ""
confidence = 0.0
table_pred = y_pred.reshape(-1, len(chars)+1)
res = table_pred.argmax(axis=1)
for i,one in enumerate(res):
if one<len(chars) and (i==0 or (one!=res[i-1])):
results+= chars[one]
confidence+=table_pred[i][one]
confidence/= len(results)
return results,confidence

def model_seq_rec(self,model_path):
width, height, n_len, n_class = 164, 48, 7, len(chars)+ 1
rnn_size = 256
input_tensor = Input((164, 48, 3))
x = input_tensor
base_conv = 32
for i in range(3):
x = Conv2D(base_conv * (2 ** (i)), (3, 3))(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
conv_shape = x.get_shape()
x = Reshape(target_shape=(int(conv_shape[1]), int(conv_shape[2] * conv_shape[3])))(x)
x = Dense(32)(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
gru_1 = GRU(rnn_size, return_sequences=True, kernel_initializer='he_normal', name='gru1')(x)
gru_1b = GRU(rnn_size, return_sequences=True, go_backwards=True, kernel_initializer='he_normal', name='gru1_b')(x)
gru1_merged = add([gru_1, gru_1b])
gru_2 = GRU(rnn_size, return_sequences=True, kernel_initializer='he_normal', name='gru2')(gru1_merged)
gru_2b = GRU(rnn_size, return_sequences=True, go_backwards=True, kernel_initializer='he_normal', name='gru2_b')(gru1_merged)
x = concatenate([gru_2, gru_2b])
x = Dropout(0.25)(x)
x = Dense(n_class, kernel_initializer='he_normal', activation='softmax')(x)
base_model = Model(inputs=input_tensor, outputs=x)
base_model.load_weights(model_path)
return base_model

def model_finemapping(self):
input = Input(shape=[16, 66, 3]) # change this shape to [None,None,3] to enable arbitraty shape input
x = Conv2D(10, (3, 3), strides=1, padding='valid', name='conv1')(input)
x = Activation("relu", name='relu1')(x)
x = MaxPool2D(pool_size=2)(x)
x = Conv2D(16, (3, 3), strides=1, padding='valid', name='conv2')(x)
x = Activation("relu", name='relu2')(x)
x = Conv2D(32, (3, 3), strides=1, padding='valid', name='conv3')(x)
x = Activation("relu", name='relu3')(x)
x = Flatten()(x)
output = Dense(2,name = "dense")(x)
output = Activation("relu", name='relu4')(output)
model = Model([input], [output])
return model

def finemappingVertical(self,image,rect):
resized = cv2.resize(image,(66,16))
resized = resized.astype(np.float)/255
res_raw= self.modelFineMapping.predict(np.array([resized]))[0]
res =res_raw*image.shape[1]
res = res.astype(np.int)
H,T = res
H-=3
if H<0:
H=0
T+=2;
if T>= image.shape[1]-1:
T= image.shape[1]-1
rect[2] -= rect[2]*(1-res_raw[1] + res_raw[0])
rect[0]+=res[0]
image = image[:,H:T+2]
image = cv2.resize(image, (int(136), int(36)))
return image,rect

def recognizeOne(self,src):
x_tempx = src
x_temp = cv2.resize(x_tempx,( 164,48))
x_temp = x_temp.transpose(1, 0, 2)
y_pred = self.modelSeqRec.predict(np.array([x_temp]))
y_pred = y_pred[:,2:,:]
return self.fastdecode(y_pred)

def SimpleRecognizePlateByE2E(self,image):
images = self.detectPlateRough(image,image.shape[0],top_bottom_padding_rate=0.1)
res_set = []
for j,plate in enumerate(images):
plate, rect =plate
image_rgb,rect_refine = self.finemappingVertical(plate,rect)
res,confidence = self.recognizeOne(image_rgb)
res_set.append([res,confidence,rect_refine])
return res_set

+ 0
- 794
HyperLprGUI.py View File

@@ -1,794 +0,0 @@
"""
Author: youngorsu
Email : zhiyongsu@qq.com
Last edited: 2018.1.29
"""
# coding=utf-8


import sys
import os
from PyQt5.QtWidgets import (
QMainWindow,
QLabel,
QLineEdit,
QPushButton,
QHBoxLayout,
QVBoxLayout,
QGridLayout,
QTableWidget,
QWidget,
QAbstractItemView,
QHeaderView,
QGraphicsView,
QGraphicsScene,
QGraphicsPixmapItem,
QSplitter,
QFileDialog,
QTableWidgetItem,
QGraphicsRectItem,
QCheckBox,
QMessageBox,
QGroupBox,
QGraphicsSimpleTextItem,
qApp,
QAction,
QApplication)
from PyQt5.QtGui import QIcon, QColor, QPainter, QImage, QPixmap, QPen, QBrush, QFont, QPalette, QKeySequence
from PyQt5.QtCore import Qt, QDir, QSize, QEventLoop, QThread, pyqtSignal

from hyperlpr_py3 import pipline as pp

import cv2

import numpy as np

import time

import shutil

draw_plate_in_image_enable = 1

plateTypeName = ["蓝", "黄", "绿", "白", "黑 "]


def SimpleRecognizePlateWithGui(image):
t0 = time.time()

images = pp.detect.detectPlateRough(
image, image.shape[0], top_bottom_padding_rate=0.1)

res_set = []
y_offset = 32
for j, plate in enumerate(images):
plate, rect, origin_plate = plate

plate = cv2.resize(plate, (136, 36 * 2))
t1 = time.time()

plate_type = pp.td.SimplePredict(plate)
plate_color = plateTypeName[plate_type]

if (plate_type > 0) and (plate_type < 5):
plate = cv2.bitwise_not(plate)

if draw_plate_in_image_enable == 1:
image[y_offset:y_offset + plate.shape[0], 0:plate.shape[1]] = plate
y_offset = y_offset + plate.shape[0] + 4

image_rgb = pp.fm.findContoursAndDrawBoundingBox(plate)

if draw_plate_in_image_enable == 1:
image[y_offset:y_offset + image_rgb.shape[0],
0:image_rgb.shape[1]] = image_rgb
y_offset = y_offset + image_rgb.shape[0] + 4

image_rgb = pp.fv.finemappingVertical(image_rgb)

if draw_plate_in_image_enable == 1:
image[y_offset:y_offset + image_rgb.shape[0],
0:image_rgb.shape[1]] = image_rgb
y_offset = y_offset + image_rgb.shape[0] + 4

pp.cache.verticalMappingToFolder(image_rgb)

if draw_plate_in_image_enable == 1:
image[y_offset:y_offset + image_rgb.shape[0],
0:image_rgb.shape[1]] = image_rgb
y_offset = y_offset + image_rgb.shape[0] + 4

e2e_plate, e2e_confidence = pp.e2e.recognizeOne(image_rgb)
print("e2e:", e2e_plate, e2e_confidence)

image_gray = cv2.cvtColor(image_rgb, cv2.COLOR_RGB2GRAY)

#print("校正", time.time() - t1, "s")

t2 = time.time()
val = pp.segmentation.slidingWindowsEval(image_gray)
# print val
#print("分割和识别", time.time() - t2, "s")

res=""
confidence = 0
if len(val) == 3:
blocks, res, confidence = val
if confidence / 7 > 0.7:

if draw_plate_in_image_enable == 1:
image = pp.drawRectBox(image, rect, res)
for i, block in enumerate(blocks):
block_ = cv2.resize(block, (24, 24))
block_ = cv2.cvtColor(block_, cv2.COLOR_GRAY2BGR)
image[j * 24:(j * 24) + 24, i *
24:(i * 24) + 24] = block_
if image[j * 24:(j * 24) + 24,
i * 24:(i * 24) + 24].shape == block_.shape:
pass

res_set.append([res,
confidence / 7,
rect,
plate_color,
e2e_plate,
e2e_confidence,
len(blocks)])
print("seg:",res,confidence/7)
#print(time.time() - t0, "s")

print("---------------------------------")
return image, res_set


class LicenseRecognizationThread(QThread):

recognization_done_signal = pyqtSignal(list)

def __init__(self, parent=None):
super().__init__(parent)
self.hyperlpr_dir_path = ""
self.filenames = []

def set_parameter(self, filename_list, path):
self.hyperlpr_dir_path = path
self.filenames = filename_list

def run(self):
while True:
time.sleep(1)
if len(self.hyperlpr_dir_path) > 0:
for i in range(0, len(self.filenames)):
path = os.path.join(
self.hyperlpr_dir_path, self.filenames[i])
image = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
image, res_set = SimpleRecognizePlateWithGui(image)
self.recognization_done_signal.emit([i, res_set])

self.hyperlpr_dir_path = ""


class HyperLprImageView(QGraphicsView):

def __init__(self):

super().__init__()

self.init_ui()

def init_ui(self):

scene = QGraphicsScene()
scene.setBackgroundBrush(QColor(100, 100, 100))
scene.setItemIndexMethod(QGraphicsScene.BspTreeIndex)

scene.setSceneRect(scene.itemsBoundingRect())

self.setDragMode(QGraphicsView.RubberBandDrag)
self.setViewportUpdateMode(QGraphicsView.FullViewportUpdate)
self.setRenderHints(QPainter.Antialiasing | QPainter.TextAntialiasing)

self.frame_item = QGraphicsPixmapItem()

self.text_item_offset = 0
self.rect_item_array = []
self.text_item_array = []
for i in range(0, 5):
rect_item = QGraphicsRectItem()
rect_item.setVisible(False)
rect_item.setZValue(20.0)
rect_item.setPen(QPen(Qt.red, 5))
rect_item.setRect(20, 20, 20, 20)
scene.addItem(rect_item)
self.rect_item_array.append(rect_item)
text_item = QGraphicsSimpleTextItem("")
text_item.setBrush(QBrush(Qt.red))
text_item.setZValue(20.0)
text_item.setPos(10, 50)
text_item.setFont(QFont("黑体", 24))
text_item.setVisible(False)
scene.addItem(text_item)
self.text_item_array.append(text_item)

scene.addItem(self.frame_item)

self.curr_factor = 1.0

self.setScene(scene)

def resetRectText(self, res_set):
max_no = len(res_set)

if max_no > 5:
max_no = 5

for i in range(0, 5):
if i < max_no:
curr_rect = res_set[i][2]
self.rect_item_array[i].setRect(int(curr_rect[0]), int(
curr_rect[1]), int(curr_rect[2]), int(curr_rect[3]))
self.rect_item_array[i].setVisible(True)

self.text_item_array[i].setText(
res_set[i][4] + " " + res_set[i][3])
self.text_item_array[i].setPos(
int(curr_rect[0]), int(curr_rect[1]) - 48)
self.text_item_array[i].setVisible(True)
else:
self.text_item_array[i].setVisible(False)
self.rect_item_array[i].setVisible(False)

def wheelEvent(self, event):
factor = event.angleDelta().y() / 120.0
if event.angleDelta().y() / 120.0 > 0:
factor = 1.08
else:
factor = 0.92

if self.curr_factor > 0.1 and self.curr_factor < 10:
self.curr_factor = self.curr_factor * factor
self.scale(factor, factor)

def resetPixmap(self, image):

self.frame_item.setPixmap(QPixmap.fromImage(image))


class HyperLprWindow(QMainWindow):

start_init_signal = pyqtSignal()

def __init__(self):

super().__init__()

self.initUI()

def initUI(self):

self.statusBar().showMessage('Ready')

self.left_action = QAction('上一个', self)
self.left_action.setShortcut(QKeySequence.MoveToPreviousChar)
self.left_action.triggered.connect(self.analyze_last_one_image)

self.right_action = QAction('下一个', self)
self.right_action.setShortcut(QKeySequence.MoveToNextChar)
self.right_action.triggered.connect(self.analyze_next_one_image)

self.rename_image_action = QAction('保存e2e文件名', self)
self.rename_image_action.setShortcut(QKeySequence.MoveToPreviousLine)
self.rename_image_action.triggered.connect(self.rename_current_image_with_info)

self.statusBar()

menubar = self.menuBar()
fileMenu = menubar.addMenu('&Function')
fileMenu.addAction(self.left_action)
fileMenu.addAction(self.right_action)
fileMenu.addAction(self.rename_image_action)

self.image_window_view = HyperLprImageView()

table_widget_header_labels = [
"文件名",
"分割识别",
"置信度",
"颜色",
"E2E识别",
"E2E置信度"]

self.hyperlpr_tableview = QTableWidget(
0, len(table_widget_header_labels))
self.hyperlpr_tableview.setHorizontalHeaderLabels(
table_widget_header_labels)

self.hyperlpr_tableview.setSelectionBehavior(
QAbstractItemView.SelectItems)
self.hyperlpr_tableview.setSelectionMode(
QAbstractItemView.SingleSelection)
self.hyperlpr_tableview.setEditTriggers(
QAbstractItemView.NoEditTriggers)
self.hyperlpr_tableview.horizontalHeader().setSectionResizeMode(
QHeaderView.ResizeToContents)
self.hyperlpr_tableview.setEditTriggers(
QAbstractItemView.NoEditTriggers)

self.hyperlpr_tableview.cellClicked.connect(
self.recognize_one_license_plate)

self.left_button = QPushButton("<")
self.left_button.setFixedWidth(60)
self.right_button = QPushButton(">")
self.right_button.setFixedWidth(60)
self.left_button.setEnabled(False)
self.right_button.setEnabled(False)
self.left_button.clicked.connect(self.analyze_last_one_image)
self.right_button.clicked.connect(self.analyze_next_one_image)
left_right_layout = QHBoxLayout()
left_right_layout.addStretch()
left_right_layout.addWidget(self.left_button)
left_right_layout.addStretch()
left_right_layout.addWidget(self.right_button)
left_right_layout.addStretch()

self.location_label = QLabel("车牌目录", self)
self.location_text = QLineEdit(self)
self.location_text.setEnabled(False)
#self.location_text.setFixedWidth(300)
self.location_button = QPushButton("...")
self.location_button.clicked.connect(self.select_new_dir)

self.location_layout = QHBoxLayout()
self.location_layout.addWidget(self.location_label)
self.location_layout.addWidget(self.location_text)
self.location_layout.addWidget(self.location_button)
self.location_layout.addStretch()

self.check_box = QCheckBox("与文件名比较车牌")
self.check_box.setChecked(True)

self.update_file_path_button = QPushButton('批量识别')
self.update_file_path_button.clicked.connect(
self.batch_recognize_all_images)

self.update_file_path_layout = QHBoxLayout()
self.update_file_path_layout.addWidget(self.check_box)
self.update_file_path_layout.addWidget(self.update_file_path_button)
self.update_file_path_layout.addStretch()

self.save_as_e2e_filename_button = QPushButton("保存e2e文件名")
self.save_as_e2e_filename_button.setEnabled(False)
self.save_as_e2e_filename_button.clicked.connect(self.rename_current_image_with_info)
self.save_layout = QHBoxLayout()
self.save_layout.addWidget(self.save_as_e2e_filename_button)
self.save_layout.addStretch()

self.top_layout = QVBoxLayout()
self.top_layout.addLayout(left_right_layout)
self.top_layout.addLayout(self.location_layout)
self.top_layout.addLayout(self.update_file_path_layout)
self.top_layout.addLayout(self.save_layout)

function_groupbox = QGroupBox("功能区")
function_groupbox.setLayout(self.top_layout)

license_plate_image_label = QLabel("车牌图")
self.license_plate_widget = QLabel("")

block_image_label = QLabel("分割图")
self.block_plate_widget = QLabel("")

filename_label = QLabel("文件名:")
self.filename_edit = QLineEdit()

segmentation_recognition_label = QLabel("分割识别:")
self.segmentation_recognition_edit = QLineEdit()
self.segmentation_recognition_edit.setFont(QFont("黑体", 24, QFont.Bold))
# self.segmentation_recognition_edit.setStyleSheet("color:red")

confidence_label = QLabel("分割识别\n置信度")
self.confidence_edit = QLineEdit()
#self.confidence_edit.setFont(QFont("黑体", 24, QFont.Bold))
# self.confidence_edit.setStyleSheet("color:red")

plate_color_label = QLabel("车牌颜色")
self.plate_color_edit = QLineEdit()
self.plate_color_edit.setFont(QFont("黑体", 24, QFont.Bold))
# self.plate_color_edit.setStyleSheet("color:red")

e2e_recognization_label = QLabel("e2e识别:")
self.e2e_recognization_edit = QLineEdit()
self.e2e_recognization_edit.setFont(QFont("黑体", 24, QFont.Bold))
# self.e2e_recognization_edit.setStyleSheet("color:red")

e2e_confidence_label = QLabel("e2e置信度")
self.e2e_confidence_edit = QLineEdit()
#self.e2e_confidence_edit.setFont(QFont("黑体", 24, QFont.Bold))
# self.e2e_confidence_edit.setStyleSheet("color:red")

info_gridlayout = QGridLayout()
line_index = 0
info_gridlayout.addWidget(filename_label, line_index, 0)
info_gridlayout.addWidget(self.filename_edit, line_index, 1)
line_index += 1
info_gridlayout.addWidget(license_plate_image_label, line_index, 0)
info_gridlayout.addWidget(self.license_plate_widget, line_index, 1)
line_index += 1
info_gridlayout.addWidget(e2e_recognization_label, line_index, 0)
info_gridlayout.addWidget(self.e2e_recognization_edit, line_index, 1)
line_index += 1
info_gridlayout.addWidget(
segmentation_recognition_label, line_index, 0)
info_gridlayout.addWidget(
self.segmentation_recognition_edit, line_index, 1)
line_index += 1
info_gridlayout.addWidget(plate_color_label, line_index, 0)
info_gridlayout.addWidget(self.plate_color_edit, line_index, 1)
line_index += 1
info_gridlayout.addWidget(block_image_label, line_index, 0)
info_gridlayout.addWidget(self.block_plate_widget, line_index, 1)
line_index += 1
info_gridlayout.addWidget(confidence_label, line_index, 0)
info_gridlayout.addWidget(self.confidence_edit, line_index, 1)
line_index += 1
info_gridlayout.addWidget(e2e_confidence_label, line_index, 0)
info_gridlayout.addWidget(self.e2e_confidence_edit, line_index, 1)

info_widget = QGroupBox("分割识别&e2e")

info_widget.setLayout(info_gridlayout)

right_splitter = QSplitter(Qt.Vertical)
right_splitter.addWidget(self.hyperlpr_tableview)
right_splitter.addWidget(function_groupbox)
right_splitter.addWidget(info_widget)
right_splitter.setStretchFactor(0, 2)
right_splitter.setStretchFactor(2, 1)

main_splitter = QSplitter(Qt.Horizontal)
main_splitter.addWidget(self.image_window_view)
main_splitter.addWidget(right_splitter)
main_splitter.setStretchFactor(0, 1)

self.image_filename_list = []
self.hyperlpr_dir_path = ""
self.segmentation_recognition_correct_number = 0
self.color_correct_number = 0
self.e2e_recognization_correct_number = 0
self.current_row = 0

self.batch_recognization_thread = LicenseRecognizationThread()
self.batch_recognization_thread.recognization_done_signal.connect(
self.recognization_done_slot)
self.batch_recognization_thread.start()

self.start_init_signal.connect(self.read_path_and_show_one_image)

self.setCentralWidget(main_splitter)

self.setWindowTitle("HyperLPR车牌识别软件v1.0")

self.start_init_signal.emit()

def read_path_and_show_one_image(self):

hyperlpr_dir_info_filepath = QDir.homePath() + "/hyperlpr_dir_file"
if os.path.exists(hyperlpr_dir_info_filepath):
with open(hyperlpr_dir_info_filepath, 'r') as f:
self.hyperlpr_dir_path = f.read()

if len(self.hyperlpr_dir_path) > 0:
self.reset_info_gui()

if len(self.image_filename_list) > 0:
self.recognize_and_show_one_image(self.image_filename_list[0], 0)

def select_new_dir(self):

self.hyperlpr_dir_path = QFileDialog.getExistingDirectory(
self, "读取文件夹", QDir.currentPath())

if len(self.hyperlpr_dir_path) > 0:
hyperlpr_dir_info_filepath = QDir.homePath() + "/hyperlpr_dir_file"
with open(hyperlpr_dir_info_filepath, 'w') as f:
f.write(self.hyperlpr_dir_path)
self.reset_info_gui()

def rename_current_image_with_info(self):
if len(self.hyperlpr_dir_path) > 0:
target_dir_path = self.hyperlpr_dir_path + "/result"
if not os.path.exists(target_dir_path):
os.makedirs(target_dir_path)
if len(self.plate_color_edit.text())>0 and len(self.e2e_recognization_edit.text())>0:
orign_path = os.path.join(self.hyperlpr_dir_path, self.filename_edit.text())
target_path = os.path.join(target_dir_path,self.plate_color_edit.text()+"-"+self.e2e_recognization_edit.text()+".jpg")
shutil.copyfile(orign_path, target_path)

def reset_info_gui(self):

self.location_text.setText(self.hyperlpr_dir_path)
self.scan_files_with_new_dir(self.hyperlpr_dir_path)
self.fill_table_with_new_info()

def scan_files_with_new_dir(self, path):

name_list = os.listdir(path) # 列出文件夹下所有的目录与文件
self.image_filename_list.clear()
for i in range(0, len(name_list)):
if name_list[i].endswith(
".jpg") or name_list[i].endswith(".png"):
self.image_filename_list.append(name_list[i])

def fill_table_with_new_info(self):
self.hyperlpr_tableview.clearContents()
row_count = self.hyperlpr_tableview.rowCount()
for i in range(row_count, -1, -1):
self.hyperlpr_tableview.removeRow(i)

for i in range(0, len(self.image_filename_list)):
row = self.hyperlpr_tableview.rowCount()
self.hyperlpr_tableview.insertRow(row)

item0 = QTableWidgetItem()
item0.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(row, 0, item0)
self.hyperlpr_tableview.item(
row, 0).setText(
self.image_filename_list[i])

item1 = QTableWidgetItem()
item1.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(row, 1, item1)

item2 = QTableWidgetItem()
item2.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(row, 2, item2)

item3 = QTableWidgetItem()
item3.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(row, 3, item3)

item4 = QTableWidgetItem()
item4.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(row, 4, item4)

item5 = QTableWidgetItem()
item5.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(row, 5, item5)

if len(self.image_filename_list) > 0:
self.left_button.setEnabled(True)
self.right_button.setEnabled(True)
self.save_as_e2e_filename_button.setEnabled(True)

def analyze_last_one_image(self):
if self.current_row > 0:
self.recognize_one_license_plate(self.current_row-1, 0)

def analyze_next_one_image(self):
if self.current_row < (len(self.image_filename_list)-1):
self.recognize_one_license_plate(self.current_row + 1, 0)

def recognize_one_license_plate(self, row, col):
if col == 0 and row < len(self.image_filename_list):
self.current_row = row
self.recognize_and_show_one_image(
self.image_filename_list[row], row)

def recognize_and_show_one_image(self, image_filename_text, row):

if image_filename_text.endswith(".jpg"):

print(image_filename_text)
path = os.path.join(self.hyperlpr_dir_path, image_filename_text)
image = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
image, res_set = SimpleRecognizePlateWithGui(image)
img = QImage(
image.data,
image.shape[1],
image.shape[0],
image.shape[1] * image.shape[2],
QImage.Format_RGB888)
self.image_window_view.resetPixmap(img.rgbSwapped())
self.image_window_view.resetRectText(res_set)

if len(res_set) > 0:
curr_rect = res_set[0][2]
image_crop = image[int(curr_rect[1]):int(
curr_rect[1] + curr_rect[3]), int(curr_rect[0]):int(curr_rect[0] + curr_rect[2])]
curr_plate = cv2.resize(image_crop, (204, 108))
plate_img = QImage(
curr_plate.data,
curr_plate.shape[1],
curr_plate.shape[0],
curr_plate.shape[1] *
curr_plate.shape[2],
QImage.Format_RGB888)
self.license_plate_widget.setPixmap(
QPixmap.fromImage(plate_img.rgbSwapped()))

# print(res_set[0][6])
block_crop = image[0:24, 0:(24 * int(res_set[0][6]))]
curr_block = cv2.resize(
block_crop, (24 * int(res_set[0][6]), 24))
block_image = QImage(
curr_block.data,
curr_block.shape[1],
curr_block.shape[0],
curr_block.shape[1] *
curr_block.shape[2],
QImage.Format_RGB888)
self.block_plate_widget.setPixmap(
QPixmap.fromImage(block_image.rgbSwapped()))

self.segmentation_recognition_edit.setText(res_set[0][0])
if res_set[0][0] in image_filename_text:
self.segmentation_recognition_edit.setStyleSheet("color:black")
else:
self.segmentation_recognition_edit.setStyleSheet("color:red")


self.filename_edit.setText(image_filename_text)
self.confidence_edit.setText("%.3f" % (float(res_set[0][1])))

self.plate_color_edit.setText(res_set[0][3])
if res_set[0][3] in image_filename_text:
self.plate_color_edit.setStyleSheet("color:black")
else:
self.plate_color_edit.setStyleSheet("color:red")

self.e2e_recognization_edit.setText(res_set[0][4])
if res_set[0][4] in image_filename_text:
self.e2e_recognization_edit.setStyleSheet("color:black")
else:
self.e2e_recognization_edit.setStyleSheet("color:red")

self.e2e_confidence_edit.setText(
"%.3f" % (float(res_set[0][5])))
else:
self.license_plate_widget.clear()
self.block_plate_widget.clear()
self.segmentation_recognition_edit.setText("")
self.filename_edit.setText(image_filename_text)
self.confidence_edit.setText("")
self.plate_color_edit.setText("")
self.e2e_recognization_edit.setText("")
self.e2e_confidence_edit.setText("")

self.fill_table_widget_with_res_info(res_set, row)

def batch_recognize_all_images(self):
self.segmentation_recognition_correct_number = 0
self.color_correct_number = 0
self.e2e_recognization_correct_number = 0
self.batch_recognization_thread.set_parameter(
self.image_filename_list, self.hyperlpr_dir_path)

def recognization_done_slot(self, result_list):
row = result_list[0]
res_set = result_list[1]
self.fill_table_widget_with_res_info(res_set, row)

if row == len(self.image_filename_list) - 1:
total_number = len(self.image_filename_list)

row_count = self.hyperlpr_tableview.rowCount()
if row_count > total_number:
self.hyperlpr_tableview.removeRow(total_number)

self.hyperlpr_tableview.insertRow(total_number)

item0 = QTableWidgetItem()
item0.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(total_number, 0, item0)
self.hyperlpr_tableview.item(
total_number, 0).setText(
"统计结果")

item1 = QTableWidgetItem()
item1.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(total_number, 1, item1)
self.hyperlpr_tableview.item(
total_number,
1).setText(
"{0} / {1} = {2: .3f}".format(
self.segmentation_recognition_correct_number,
total_number,
self.segmentation_recognition_correct_number /
total_number))

item2 = QTableWidgetItem()
item2.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(total_number, 2, item2)

item3 = QTableWidgetItem()
item3.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(total_number, 3, item3)
self.hyperlpr_tableview.item(
total_number, 3).setText(
"{0} / {1} = {2: .3f}".format(self.e2e_recognization_correct_number, total_number,
self.e2e_recognization_correct_number / total_number))

item4 = QTableWidgetItem()
item4.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(total_number, 4, item4)
self.hyperlpr_tableview.item(
total_number, 4).setText(
"{0} / {1} = {2: .3f}".format(self.color_correct_number, total_number,
self.color_correct_number / total_number))

item5 = QTableWidgetItem()
item5.setTextAlignment(Qt.AlignCenter)
self.hyperlpr_tableview.setItem(total_number, 5, item5)

def fill_table_widget_with_res_info(self, res_set, row):
image_filename_text = self.image_filename_list[row]
if len(res_set) > 0:

self.hyperlpr_tableview.item(row, 1).setText(res_set[0][0])
if res_set[0][0] in image_filename_text:
self.hyperlpr_tableview.item(
row, 1).setForeground(
QBrush(
QColor(
0, 0, 255)))
self.segmentation_recognition_correct_number += 1
else:
self.hyperlpr_tableview.item(
row, 1).setForeground(
QBrush(
QColor(
255, 0, 0)))

self.hyperlpr_tableview.item(
row, 2).setText(
"%.3f" %
(float(
res_set[0][1])))

self.hyperlpr_tableview.item(row, 3).setText(res_set[0][3])
if res_set[0][3] in image_filename_text:
self.hyperlpr_tableview.item(
row, 3).setForeground(
QBrush(
QColor(
0, 0, 255)))
self.color_correct_number += 1
else:
self.hyperlpr_tableview.item(
row, 3).setForeground(
QBrush(
QColor(
255, 0, 0)))

self.hyperlpr_tableview.item(row, 4).setText(res_set[0][4])
if res_set[0][4] in image_filename_text:
self.hyperlpr_tableview.item(
row, 4).setForeground(
QBrush(
QColor(
0, 0, 255)))
self.e2e_recognization_correct_number += 1
else:
self.hyperlpr_tableview.item(
row, 4).setForeground(
QBrush(
QColor(
255, 0, 0)))

self.hyperlpr_tableview.item(
row, 5).setText(
"%.3f" %
(float(
res_set[0][5])))


if __name__ == '__main__':

app = QApplication(sys.argv)

hyper_lpr_widow = HyperLprWindow()

hyper_lpr_widow.showMaximized()

sys.exit(app.exec_())

+ 1
- 1
Prj-Linux/CMakeLists.txt View File

@@ -1,3 +1,3 @@
cmake_minimum_required(VERSION 3.6)
project(SwiftPR)
project(HyperLPR)
add_subdirectory(lpr)

+ 3
- 0
Prj-Linux/lpr/.idea/dictionaries/yujinke.xml View File

@@ -0,0 +1,3 @@
<component name="ProjectDictionaryState">
<dictionary name="yujinke" />
</component>

+ 6
- 0
Prj-Linux/lpr/.idea/encodings.xml View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>

+ 408
- 0
Prj-Linux/lpr/.idea/lpr.iml View File

@@ -0,0 +1,408 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="CPP_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/util.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/Recognizer.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/PlateSegmentation.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/CNNRecognizer.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/FastDeskew.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/FineMapping.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/Pipeline.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/PlateDetection.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/SegmentationFreeRecognizer.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/include/PlateDetection.h" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/CMakeLists.txt" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests/test_segmentationFree.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests/test_recognization.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests/test_finemapping.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests/test_fastdeskew.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests/test_segmentation.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests/test_detection.cpp" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests/test_pipeline.cpp" isTestSource="false" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library name="Header Search Paths">
<CLASSES>
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Intents.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/HIToolbox.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/SpeechRecognition.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/NavigationServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/CommonPanels.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/Help.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/SecurityHI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/OpenScripting.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/Print.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/Ink.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/CarbonSound.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/ImageCapture.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/InstantMessage.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MapKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/DirectoryService.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SafariServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/InstallerPlugins.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ForceFeedback.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreMediaIO.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreWLAN.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaVM.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaNativeFoundation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Metal.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SpriteKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Security.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AdSupport.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Kerberos.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/QuartzCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MediaAccessibility.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AddressBook.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/FWAUserLib.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/EventKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/PrintCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/LangAnalysis.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/ATS.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/HIServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/QD.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/ImageIO.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/ColorSync.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/SpeechSynthesis.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Cocoa.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/vmnet.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreMedia.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GSS.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ExceptionHandling.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Tcl.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SystemConfiguration.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreAudioKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/NaturalLanguage.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenCL.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Python.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Contacts.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/VideoSubscriberAccount.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreVideo.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GameKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenGL.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenAL.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CalendarStore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AVKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/FinderSync.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/WebKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/iTunesLibrary.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/StoreKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSImage.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSNeuralNetwork.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSRayIntersector.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSMatrix.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accounts.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SyncServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AVFoundation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AVFoundation.framework/Frameworks/AVFAudio.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Kernel.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/InputMethodKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SecurityInterface.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreImage.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GLUT.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/OSServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/SearchKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/SharedFileList.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/AE.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/FSEvents.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/DictionaryServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenDirectory.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenDirectory.framework/Frameworks/CFOpenDirectory.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/IOBluetooth.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ScriptingBridge.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreAudio.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/DiskArbitration.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreBluetooth.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Photos.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/DVDPlayback.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AudioVideoBridging.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/QTKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GameController.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ModelIO.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MediaLibrary.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OSAKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/IOBluetoothUI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/LocalAuthentication.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/NetFS.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/PreferencePanes.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ScreenSaver.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ImageCaptureCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ExternalAccessory.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ImageIO.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Automator.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Vision.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MediaPlayer.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreData.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Social.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreText.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/NetworkExtension.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SceneKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/PhotosUI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/QuickLook.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Tk.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaScriptCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/IMServicePlugIn.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AudioUnit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Foundation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/IOKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/IOSurface.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreML.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Hypervisor.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GLKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/BusinessChat.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ColorSync.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Frameworks/QuickLookUI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Frameworks/QuartzFilters.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Frameworks/ImageKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Frameworks/QuartzComposer.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Frameworks/PDFKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CloudKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GameplayKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppleScriptObjC.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CFNetwork.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CryptoTokenKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/DiscRecordingUI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Collaboration.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MediaToolbox.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreGraphics.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreTelephony.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AGL.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/VideoDecodeAcceleration.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ContactsUI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Network.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/VideoToolbox.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/NotificationCenter.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreSpotlight.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/UserNotifications.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreLocation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/DiscRecording.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/TWAIN.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/PCSC.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SecurityFoundation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/LatentSemanticMapping.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppleScriptKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MultipeerConnectivity.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/LDAP.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaFrameEmbedding.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ServiceManagement.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ICADevices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accelerate.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include" />
<root url="file:///Library/Developer/CommandLineTools/usr/include" />
<root url="file:///Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/include" />
<root url="file:///usr/local/include" />
</CLASSES>
<SOURCES>
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Intents.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/HIToolbox.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/SpeechRecognition.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/NavigationServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/CommonPanels.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/Help.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/SecurityHI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/OpenScripting.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/Print.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/Ink.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/CarbonSound.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/ImageCapture.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/InstantMessage.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MapKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/DirectoryService.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SafariServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/InstallerPlugins.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ForceFeedback.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreMediaIO.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreWLAN.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaVM.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaNativeFoundation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Metal.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SpriteKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Security.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AdSupport.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Kerberos.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/QuartzCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MediaAccessibility.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AddressBook.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/FWAUserLib.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/EventKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/PrintCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/LangAnalysis.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/ATS.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/HIServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/QD.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/ImageIO.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/ColorSync.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/SpeechSynthesis.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Cocoa.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/vmnet.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreMedia.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GSS.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ExceptionHandling.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Tcl.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SystemConfiguration.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreAudioKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/NaturalLanguage.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenCL.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Python.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Contacts.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/VideoSubscriberAccount.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreVideo.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GameKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenGL.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenAL.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CalendarStore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AVKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/FinderSync.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/WebKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/iTunesLibrary.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/StoreKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSImage.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSNeuralNetwork.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSRayIntersector.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework/Frameworks/MPSMatrix.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accounts.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SyncServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AVFoundation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AVFoundation.framework/Frameworks/AVFAudio.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Kernel.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/InputMethodKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SecurityInterface.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreImage.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GLUT.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/OSServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/SearchKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/SharedFileList.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/AE.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/FSEvents.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/DictionaryServices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenDirectory.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenDirectory.framework/Frameworks/CFOpenDirectory.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/IOBluetooth.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ScriptingBridge.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreAudio.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/DiskArbitration.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreBluetooth.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Photos.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/DVDPlayback.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AudioVideoBridging.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/QTKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GameController.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ModelIO.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MediaLibrary.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OSAKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/IOBluetoothUI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/LocalAuthentication.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/NetFS.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/PreferencePanes.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ScreenSaver.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ImageCaptureCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ExternalAccessory.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ImageIO.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Automator.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Vision.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MediaPlayer.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreData.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Social.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreText.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/NetworkExtension.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SceneKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/PhotosUI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/QuickLook.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Tk.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaScriptCore.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/IMServicePlugIn.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AudioUnit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Foundation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/IOKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/IOSurface.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreML.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Hypervisor.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GLKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/BusinessChat.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ColorSync.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Frameworks/QuickLookUI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Frameworks/QuartzFilters.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Frameworks/ImageKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Frameworks/QuartzComposer.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Quartz.framework/Frameworks/PDFKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CloudKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/GameplayKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppleScriptObjC.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CFNetwork.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CryptoTokenKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/DiscRecordingUI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Collaboration.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MediaToolbox.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreGraphics.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreTelephony.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AGL.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/VideoDecodeAcceleration.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ContactsUI.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Network.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/VideoToolbox.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/NotificationCenter.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreSpotlight.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/UserNotifications.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreLocation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/DiscRecording.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/TWAIN.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/PCSC.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/SecurityFoundation.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/LatentSemanticMapping.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppleScriptKit.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/MultipeerConnectivity.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/LDAP.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaFrameEmbedding.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ServiceManagement.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/ICADevices.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accelerate.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers" />
<root url="file:///Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include" />
<root url="file:///Library/Developer/CommandLineTools/usr/include" />
<root url="file:///Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/include" />
<root url="file:///usr/local/include" />
</SOURCES>
</library>
</orderEntry>
</component>
</module>

+ 51
- 0
Prj-Linux/lpr/.idea/misc.xml View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
<component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default">
<profile-state>
<expanded-state>
<State>
<id />
</State>
<State>
<id>C/C++</id>
</State>
</expanded-state>
<selected-state>
<State>
<id>Declaration orderC/C++</id>
</State>
</selected-state>
</profile-state>
</entry>
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="SvnConfiguration">
<configuration>$USER_HOME$/.subversion</configuration>
</component>
<component name="masterDetails">
<states>
<state key="ScopeChooserConfigurable.UI">
<settings>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>

+ 8
- 0
Prj-Linux/lpr/.idea/modules.xml View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/lpr.iml" filepath="$PROJECT_DIR$/.idea/lpr.iml" />
</modules>
</component>
</project>

+ 355
- 0
Prj-Linux/lpr/.idea/workspace.xml View File

@@ -0,0 +1,355 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakeRunConfigurationManager" shouldGenerate="true" assignedExecutableTargets="true" buildAllGenerated="true">
<generated>
<config projectName="SwiftPR" targetName="TEST_PIPLINE" />
<config projectName="SwiftPR" targetName="TEST_SEGMENTATIONFREE" />
<config projectName="SwiftPR" targetName="TEST_FINEMAPPING" />
<config projectName="SwiftPR" targetName="TEST_RECOGNIZATION" />
<config projectName="SwiftPR" targetName="TEST_SEGMENTATION" />
<config projectName="SwiftPR" targetName="TEST_Detection" />
<config projectName="SwiftPR" targetName="TEST_FASTDESKEW" />
</generated>
</component>
<component name="CMakeSettings" AUTO_RELOAD="false" GENERATION_PASS_SYSTEM_ENVIRONMENT="true">
<ADDITIONAL_GENERATION_ENVIRONMENT>
<envs />
</ADDITIONAL_GENERATION_ENVIRONMENT>
</component>
<component name="ChangeListManager">
<list default="true" id="36bab71f-7b8b-4c17-ae93-a4dc42ab475f" name="Default" comment="" />
<ignored path="lpr.iws" />
<ignored path=".idea/workspace.xml" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="CreatePatchCommitExecutor">
<option name="PATCH_PATH" value="" />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
<component name="FavoritesManager">
<favorites_list name="lpr" />
</component>
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="util.h" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/util.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="288">
<caret line="12" column="17" selection-start-line="12" selection-start-column="17" selection-end-line="12" selection-end-column="17" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="PlateSegmentation.h" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/include/PlateSegmentation.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Pipeline.h" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/include/Pipeline.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="24" column="0" selection-start-line="24" selection-start-column="0" selection-end-line="24" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="niBlackThreshold.h" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/include/niBlackThreshold.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="PlateDetection.h" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/include/PlateDetection.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="165">
<caret line="13" column="52" selection-start-line="13" selection-start-column="52" selection-end-line="13" selection-end-column="52" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="PlateInfo.h" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/include/PlateInfo.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2450">
<caret line="98" column="0" selection-start-line="98" selection-start-column="0" selection-end-line="98" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/include/niBlackThreshold.h" />
<option value="$PROJECT_DIR$/include/Pipeline.h" />
<option value="$PROJECT_DIR$/include/PlateDetection.h" />
<option value="$PROJECT_DIR$/include/PlateInfo.h" />
</list>
</option>
</component>
<component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsGulpfileManager">
<detection-done>true</detection-done>
<sorting>DEFINITION_ORDER</sorting>
</component>
<component name="ProjectFrameBounds">
<option name="width" value="1696" />
<option name="height" value="1440" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1">
<flattenPackages />
<showMembers />
<showModules />
<showLibraryContents />
<hideEmptyPackages />
<abbreviatePackageNames />
<autoscrollToSource />
<autoscrollFromSource />
<sortByType />
<manualOrder />
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="lpr" />
<option name="myItemType" value="com.jetbrains.cidr.projectView.CidrFilesViewHelper$MyProjectTreeStructure$1" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="lpr" />
<option name="myItemType" value="com.jetbrains.cidr.projectView.CidrFilesViewHelper$MyProjectTreeStructure$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="lpr" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="lpr" />
<option name="myItemType" value="com.jetbrains.cidr.projectView.CidrFilesViewHelper$MyProjectTreeStructure$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="lpr" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="tests" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="lpr" />
<option name="myItemType" value="com.jetbrains.cidr.projectView.CidrFilesViewHelper$MyProjectTreeStructure$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="lpr" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="include" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
</panes>
</component>
<component name="PropertiesComponent">
<property name="settings.editor.selected.configurable" value="configurable.group.language" />
<property name="settings.editor.splitter.proportion" value="0.2" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="FullScreen" value="true" />
</component>
<component name="RunManager" selected="Application.Build All">
<configuration default="true" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SwiftPR" TARGET_NAME="TEST_Detection" CONFIG_NAME="Debug">
<envs />
<method />
</configuration>
<configuration default="false" name="Build All" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" CONFIG_NAME="Debug" EXPLICIT_BUILD_TARGET_NAME="all">
<envs />
<method />
</configuration>
<configuration default="false" name="TEST_Detection" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SwiftPR" TARGET_NAME="TEST_Detection" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="SwiftPR" RUN_TARGET_NAME="TEST_Detection">
<envs />
<method />
</configuration>
<configuration default="false" name="TEST_FASTDESKEW" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SwiftPR" TARGET_NAME="TEST_FASTDESKEW" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="SwiftPR" RUN_TARGET_NAME="TEST_FASTDESKEW">
<envs />
<method />
</configuration>
<configuration default="false" name="TEST_FINEMAPPING" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SwiftPR" TARGET_NAME="TEST_FINEMAPPING" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="SwiftPR" RUN_TARGET_NAME="TEST_FINEMAPPING">
<envs />
<method />
</configuration>
<configuration default="false" name="TEST_PIPLINE" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SwiftPR" TARGET_NAME="TEST_PIPLINE" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="SwiftPR" RUN_TARGET_NAME="TEST_PIPLINE">
<envs />
<method />
</configuration>
<configuration default="false" name="TEST_RECOGNIZATION" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SwiftPR" TARGET_NAME="TEST_RECOGNIZATION" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="SwiftPR" RUN_TARGET_NAME="TEST_RECOGNIZATION">
<envs />
<method />
</configuration>
<configuration default="false" name="TEST_SEGMENTATION" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SwiftPR" TARGET_NAME="TEST_SEGMENTATION" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="SwiftPR" RUN_TARGET_NAME="TEST_SEGMENTATION">
<envs />
<method />
</configuration>
<configuration default="false" name="TEST_SEGMENTATIONFREE" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="SwiftPR" TARGET_NAME="TEST_SEGMENTATIONFREE" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="SwiftPR" RUN_TARGET_NAME="TEST_SEGMENTATIONFREE">
<envs />
<method />
</configuration>
<list size="8">
<item index="0" class="java.lang.String" itemvalue="Application.Build All" />
<item index="1" class="java.lang.String" itemvalue="Application.TEST_Detection" />
<item index="2" class="java.lang.String" itemvalue="Application.TEST_FASTDESKEW" />
<item index="3" class="java.lang.String" itemvalue="Application.TEST_FINEMAPPING" />
<item index="4" class="java.lang.String" itemvalue="Application.TEST_PIPLINE" />
<item index="5" class="java.lang.String" itemvalue="Application.TEST_RECOGNIZATION" />
<item index="6" class="java.lang.String" itemvalue="Application.TEST_SEGMENTATION" />
<item index="7" class="java.lang.String" itemvalue="Application.TEST_SEGMENTATIONFREE" />
</list>
</component>
<component name="ShelveChangesManager" show_recycled="false">
<option name="remove_strategy" value="false" />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="36bab71f-7b8b-4c17-ae93-a4dc42ab475f" name="Default" comment="" />
<created>1575735616184</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1575735616184</updated>
<workItem from="1575735618080" duration="1037000" />
</task>
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="1037000" />
</component>
<component name="ToolWindowManager">
<frame x="0" y="0" width="1696" height="1440" extended-state="6" />
<editor active="true" />
<layout>
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.21134329" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="CMake" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
</layout>
</component>
<component name="Vcs.Log.UiProperties">
<option name="RECENTLY_FILTERED_USER_GROUPS">
<collection />
</option>
<option name="RECENTLY_FILTERED_BRANCH_GROUPS">
<collection />
</option>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
<watches-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/util.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="288">
<caret line="12" column="17" selection-start-line="12" selection-start-column="17" selection-end-line="12" selection-end-column="17" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/include/PlateSegmentation.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/include/niBlackThreshold.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/include/Pipeline.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="24" column="0" selection-start-line="24" selection-start-column="0" selection-end-line="24" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/include/PlateDetection.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="165">
<caret line="13" column="52" selection-start-line="13" selection-start-column="52" selection-end-line="13" selection-end-column="52" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/include/PlateInfo.h">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2450">
<caret line="98" column="0" selection-start-line="98" selection-start-column="0" selection-end-line="98" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</component>
</project>

+ 5
- 45
Prj-Linux/lpr/CMakeLists.txt View File

@@ -3,55 +3,15 @@ project(SwiftPR)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
find_package(OpenCV 3.3.0 REQUIRED)
find_package(OpenCV 3.4.3 REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS})
include_directories(include)

set(SRC_DETECTION src/PlateDetection.cpp src/util.h include/PlateDetection.h)

set(SRC_FINEMAPPING src/FineMapping.cpp )

set(SRC_FASTDESKEW src/FastDeskew.cpp )

set(SRC_SEGMENTATION src/PlateSegmentation.cpp )

set(SRC_RECOGNIZE src/Recognizer.cpp src/CNNRecognizer.cpp)

set(SRC_DETECTION src/PlateDetection.cpp)
set(SRC_FINETUNE src/FineTune.cpp)
set(SRC_RECOGNIZE src/PlateRecognation.cpp)
set(SRC_PIPLINE src/Pipeline.cpp)

set(SRC_SEGMENTATIONFREE src/SegmentationFreeRecognizer.cpp )

#set(SOURCE_FILES main.cpp)
#add_executable(HyperLPR_cpp ${SOURCE_FILES})

#TEST_DETECTION
add_executable(TEST_Detection ${SRC_DETECTION} tests/test_detection.cpp)
target_link_libraries(TEST_Detection ${OpenCV_LIBS})

#TEST_FINEMAPPING
add_executable(TEST_FINEMAPPING ${SRC_FINEMAPPING} tests/test_finemapping.cpp)
target_link_libraries(TEST_FINEMAPPING ${OpenCV_LIBS})

#TEST_DESKEW

add_executable(TEST_FASTDESKEW ${SRC_FASTDESKEW} tests/test_fastdeskew.cpp)
target_link_libraries(TEST_FASTDESKEW ${OpenCV_LIBS})

#TEST_SEGMENTATION

add_executable(TEST_SEGMENTATION ${SRC_SEGMENTATION} ${SRC_RECOGNIZE} tests/test_segmentation.cpp)
target_link_libraries(TEST_SEGMENTATION ${OpenCV_LIBS})

#TEST_RECOGNIZATION

add_executable(TEST_RECOGNIZATION ${SRC_RECOGNIZE} tests/test_recognization.cpp)
target_link_libraries(TEST_RECOGNIZATION ${OpenCV_LIBS})

#TEST_SEGMENTATIONFREE
add_executable(TEST_SEGMENTATIONFREE ${SRC_SEGMENTATIONFREE} tests/test_segmentationFree.cpp)
target_link_libraries(TEST_SEGMENTATIONFREE ${OpenCV_LIBS})

#TEST_PIPELINE

add_executable(TEST_PIPLINE ${SRC_DETECTION} ${SRC_FINEMAPPING} ${SRC_FASTDESKEW} ${SRC_SEGMENTATION} ${SRC_RECOGNIZE} ${SRC_PIPLINE} ${SRC_SEGMENTATIONFREE} tests/test_pipeline.cpp)
add_executable(TEST_PIPLINE ${SRC_DETECTION} ${SRC_FINETUNE} ${SRC_RECOGNIZE} ${SRC_PIPLINE} tests/testPipeLine.cpp)
target_link_libraries(TEST_PIPLINE ${OpenCV_LIBS})

+ 0
- 24
Prj-Linux/lpr/include/CNNRecognizer.h View File

@@ -1,24 +0,0 @@
//
// Created by Jack Yu on 21/10/2017.
//

#ifndef SWIFTPR_CNNRECOGNIZER_H
#define SWIFTPR_CNNRECOGNIZER_H

#include "Recognizer.h"
namespace pr{
class CNNRecognizer: public GeneralRecognizer{
public:
const int CHAR_INPUT_W = 14;
const int CHAR_INPUT_H = 30;

CNNRecognizer(std::string prototxt,std::string caffemodel);
label recognizeCharacter(cv::Mat character);
private:
cv::dnn::Net net;

};

}

#endif //SWIFTPR_CNNRECOGNIZER_H

+ 0
- 18
Prj-Linux/lpr/include/FastDeskew.h View File

@@ -1,18 +0,0 @@
//
// Created by 庾金科 on 22/09/2017.
//

#ifndef SWIFTPR_FASTDESKEW_H
#define SWIFTPR_FASTDESKEW_H

#include <math.h>
#include <opencv2/opencv.hpp>
namespace pr{

cv::Mat fastdeskew(cv::Mat skewImage,int blockSize);
// cv::Mat spatialTransformer(cv::Mat skewImage);

}//namepace pr


#endif //SWIFTPR_FASTDESKEW_H

+ 0
- 32
Prj-Linux/lpr/include/FineMapping.h View File

@@ -1,32 +0,0 @@
//
// Created by 庾金科 on 22/09/2017.
//

#ifndef SWIFTPR_FINEMAPPING_H
#define SWIFTPR_FINEMAPPING_H

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>

#include <string>
namespace pr{
class FineMapping{
public:
FineMapping();


FineMapping(std::string prototxt,std::string caffemodel);
static cv::Mat FineMappingVertical(cv::Mat InputProposal,int sliceNum=15,int upper=0,int lower=-50,int windows_size=17);
cv::Mat FineMappingHorizon(cv::Mat FinedVertical,int leftPadding,int rightPadding);


private:
cv::dnn::Net net;

};




}
#endif //SWIFTPR_FINEMAPPING_H

+ 18
- 0
Prj-Linux/lpr/include/Finetune.h View File

@@ -0,0 +1,18 @@
#ifndef _FINETUNE_H_
#define _FINETUNE_H_
#include<vector>
#include<opencv2/dnn.hpp>
#include<opencv2/opencv.hpp>
namespace pr {
class FineTune {
public:

FineTune(std::string finetune_prototxt, std::string finetune_caffemodel);
void Finetune(cv::Mat img, cv::Mat &resImg);
void to_refine(cv::Mat img, std::vector<cv::Point> pts, cv::Mat &out);
void affine_crop(cv::Mat img, std::vector<cv::Point> pts, cv::Mat &out);
private:
cv::dnn::Net FTNet;
};
}//namespace pr
#endif // !_FINETUNE_H_

+ 39
- 59
Prj-Linux/lpr/include/Pipeline.h View File

@@ -1,60 +1,40 @@
//
// Created by 庾金科 on 22/10/2017.
//

#ifndef SWIFTPR_PIPLINE_H
#define SWIFTPR_PIPLINE_H

#include "PlateDetection.h"
#include "PlateSegmentation.h"
#include "CNNRecognizer.h"
#include "PlateInfo.h"
#include "FastDeskew.h"
#include "FineMapping.h"
#include "Recognizer.h"
#include "SegmentationFreeRecognizer.h"

namespace pr{

const std::vector<std::string> CH_PLATE_CODE{"京", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "皖", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂",
"琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
"B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
"Y", "Z","港","学","使","警","澳","挂","军","北","南","广","沈","兰","成","济","海","民","航","空"};



const int SEGMENTATION_FREE_METHOD = 0;
const int SEGMENTATION_BASED_METHOD = 1;

class PipelinePR{
public:
GeneralRecognizer *generalRecognizer;
PlateDetection *plateDetection;
PlateSegmentation *plateSegmentation;
FineMapping *fineMapping;
SegmentationFreeRecognizer *segmentationFreeRecognizer;

PipelinePR(std::string detector_filename,
std::string finemapping_prototxt,std::string finemapping_caffemodel,
std::string segmentation_prototxt,std::string segmentation_caffemodel,
std::string charRecognization_proto,std::string charRecognization_caffemodel,
std::string segmentationfree_proto,std::string segmentationfree_caffemodel
);
~PipelinePR();



std::vector<std::string> plateRes;
std::vector<PlateInfo> RunPiplineAsImage(cv::Mat plateImage,int method);







};


#pragma warning(disable:4430)
#ifndef _PIPLINE_H
#define _PIPLINE_H
#include <vector>
#include "Finetune.h"
#include "Platedetect.h"
#include "PlateRecognation.h"
//#include "PlateColor.h"
using namespace std;
using namespace cv;
namespace pr
{
const std::vector<std::string> CH_PLATE_CODE{ "京", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "皖", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂",
"琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
"B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
"Y", "Z","港","学","使","警","澳","挂","军","北","南","广","沈","兰","成","济","海","民","航","空" };


class PipelinePR {

public:
PlateDetection *platedetection;
FineTune *finetune;
PlateRecognation *platerecognation;
DBDetection *dbdetection;


PipelinePR(std::string detect_prototxt, std::string detect_caffemodel,
std::string finetune_prototxt, std::string finetune_caffemodel,
std::string platerec_prototxt, std::string platerec_caffemodel,
std::string dbstring);
~PipelinePR();

std::vector<std::string> plateRes;
std::vector<PlateInfo> RunPiplineAsImage(cv::Mat srcImage,int IsDB);

};
}
#endif //SWIFTPR_PIPLINE_H
#endif // !SWIFTPR_PIPLINE_H

+ 0
- 33
Prj-Linux/lpr/include/PlateDetection.h View File

@@ -1,33 +0,0 @@
//
// Created by 庾金科 on 20/09/2017.
//

#ifndef SWIFTPR_PLATEDETECTION_H
#define SWIFTPR_PLATEDETECTION_H

#include <opencv2/opencv.hpp>
#include <PlateInfo.h>
#include <vector>
namespace pr{
class PlateDetection{
public:
PlateDetection(std::string filename_cascade);
PlateDetection();
void LoadModel(std::string filename_cascade);
void plateDetectionRough(cv::Mat InputImage,std::vector<pr::PlateInfo> &plateInfos,int min_w=36,int max_w=800);
// std::vector<pr::PlateInfo> plateDetectionRough(cv::Mat InputImage,int min_w= 60,int max_h = 400);


// std::vector<pr::PlateInfo> plateDetectionRoughByMultiScaleEdge(cv::Mat InputImage);



private:
cv::CascadeClassifier cascade;


};

}// namespace pr

#endif //SWIFTPR_PLATEDETECTION_H

+ 5
- 5
Prj-Linux/lpr/include/PlateInfo.h View File

@@ -1,7 +1,3 @@
//
// Created by 庾金科 on 20/09/2017.
//

#ifndef SWIFTPR_PLATEINFO_H
#define SWIFTPR_PLATEINFO_H
#include <opencv2/opencv.hpp>
@@ -62,7 +58,11 @@ namespace pr {
int getPlateType() {
return Type;
}

int setPlateType(PlateColor platetype)
{
Type = platetype;
return 0;
}
void appendPlateChar(const std::pair<CharType,cv::Mat> &plateChar)
{
plateChars.push_back(plateChar);


+ 15
- 0
Prj-Linux/lpr/include/PlateRecognation.h View File

@@ -0,0 +1,15 @@
#ifndef _PLATERECOGNATION_H_
#define _PLATERECOGNATION_H_
#include <opencv2/dnn.hpp>
#include "PlateInfo.h"
namespace pr {
class PlateRecognation {
public:
PlateRecognation(std::string Rec_prototxt, std::string Rec_cafffemodel);
void segmentation_free_recognation(cv::Mat src, pr::PlateInfo &plateinfo);
private:
cv::dnn::Net RecNet;
};
}//namespace pr
#endif // !_PLATERECOGNATION_H_


+ 0
- 35
Prj-Linux/lpr/include/PlateSegmentation.h View File

@@ -1,35 +0,0 @@
#ifndef SWIFTPR_PLATESEGMENTATION_H
#define SWIFTPR_PLATESEGMENTATION_H

#include "opencv2/opencv.hpp"
#include <opencv2/dnn.hpp>
#include "PlateInfo.h"

namespace pr{


class PlateSegmentation{
public:
const int PLATE_NORMAL = 6;
const int PLATE_NORMAL_GREEN = 7;
const int DEFAULT_WIDTH = 20;
PlateSegmentation(std::string phototxt,std::string caffemodel);
PlateSegmentation(){}
void segmentPlatePipline(PlateInfo &plateInfo,int stride,std::vector<cv::Rect> &Char_rects);

void segmentPlateBySlidingWindows(cv::Mat &plateImage,int windowsWidth,int stride,cv::Mat &respones);
void templateMatchFinding(const cv::Mat &respones,int windowsWidth,std::pair<float,std::vector<int>> &candidatePts);
void refineRegion(cv::Mat &plateImage,const std::vector<int> &candidatePts,const int padding,std::vector<cv::Rect> &rects);
void ExtractRegions(PlateInfo &plateInfo,std::vector<cv::Rect> &rects);
cv::Mat classifyResponse(const cv::Mat &cropped);
private:
cv::dnn::Net net;


// RefineRegion()

};

}//namespace pr

#endif //SWIFTPR_PLATESEGMENTATION_H

+ 23
- 0
Prj-Linux/lpr/include/Platedetect.h View File

@@ -0,0 +1,23 @@
#ifndef _PLATEDETECT_H_
#define _PLATEDETECT_H_
#include <opencv2/opencv.hpp>
#include <vector>
#include "PlateInfo.h"
namespace pr
{
class PlateDetection {
public:
PlateDetection(std::string ssd_prototxt, std::string ssd_caffe_model);
void Detectssd(cv::Mat inputImg, std::vector<pr::PlateInfo> &plateInfos);
private:
cv::dnn::Net ssdNet;
};
class DBDetection{
public:
DBDetection(std::string cascadestring);
void DBDetect(cv::Mat inputImg,std::vector<pr::PlateInfo> &plateInfos,int min_w,int max_w);
private:
cv::CascadeClassifier dbcascade;
};
}//namespace pr
#endif // !_PLATEDETECT_H_

+ 0
- 23
Prj-Linux/lpr/include/Recognizer.h View File

@@ -1,23 +0,0 @@
//
// Created by 庾金科 on 20/10/2017.
//


#ifndef SWIFTPR_RECOGNIZER_H
#define SWIFTPR_RECOGNIZER_H

#include "PlateInfo.h"
#include "opencv2/dnn.hpp"
namespace pr{
typedef cv::Mat label;
class GeneralRecognizer{
public:
virtual label recognizeCharacter(cv::Mat character) = 0;
// virtual cv::Mat SegmentationFreeForSinglePlate(cv::Mat plate) = 0;
void SegmentBasedSequenceRecognition(PlateInfo &plateinfo);
void SegmentationFreeSequenceRecognition(PlateInfo &plateInfo);

};

}
#endif //SWIFTPR_RECOGNIZER_H

+ 0
- 28
Prj-Linux/lpr/include/SegmentationFreeRecognizer.h View File

@@ -1,28 +0,0 @@
//
// Created by 庾金科 on 28/11/2017.
//

#ifndef SWIFTPR_SEGMENTATIONFREERECOGNIZER_H
#define SWIFTPR_SEGMENTATIONFREERECOGNIZER_H

#include "Recognizer.h"
namespace pr{


class SegmentationFreeRecognizer{
public:
const int CHAR_INPUT_W = 14;
const int CHAR_INPUT_H = 30;
const int CHAR_LEN = 84;

SegmentationFreeRecognizer(std::string prototxt,std::string caffemodel);
std::pair<std::string,float> SegmentationFreeForSinglePlate(cv::Mat plate,std::vector<std::string> mapping_table);


private:
cv::dnn::Net net;

};

}
#endif //SWIFTPR_SEGMENTATIONFREERECOGNIZER_H

+ 0
- 107
Prj-Linux/lpr/include/niBlackThreshold.h View File

@@ -1,107 +0,0 @@
//
// Created by 庾金科 on 26/10/2017.
//

#ifndef SWIFTPR_NIBLACKTHRESHOLD_H
#define SWIFTPR_NIBLACKTHRESHOLD_H


#include <opencv2/opencv.hpp>
using namespace cv;

enum LocalBinarizationMethods{
BINARIZATION_NIBLACK = 0, //!< Classic Niblack binarization. See @cite Niblack1985 .
BINARIZATION_SAUVOLA = 1, //!< Sauvola's technique. See @cite Sauvola1997 .
BINARIZATION_WOLF = 2, //!< Wolf's technique. See @cite Wolf2004 .
BINARIZATION_NICK = 3 //!< NICK technique. See @cite Khurshid2009 .
};


void niBlackThreshold( InputArray _src, OutputArray _dst, double maxValue,
int type, int blockSize, double k, int binarizationMethod )
{
// Input grayscale image
Mat src = _src.getMat();
CV_Assert(src.channels() == 1);
CV_Assert(blockSize % 2 == 1 && blockSize > 1);
if (binarizationMethod == BINARIZATION_SAUVOLA) {
CV_Assert(src.depth() == CV_8U);
}
type &= THRESH_MASK;
// Compute local threshold (T = mean + k * stddev)
// using mean and standard deviation in the neighborhood of each pixel
// (intermediate calculations are done with floating-point precision)
Mat test;
Mat thresh;
{
// note that: Var[X] = E[X^2] - E[X]^2
Mat mean, sqmean, variance, stddev, sqrtVarianceMeanSum;
double srcMin, stddevMax;
boxFilter(src, mean, CV_32F, Size(blockSize, blockSize),
Point(-1,-1), true, BORDER_REPLICATE);
sqrBoxFilter(src, sqmean, CV_32F, Size(blockSize, blockSize),
Point(-1,-1), true, BORDER_REPLICATE);
variance = sqmean - mean.mul(mean);
sqrt(variance, stddev);
switch (binarizationMethod)
{
case BINARIZATION_NIBLACK:
thresh = mean + stddev * static_cast<float>(k);

break;
case BINARIZATION_SAUVOLA:
thresh = mean.mul(1. + static_cast<float>(k) * (stddev / 128.0 - 1.));
break;
case BINARIZATION_WOLF:
minMaxIdx(src, &srcMin,NULL);
minMaxIdx(stddev, NULL, &stddevMax);
thresh = mean - static_cast<float>(k) * (mean - srcMin - stddev.mul(mean - srcMin) / stddevMax);
break;
case BINARIZATION_NICK:
sqrt(variance + sqmean, sqrtVarianceMeanSum);
thresh = mean + static_cast<float>(k) * sqrtVarianceMeanSum;
break;
default:
CV_Error( CV_StsBadArg, "Unknown binarization method" );
break;
}
thresh.convertTo(thresh, src.depth());

thresh.convertTo(test, src.depth());
//
// cv::imshow("imagex",test);
// cv::waitKey(0);

}
// Prepare output image
_dst.create(src.size(), src.type());
Mat dst = _dst.getMat();
CV_Assert(src.data != dst.data); // no inplace processing
// Apply thresholding: ( pixel > threshold ) ? foreground : background
Mat mask;
switch (type)
{
case THRESH_BINARY: // dst = (src > thresh) ? maxval : 0
case THRESH_BINARY_INV: // dst = (src > thresh) ? 0 : maxval
compare(src, thresh, mask, (type == THRESH_BINARY ? CMP_GT : CMP_LE));
dst.setTo(0);
dst.setTo(maxValue, mask);
break;
case THRESH_TRUNC: // dst = (src > thresh) ? thresh : src
compare(src, thresh, mask, CMP_GT);
src.copyTo(dst);
thresh.copyTo(dst, mask);
break;
case THRESH_TOZERO: // dst = (src > thresh) ? src : 0
case THRESH_TOZERO_INV: // dst = (src > thresh) ? 0 : src
compare(src, thresh, mask, (type == THRESH_TOZERO ? CMP_GT : CMP_LE));
dst.setTo(0);
src.copyTo(dst, mask);
break;
default:
CV_Error( CV_StsBadArg, "Unknown threshold type" );
break;
}
}

#endif //SWIFTPR_NIBLACKTHRESHOLD_H

BIN
Prj-Linux/lpr/model/CharacterRecognization.caffemodel View File


+ 0
- 123
Prj-Linux/lpr/model/CharacterRecognization.prototxt View File

@@ -1,123 +0,0 @@
input: "data"
input_dim: 1
input_dim: 1
input_dim: 30
input_dim: 14
layer {
name: "conv2d_1"
type: "Convolution"
bottom: "data"
top: "conv2d_1"
convolution_param {
num_output: 32
bias_term: true
pad: 0
kernel_size: 3
stride: 1
}
}
layer {
name: "activation_1"
type: "ReLU"
bottom: "conv2d_1"
top: "activation_1"
}
layer {
name: "max_pooling2d_1"
type: "Pooling"
bottom: "activation_1"
top: "max_pooling2d_1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
pad: 0
}
}
layer {
name: "conv2d_2"
type: "Convolution"
bottom: "max_pooling2d_1"
top: "conv2d_2"
convolution_param {
num_output: 64
bias_term: true
pad: 0
kernel_size: 3
stride: 1
}
}
layer {
name: "activation_2"
type: "ReLU"
bottom: "conv2d_2"
top: "activation_2"
}
layer {
name: "max_pooling2d_2"
type: "Pooling"
bottom: "activation_2"
top: "max_pooling2d_2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
pad: 0
}
}
layer {
name: "conv2d_3"
type: "Convolution"
bottom: "max_pooling2d_2"
top: "conv2d_3"
convolution_param {
num_output: 128
bias_term: true
pad: 0
kernel_size: 2
stride: 1
}
}
layer {
name: "activation_3"
type: "ReLU"
bottom: "conv2d_3"
top: "activation_3"
}
layer {
name: "flatten_1"
type: "Flatten"
bottom: "activation_3"
top: "flatten_1"
}
layer {
name: "dense_1"
type: "InnerProduct"
bottom: "flatten_1"
top: "dense_1"
inner_product_param {
num_output: 256
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "dense_1"
top: "relu2"
}
layer {
name: "dense2"
type: "InnerProduct"
bottom: "relu2"
top: "dense2"
inner_product_param {
num_output: 65
}
}

layer {
name: "prob"
type: "Softmax"
bottom: "dense2"
top: "prob"
}

BIN
Prj-Linux/lpr/model/HorizonalFinemapping.caffemodel View File


+ 11
- 0
Prj-Linux/lpr/model/README.md View File

@@ -0,0 +1,11 @@
将/hyperlpr_pip_pkg/hyperlpr/models/dnn/目录下的

mininet_ssd_v1.caffemodel
mininet_ssd_v1.prototxt
refinenet.caffemodel
refinenet.prototxt
SegmenationFree-Inception.caffemodel
SegmenationFree-Inception.prototxt


放置在该目录

BIN
Prj-Linux/lpr/model/SegmenationFree-Inception.caffemodel View File


BIN
Prj-Linux/lpr/model/Segmentation.caffemodel View File


+ 0
- 114
Prj-Linux/lpr/model/Segmentation.prototxt View File

@@ -1,114 +0,0 @@
input: "data"
input_dim: 1
input_dim: 1
input_dim: 22
input_dim: 22
layer {
name: "conv2d_12"
type: "Convolution"
bottom: "data"
top: "conv2d_12"
convolution_param {
num_output: 16
bias_term: true
pad: 0
kernel_size: 3
stride: 1
}
}
layer {
name: "activation_18"
type: "ReLU"
bottom: "conv2d_12"
top: "activation_18"
}
layer {
name: "max_pooling2d_10"
type: "Pooling"
bottom: "activation_18"
top: "max_pooling2d_10"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
pad: 0
}
}
layer {
name: "conv2d_13"
type: "Convolution"
bottom: "max_pooling2d_10"
top: "conv2d_13"
convolution_param {
num_output: 16
bias_term: true
pad: 0
kernel_size: 3
stride: 1
}
}
layer {
name: "activation_19"
type: "ReLU"
bottom: "conv2d_13"
top: "activation_19"
}
layer {
name: "max_pooling2d_11"
type: "Pooling"
bottom: "activation_19"
top: "max_pooling2d_11"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
pad: 0
}
}
layer {
name: "flatten_6"
type: "Flatten"
bottom: "max_pooling2d_11"
top: "flatten_6"
}
layer {
name: "dense_9"
type: "InnerProduct"
bottom: "flatten_6"
top: "dense_9"
inner_product_param {
num_output: 256
}
}
layer {
name: "dropout_9"
type: "Dropout"
bottom: "dense_9"
top: "dropout_9"
dropout_param {
dropout_ratio: 0.5
}
}
layer {
name: "activation_20"
type: "ReLU"
bottom: "dropout_9"
top: "activation_20"
}
layer {
name: "dense_10"
type: "InnerProduct"
bottom: "activation_20"
top: "dense_10"
inner_product_param {
num_output: 3
}
}


layer {
name: "prob"
type: "Softmax"
bottom: "dense_10"
top: "prob"
}

+ 0
- 12117
Prj-Linux/lpr/model/cascade.xml
File diff suppressed because it is too large
View File


+ 504
- 0
Prj-Linux/lpr/model/cascade_double.xml View File

@@ -0,0 +1,504 @@
<?xml version="1.0"?>
<opencv_storage>
<cascade>
<stageType>BOOST</stageType>
<featureType>LBP</featureType>
<height>24</height>
<width>44</width>
<stageParams>
<boostType>GAB</boostType>
<minHitRate>9.9599999189376831e-01</minHitRate>
<maxFalseAlarm>5.0000000000000000e-01</maxFalseAlarm>
<weightTrimRate>9.4999999999999996e-01</weightTrimRate>
<maxDepth>1</maxDepth>
<maxWeakCount>28</maxWeakCount></stageParams>
<featureParams>
<maxCatCount>256</maxCatCount>
<featSize>1</featSize></featureParams>
<stageNum>11</stageNum>
<stages>
<!-- stage 0 -->
<_>
<maxWeakCount>3</maxWeakCount>
<stageThreshold>-1.1049392223358154e+00</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 17 -3334 -513 -573452048 -1057 -1 -267777 -1 -1025</internalNodes>
<leafValues>
-9.4297146797180176e-01 7.8370976448059082e-01</leafValues></_>
<_>
<internalNodes>
0 -1 36 -262198 -12062208 -169869377 -674954752 -7602177
-16781941 -67109937 -1073</internalNodes>
<leafValues>
-8.8537323474884033e-01 7.2940820455551147e-01</leafValues></_>
<_>
<internalNodes>
0 -1 9 1431697887 1431687647 -545270049 -262145 1413609965
1364250775 -1065985 -67108865</internalNodes>
<leafValues>
-8.3008646965026855e-01 7.2340542078018188e-01</leafValues></_></weakClassifiers></_>
<!-- stage 1 -->
<_>
<maxWeakCount>3</maxWeakCount>
<stageThreshold>-1.0404651165008545e+00</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 19 -524289 -136314913 1360393719 -2097153 -134219777
-4194817 274068735 -1</internalNodes>
<leafValues>
-8.5476654767990112e-01 8.4671354293823242e-01</leafValues></_>
<_>
<internalNodes>
0 -1 29 -16515073 -150929664 -1 -8650881 -8388609 -11403265
-1 -2097153</internalNodes>
<leafValues>
-7.7620923519134521e-01 7.8929436206817627e-01</leafValues></_>
<_>
<internalNodes>
0 -1 1 2013233135 2147450879 -45760593 2147474943 2146959359
2104754047 2080374783 2147417087</internalNodes>
<leafValues>
-8.9144438505172729e-01 5.9051072597503662e-01</leafValues></_></weakClassifiers></_>
<!-- stage 2 -->
<_>
<maxWeakCount>3</maxWeakCount>
<stageThreshold>-1.1397969722747803e+00</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 15 -1041 -8225 -546308113 -1 -33554433 -394753 -2359297
-1</internalNodes>
<leafValues>
-8.5447394847869873e-01 7.4388968944549561e-01</leafValues></_>
<_>
<internalNodes>
0 -1 27 -1053970 -17 -35651601 -1048625 -345331574 -5247030
-74453009 -1</internalNodes>
<leafValues>
-8.6756819486618042e-01 6.3549250364303589e-01</leafValues></_>
<_>
<internalNodes>
0 -1 43 -1050897 -1025 -71304209 -134219793 -1033 -559948801
-67110929 1996976642</internalNodes>
<leafValues>
-8.6068797111511230e-01 5.8224511146545410e-01</leafValues></_></weakClassifiers></_>
<!-- stage 3 -->
<_>
<maxWeakCount>3</maxWeakCount>
<stageThreshold>-9.8026764392852783e-01</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 12 -1077953601 -1 -1073758273 -16387 -147457 -1
-1073758209 -1</internalNodes>
<leafValues>
-8.2477015256881714e-01 7.1671992540359497e-01</leafValues></_>
<_>
<internalNodes>
0 -1 47 -4345 -989855745 -271062524 -319815697 -134742265
1423962843 -134218173 -1</internalNodes>
<leafValues>
-7.4230498075485229e-01 7.3275351524353027e-01</leafValues></_>
<_>
<internalNodes>
0 -1 37 -22347778 -3477554 -33554433 -2066 -9438209 -65537
-1 -1048577</internalNodes>
<leafValues>
-8.3125960826873779e-01 5.8680748939514160e-01</leafValues></_></weakClassifiers></_>
<!-- stage 4 -->
<_>
<maxWeakCount>5</maxWeakCount>
<stageThreshold>-1.2986627817153931e+00</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 4 -8388737 -262273 -10485761 -137 -8388745 -129 -262273
-1</internalNodes>
<leafValues>
-8.7727063894271851e-01 6.1173391342163086e-01</leafValues></_>
<_>
<internalNodes>
0 -1 20 -1 -10241 1431688703 -1 -1 -1042 1163263999
2002780159</internalNodes>
<leafValues>
-8.2954949140548706e-01 5.9151750802993774e-01</leafValues></_>
<_>
<internalNodes>
0 -1 3 -44786212 -33726467 -268509185 -17409 -657175332
-2270500 -1198986500 -1148450934</internalNodes>
<leafValues>
-7.6026451587677002e-01 5.8319890499114990e-01</leafValues></_>
<_>
<internalNodes>
0 -1 28 -15794258 -78643282 -821817846 -552742962 -653344834
-91750417 -1622147105 -7340065</internalNodes>
<leafValues>
-7.6077878475189209e-01 5.5891805887222290e-01</leafValues></_>
<_>
<internalNodes>
0 -1 30 1427232247 357954767 1971310559 2012602108
-202375953 -44049 -4456789 -18</internalNodes>
<leafValues>
-6.7643576860427856e-01 6.0950380563735962e-01</leafValues></_></weakClassifiers></_>
<!-- stage 5 -->
<_>
<maxWeakCount>5</maxWeakCount>
<stageThreshold>-1.3029408454895020e+00</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 39 -134218753 -1 -1 -202899593 -1 -4194305 -67108865
-527497</internalNodes>
<leafValues>
-7.5626724958419800e-01 7.5137990713119507e-01</leafValues></_>
<_>
<internalNodes>
0 -1 6 -8388737 -8388737 -1 -1 -8421505 -129 -8388737 -1</internalNodes>
<leafValues>
-7.7118909358978271e-01 6.3570922613143921e-01</leafValues></_>
<_>
<internalNodes>
0 -1 45 -825233914 -654313761 -589830738 -35651585 -16778427
-83886281 -151000316 -1056964737</internalNodes>
<leafValues>
-7.2490030527114868e-01 5.7298541069030762e-01</leafValues></_>
<_>
<internalNodes>
0 -1 18 2002780159 2136866815 -67109377 -19969 2147344383
2101472763 2108680957 2147450607</internalNodes>
<leafValues>
-8.5162043571472168e-01 4.5608481764793396e-01</leafValues></_>
<_>
<internalNodes>
0 -1 16 -7472470 -3505654 -29841 -65536 -1166086177
-67109121 -288690177 -32085</internalNodes>
<leafValues>
-7.9073858261108398e-01 5.0315058231353760e-01</leafValues></_></weakClassifiers></_>
<!-- stage 6 -->
<_>
<maxWeakCount>5</maxWeakCount>
<stageThreshold>-1.3164747953414917e+00</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 41 -1 -1025 -1 -2228225 -8432299 -571189899 -139265 -1</internalNodes>
<leafValues>
-7.8127676248550415e-01 6.5899217128753662e-01</leafValues></_>
<_>
<internalNodes>
0 -1 2 -34275329 -198665 -2113 -12289 -573243396 -590292744
-1049857 -277</internalNodes>
<leafValues>
-7.3563832044601440e-01 6.3897633552551270e-01</leafValues></_>
<_>
<internalNodes>
0 -1 14 -1565523969 -1347420193 -277086209 -1342177313
-134217729 -263169 -285212673 -1459618305</internalNodes>
<leafValues>
-8.1234931945800781e-01 4.9628043174743652e-01</leafValues></_>
<_>
<internalNodes>
0 -1 33 -1079312417 -83826176 -33686017 -570426508
-1627464961 -5377 -277761 -17</internalNodes>
<leafValues>
-7.0463657379150391e-01 5.2093976736068726e-01</leafValues></_>
<_>
<internalNodes>
0 -1 25 -66 -4116 1607291240 -5298489 -9847160 2011036101
357852669 1476259327</internalNodes>
<leafValues>
-8.2066470384597778e-01 4.9184983968734741e-01</leafValues></_></weakClassifiers></_>
<!-- stage 7 -->
<_>
<maxWeakCount>5</maxWeakCount>
<stageThreshold>-1.1098697185516357e+00</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 44 -134217949 -167773185 -404750589 -1 -134744525
-1846018321 -2097357 -1</internalNodes>
<leafValues>
-7.6240319013595581e-01 6.8946647644042969e-01</leafValues></_>
<_>
<internalNodes>
0 -1 7 -12633797 -524321 1058880319 -129 -50790401 -262405
-1075052545 -5</internalNodes>
<leafValues>
-7.1431988477706909e-01 6.2125796079635620e-01</leafValues></_>
<_>
<internalNodes>
0 -1 24 -144703501 -10486797 -134217729 -136317057
-271646721 -174069583 -168952849 -1072726014</internalNodes>
<leafValues>
-6.5710061788558960e-01 6.1531358957290649e-01</leafValues></_>
<_>
<internalNodes>
0 -1 38 -134218774 -149487872 -33554433 -537927872 -69209089
-145228029 -2360849 -524449</internalNodes>
<leafValues>
-7.3570650815963745e-01 4.9681660532951355e-01</leafValues></_>
<_>
<internalNodes>
0 -1 5 -136380419 -8390657 -2228225 -196707 1565810157
2147048386 -268702725 2080373485</internalNodes>
<leafValues>
-7.2735637426376343e-01 5.2713739871978760e-01</leafValues></_></weakClassifiers></_>
<!-- stage 8 -->
<_>
<maxWeakCount>5</maxWeakCount>
<stageThreshold>-2.0547957420349121e+00</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 13 -11141121 -44695553 -1 -11144193 -9217 -321
-335811841 -4216577</internalNodes>
<leafValues>
-7.3916637897491455e-01 6.7595410346984863e-01</leafValues></_>
<_>
<internalNodes>
0 -1 26 -369104657 -4194321 -1061429013 -67114529 -251662085
-138412033 3334395 -234882305</internalNodes>
<leafValues>
-6.9217604398727417e-01 5.4744583368301392e-01</leafValues></_>
<_>
<internalNodes>
0 -1 11 1373590751 1373632511 -262169 -33859589 -572533249
-572524625 -135266305 -32833</internalNodes>
<leafValues>
-7.1100026369094849e-01 5.3469187021255493e-01</leafValues></_>
<_>
<internalNodes>
0 -1 23 -3148053 -1054802 -1 -5 -7340125 -3689942 -74448917
-687087094</internalNodes>
<leafValues>
-5.6383520364761353e-01 6.3540917634963989e-01</leafValues></_>
<_>
<internalNodes>
0 -1 8 245501180 -1615197700 -46219265 -1075925028
-307580929 -373826 -1076187139 -1343746644</internalNodes>
<leafValues>
-5.8823972940444946e-01 6.1824375391006470e-01</leafValues></_></weakClassifiers></_>
<!-- stage 9 -->
<_>
<maxWeakCount>6</maxWeakCount>
<stageThreshold>-1.6300759315490723e+00</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 42 -1 -4129 -8193 -135795737 -1 -6417 -1 -137887866</internalNodes>
<leafValues>
-7.7990013360977173e-01 6.1912822723388672e-01</leafValues></_>
<_>
<internalNodes>
0 -1 31 -12845643 -1934361103 -581837313 -1644167171
-1175537153 -1392516625 -1681655299 -1358963807</internalNodes>
<leafValues>
-7.1357387304306030e-01 5.6909996271133423e-01</leafValues></_>
<_>
<internalNodes>
0 -1 34 288428543 -34262659 1976906747 -42117703 858797567
-4965441 2008290292 -1146080848</internalNodes>
<leafValues>
-6.7784935235977173e-01 5.4983222484588623e-01</leafValues></_>
<_>
<internalNodes>
0 -1 22 -25297611 -100663553 -9830515 -570556417 -53741251
-36570627 -67437302 -12583252</internalNodes>
<leafValues>
-6.3567954301834106e-01 5.9044981002807617e-01</leafValues></_>
<_>
<internalNodes>
0 -1 46 -403706354 82769839 -446830048 -989858098 -8921600
1087893408 -100663520 -134217729</internalNodes>
<leafValues>
-7.0569902658462524e-01 5.4874616861343384e-01</leafValues></_>
<_>
<internalNodes>
0 -1 0 -965744853 -420544541 -8392718 -1569784218 -192940313
1744830335 -9 -1003227661</internalNodes>
<leafValues>
-5.7118493318557739e-01 6.4167028665542603e-01</leafValues></_></weakClassifiers></_>
<!-- stage 10 -->
<_>
<maxWeakCount>5</maxWeakCount>
<stageThreshold>-2.1370947360992432e+00</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 40 -673196033 -2144789 287251423 -538968593 -1399068449
-73535505 -13631489 -526857</internalNodes>
<leafValues>
-7.2344118356704712e-01 6.8316829204559326e-01</leafValues></_>
<_>
<internalNodes>
0 -1 32 -214216429 -2112561 -445819937 1964790555 -17185861
-303183720 -357832229 -3148837</internalNodes>
<leafValues>
-7.1031409502029419e-01 5.4083776473999023e-01</leafValues></_>
<_>
<internalNodes>
0 -1 10 -9043969 -36118539 2147450623 -4194305 -2246657
-102721404 1073685759 -1366622208</internalNodes>
<leafValues>
-5.8772116899490356e-01 6.4753490686416626e-01</leafValues></_>
<_>
<internalNodes>
0 -1 35 1167938037 16237049 -1120535169 1029034397 9567155
-2001626128 -1146622977 -1142248004</internalNodes>
<leafValues>
-6.4004391431808472e-01 5.6415843963623047e-01</leafValues></_>
<_>
<internalNodes>
0 -1 21 -70126622 -134227061 -536243648 188013035
-1234960385 1416625375 -486868997 62913535</internalNodes>
<leafValues>
-8.8218396902084351e-01 4.1129270195960999e-01</leafValues></_></weakClassifiers></_></stages>
<features>
<_>
<rect>
0 1 1 6</rect></_>
<_>
<rect>
1 0 8 3</rect></_>
<_>
<rect>
1 4 8 3</rect></_>
<_>
<rect>
1 6 13 2</rect></_>
<_>
<rect>
2 1 5 2</rect></_>
<_>
<rect>
2 4 9 2</rect></_>
<_>
<rect>
3 2 5 2</rect></_>
<_>
<rect>
4 0 11 3</rect></_>
<_>
<rect>
4 21 9 1</rect></_>
<_>
<rect>
7 1 5 5</rect></_>
<_>
<rect>
7 7 6 2</rect></_>
<_>
<rect>
10 0 3 5</rect></_>
<_>
<rect>
11 1 9 3</rect></_>
<_>
<rect>
11 2 11 4</rect></_>
<_>
<rect>
12 0 4 3</rect></_>
<_>
<rect>
14 2 5 2</rect></_>
<_>
<rect>
14 6 3 3</rect></_>
<_>
<rect>
15 1 5 4</rect></_>
<_>
<rect>
16 0 9 4</rect></_>
<_>
<rect>
17 3 4 5</rect></_>
<_>
<rect>
17 6 4 3</rect></_>
<_>
<rect>
18 12 3 2</rect></_>
<_>
<rect>
19 0 3 3</rect></_>
<_>
<rect>
19 3 2 6</rect></_>
<_>
<rect>
19 4 2 4</rect></_>
<_>
<rect>
19 12 2 4</rect></_>
<_>
<rect>
21 2 2 5</rect></_>
<_>
<rect>
22 5 3 4</rect></_>
<_>
<rect>
22 14 3 3</rect></_>
<_>
<rect>
24 1 6 5</rect></_>
<_>
<rect>
25 3 4 5</rect></_>
<_>
<rect>
25 6 6 1</rect></_>
<_>
<rect>
26 1 2 5</rect></_>
<_>
<rect>
26 3 5 4</rect></_>
<_>
<rect>
26 21 6 1</rect></_>
<_>
<rect>
27 1 5 1</rect></_>
<_>
<rect>
29 3 4 6</rect></_>
<_>
<rect>
30 0 4 5</rect></_>
<_>
<rect>
30 2 3 7</rect></_>
<_>
<rect>
34 1 3 7</rect></_>
<_>
<rect>
34 8 3 2</rect></_>
<_>
<rect>
34 15 3 3</rect></_>
<_>
<rect>
35 3 2 5</rect></_>
<_>
<rect>
35 5 2 5</rect></_>
<_>
<rect>
39 12 1 3</rect></_>
<_>
<rect>
41 0 1 7</rect></_>
<_>
<rect>
41 10 1 4</rect></_>
<_>
<rect>
41 11 1 3</rect></_></features></cascade>
</opencv_storage>

BIN
Prj-Linux/lpr/model/mininet_ssd_v1.caffemodel View File


+ 1462
- 0
Prj-Linux/lpr/model/mininet_ssd_v1.prototxt
File diff suppressed because it is too large
View File


BIN
Prj-Linux/lpr/model/refinenet.caffemodel View File


+ 300
- 0
Prj-Linux/lpr/model/refinenet.prototxt View File

@@ -0,0 +1,300 @@
name: "ONet"
input: "data"
input_dim: 1
input_dim: 3
input_dim: 48
input_dim: 120

##################################
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 1
}
convolution_param {
num_output: 32
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "prelu1"
type: "PReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 1
}
convolution_param {
num_output: 64
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
value: 0
}
}
}

layer {
name: "prelu2"
type: "PReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}

layer {
name: "conv3"
type: "Convolution"
bottom: "pool2"
top: "conv3"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 1
}
convolution_param {
num_output: 64
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "prelu3"
type: "PReLU"
bottom: "conv3"
top: "conv3"
}
layer {
name: "pool3"
type: "Pooling"
bottom: "conv3"
top: "pool3"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv4"
type: "Convolution"
bottom: "pool3"
top: "conv4"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 1
}
convolution_param {
num_output: 128
kernel_size: 2
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "prelu4"
type: "PReLU"
bottom: "conv4"
top: "conv4"
}


layer {
name: "conv5i"
type: "InnerProduct"
bottom: "conv4"
top: "conv5"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 1
}
inner_product_param {
#kernel_size: 3
num_output: 256
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
value: 0
}
}
}

layer {
name: "drop5i"
type: "Dropout"
bottom: "conv5"
top: "conv5"
dropout_param {
dropout_ratio: 0.25
}
}
layer {
name: "prelu5"
type: "PReLU"
bottom: "conv5"
top: "conv5"
}


layer {
name: "conv6i-1"
type: "InnerProduct"
bottom: "conv5"
top: "conv6-1"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 1
}
inner_product_param {
#kernel_size: 1
num_output: 2
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
value: 0
}
}
}


layer {
name: "conv6i-2"
type: "InnerProduct"
bottom: "conv5"
top: "conv6-2"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 1
}
inner_product_param {
#kernel_size: 1
num_output: 4
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
value: 0
}
}
}

layer {
name: "conv6-3"
type: "InnerProduct"
bottom: "conv5"
top: "conv6-3"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 1
}
inner_product_param {
#kernel_size: 1
num_output: 8
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
value: 0
}
}
}


layer {
name: "prob1"
type: "Softmax"
bottom: "conv6-1"
top: "prob1"
}

BIN
Prj-Linux/lpr/res/test.jpg View File

Before After
Width: 1280  |  Height: 720  |  Size: 188 kB

BIN
Prj-Linux/lpr/res/test_db1.jpg View File

Before After
Width: 2976  |  Height: 3968  |  Size: 3.3 MB

+ 0
- 19
Prj-Linux/lpr/src/CNNRecognizer.cpp View File

@@ -1,19 +0,0 @@
//
// Created by Jack Yu on 21/10/2017.
//

#include "../include/CNNRecognizer.h"

namespace pr{
CNNRecognizer::CNNRecognizer(std::string prototxt,std::string caffemodel){
net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);
}

label CNNRecognizer::recognizeCharacter(cv::Mat charImage){
if(charImage.channels()== 3)
cv::cvtColor(charImage,charImage,cv::COLOR_BGR2GRAY);
cv::Mat inputBlob = cv::dnn::blobFromImage(charImage, 1/255.0, cv::Size(CHAR_INPUT_W,CHAR_INPUT_H), cv::Scalar(0,0,0),false);
net.setInput(inputBlob,"data");
return net.forward();
}
}

+ 0
- 108
Prj-Linux/lpr/src/FastDeskew.cpp View File

@@ -1,108 +0,0 @@
//
// Created by Jack Yu on 02/10/2017.
//



#include <../include/FastDeskew.h>

namespace pr{
const int ANGLE_MIN = 30 ;
const int ANGLE_MAX = 150 ;
const int PLATE_H = 36;
const int PLATE_W = 136;
int angle(float x,float y)
{
return atan2(x,y)*180/3.1415;
}

std::vector<float> avgfilter(std::vector<float> angle_list,int windowsSize) {
std::vector<float> angle_list_filtered(angle_list.size() - windowsSize + 1);
for (int i = 0; i < angle_list.size() - windowsSize + 1; i++) {
float avg = 0.00f;
for (int j = 0; j < windowsSize; j++) {
avg += angle_list[i + j];
}
avg = avg / windowsSize;
angle_list_filtered[i] = avg;
}

return angle_list_filtered;
}


void drawHist(std::vector<float> seq){
cv::Mat image(300,seq.size(),CV_8U);
image.setTo(0);

for(int i = 0;i<seq.size();i++)
{
float l = *std::max_element(seq.begin(),seq.end());

int p = int(float(seq[i])/l*300);

cv::line(image,cv::Point(i,300),cv::Point(i,300-p),cv::Scalar(255,255,255));
}
cv::imshow("vis",image);
}

cv::Mat correctPlateImage(cv::Mat skewPlate,float angle,float maxAngle)
{
cv::Mat dst;
cv::Size size_o(skewPlate.cols,skewPlate.rows);
int extend_padding = 0;
extend_padding = static_cast<int>(skewPlate.rows*tan(cv::abs(angle)/180* 3.14) );
cv::Size size(skewPlate.cols + extend_padding ,skewPlate.rows);
float interval = abs(sin((angle /180) * 3.14)* skewPlate.rows);
cv::Point2f pts1[4] = {cv::Point2f(0,0),cv::Point2f(0,size_o.height),cv::Point2f(size_o.width,0),cv::Point2f(size_o.width,size_o.height)};
if(angle>0) {
cv::Point2f pts2[4] = {cv::Point2f(interval, 0), cv::Point2f(0, size_o.height),
cv::Point2f(size_o.width, 0), cv::Point2f(size_o.width - interval, size_o.height)};
cv::Mat M = cv::getPerspectiveTransform(pts1,pts2);
cv::warpPerspective(skewPlate,dst,M,size);
}
else {
cv::Point2f pts2[4] = {cv::Point2f(0, 0), cv::Point2f(interval, size_o.height), cv::Point2f(size_o.width-interval, 0),
cv::Point2f(size_o.width, size_o.height)};
cv::Mat M = cv::getPerspectiveTransform(pts1,pts2);
cv::warpPerspective(skewPlate,dst,M,size,cv::INTER_CUBIC);
}
return dst;
}
cv::Mat fastdeskew(cv::Mat skewImage,int blockSize){
const int FILTER_WINDOWS_SIZE = 5;
std::vector<float> angle_list(180);
memset(angle_list.data(),0,angle_list.size()*sizeof(int));
cv::Mat bak;
skewImage.copyTo(bak);
if(skewImage.channels() == 3)
cv::cvtColor(skewImage,skewImage,cv::COLOR_RGB2GRAY);
if(skewImage.channels() == 1)
{
cv::Mat eigen;
cv::cornerEigenValsAndVecs(skewImage,eigen,blockSize,5);
for( int j = 0; j < skewImage.rows; j+=blockSize )
{ for( int i = 0; i < skewImage.cols; i+=blockSize )
{
float x2 = eigen.at<cv::Vec6f>(j, i)[4];
float y2 = eigen.at<cv::Vec6f>(j, i)[5];
int angle_cell = angle(x2,y2);
angle_list[(angle_cell + 180)%180]+=1.0;
}
}
}
std::vector<float> filtered = avgfilter(angle_list,5);
int maxPos = std::max_element(filtered.begin(),filtered.end()) - filtered.begin() + FILTER_WINDOWS_SIZE/2;
if(maxPos>ANGLE_MAX)
maxPos = (-maxPos+90+180)%180;
if(maxPos<ANGLE_MIN)
maxPos-=90;
maxPos=90-maxPos;
cv::Mat deskewed = correctPlateImage(bak, static_cast<float>(maxPos),60.0f);
return deskewed;
}



}//namespace pr

+ 0
- 170
Prj-Linux/lpr/src/FineMapping.cpp View File

@@ -1,170 +0,0 @@
#include "FineMapping.h"
namespace pr{

const int FINEMAPPING_H = 60 ;
const int FINEMAPPING_W = 140;
const int PADDING_UP_DOWN = 30;
void drawRect(cv::Mat image,cv::Rect rect)
{
cv::Point p1(rect.x,rect.y);
cv::Point p2(rect.x+rect.width,rect.y+rect.height);
cv::rectangle(image,p1,p2,cv::Scalar(0,255,0),1);
}


FineMapping::FineMapping(std::string prototxt,std::string caffemodel) {
net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);

}

cv::Mat FineMapping::FineMappingHorizon(cv::Mat FinedVertical,int leftPadding,int rightPadding)
{

// if(FinedVertical.channels()==1)
// cv::cvtColor(FinedVertical,FinedVertical,cv::COLOR_GRAY2BGR);
cv::Mat inputBlob = cv::dnn::blobFromImage(FinedVertical, 1/255.0, cv::Size(66,16),
cv::Scalar(0,0,0),false);

net.setInput(inputBlob,"data");
cv::Mat prob = net.forward();
int front = static_cast<int>(prob.at<float>(0,0)*FinedVertical.cols);
int back = static_cast<int>(prob.at<float>(0,1)*FinedVertical.cols);
front -= leftPadding ;
if(front<0) front = 0;
back +=rightPadding;
if(back>FinedVertical.cols-1) back=FinedVertical.cols - 1;
cv::Mat cropped = FinedVertical.colRange(front,back).clone();
return cropped;


}
std::pair<int,int> FitLineRansac(std::vector<cv::Point> pts,int zeroadd = 0 )
{
std::pair<int,int> res;
if(pts.size()>2)
{
cv::Vec4f line;
cv::fitLine(pts,line,cv::DIST_HUBER,0,0.01,0.01);
float vx = line[0];
float vy = line[1];
float x = line[2];
float y = line[3];
int lefty = static_cast<int>((-x * vy / vx) + y);
int righty = static_cast<int>(((136- x) * vy / vx) + y);
res.first = lefty+PADDING_UP_DOWN+zeroadd;
res.second = righty+PADDING_UP_DOWN+zeroadd;
return res;
}
res.first = zeroadd;
res.second = zeroadd;
return res;
}

cv::Mat FineMapping::FineMappingVertical(cv::Mat InputProposal,int sliceNum,int upper,int lower,int windows_size){
cv::Mat PreInputProposal;
cv::Mat proposal;
cv::resize(InputProposal,PreInputProposal,cv::Size(FINEMAPPING_W,FINEMAPPING_H));
if(InputProposal.channels() == 3)
cv::cvtColor(PreInputProposal,proposal,cv::COLOR_BGR2GRAY);
else
PreInputProposal.copyTo(proposal);
// this will improve some sen
cv::Mat kernal = cv::getStructuringElement(cv::MORPH_ELLIPSE,cv::Size(1,3));
float diff = static_cast<float>(upper-lower);
diff/=static_cast<float>(sliceNum-1);
cv::Mat binary_adaptive;
std::vector<cv::Point> line_upper;
std::vector<cv::Point> line_lower;
int contours_nums=0;
for(int i = 0 ; i < sliceNum ; i++)
{
std::vector<std::vector<cv::Point> > contours;
float k =lower + i*diff;
cv::adaptiveThreshold(proposal,binary_adaptive,255,cv::ADAPTIVE_THRESH_MEAN_C,cv::THRESH_BINARY,windows_size,k);
cv::Mat draw;
binary_adaptive.copyTo(draw);
cv::findContours(binary_adaptive,contours,cv::RETR_EXTERNAL,cv::CHAIN_APPROX_SIMPLE);
for(auto contour: contours)
{
cv::Rect bdbox =cv::boundingRect(contour);
float lwRatio = bdbox.height/static_cast<float>(bdbox.width);
int bdboxAera = bdbox.width*bdbox.height;
if (( lwRatio>0.7&&bdbox.width*bdbox.height>100 && bdboxAera<300)
|| (lwRatio>3.0 && bdboxAera<100 && bdboxAera>10))
{
cv::Point p1(bdbox.x, bdbox.y);
cv::Point p2(bdbox.x + bdbox.width, bdbox.y + bdbox.height);
line_upper.push_back(p1);
line_lower.push_back(p2);
contours_nums+=1;
}
}
}
if(contours_nums<41)
{
cv::bitwise_not(InputProposal,InputProposal);
cv::Mat kernal = cv::getStructuringElement(cv::MORPH_ELLIPSE,cv::Size(1,5));
cv::Mat bak;
cv::resize(InputProposal,bak,cv::Size(FINEMAPPING_W,FINEMAPPING_H));
cv::erode(bak,bak,kernal);
if(InputProposal.channels() == 3)
cv::cvtColor(bak,proposal,cv::COLOR_BGR2GRAY);
else
proposal = bak;
int contours_nums=0;
for(int i = 0 ; i < sliceNum ; i++)
{
std::vector<std::vector<cv::Point> > contours;
float k =lower + i*diff;
cv::adaptiveThreshold(proposal,binary_adaptive,255,cv::ADAPTIVE_THRESH_MEAN_C,cv::THRESH_BINARY,windows_size,k);
cv::Mat draw;
binary_adaptive.copyTo(draw);
cv::findContours(binary_adaptive,contours,cv::RETR_EXTERNAL,cv::CHAIN_APPROX_SIMPLE);
for(auto contour: contours)
{
cv::Rect bdbox =cv::boundingRect(contour);
float lwRatio = bdbox.height/static_cast<float>(bdbox.width);
int bdboxAera = bdbox.width*bdbox.height;
if (( lwRatio>0.7&&bdbox.width*bdbox.height>120 && bdboxAera<300)
|| (lwRatio>3.0 && bdboxAera<100 && bdboxAera>10))
{

cv::Point p1(bdbox.x, bdbox.y);
cv::Point p2(bdbox.x + bdbox.width, bdbox.y + bdbox.height);
line_upper.push_back(p1);
line_lower.push_back(p2);
contours_nums+=1;
}
}
}
}
cv::Mat rgb;
cv::copyMakeBorder(PreInputProposal, rgb, PADDING_UP_DOWN, PADDING_UP_DOWN, 0, 0, cv::BORDER_REPLICATE);
std::pair<int, int> A;
std::pair<int, int> B;
A = FitLineRansac(line_upper, -1);
B = FitLineRansac(line_lower, 1);
int leftyB = A.first;
int rightyB = A.second;
int leftyA = B.first;
int rightyA = B.second;
int cols = rgb.cols;
int rows = rgb.rows;
std::vector<cv::Point2f> corners(4);
corners[0] = cv::Point2f(cols - 1, rightyA);
corners[1] = cv::Point2f(0, leftyA);
corners[2] = cv::Point2f(cols - 1, rightyB);
corners[3] = cv::Point2f(0, leftyB);
std::vector<cv::Point2f> corners_trans(4);
corners_trans[0] = cv::Point2f(136, 36);
corners_trans[1] = cv::Point2f(0, 36);
corners_trans[2] = cv::Point2f(136, 0);
corners_trans[3] = cv::Point2f(0, 0);
cv::Mat transform = cv::getPerspectiveTransform(corners, corners_trans);
cv::Mat quad = cv::Mat::zeros(36, 136, CV_8UC3);
cv::warpPerspective(rgb, quad, transform, quad.size());
return quad;
}
}



+ 67
- 0
Prj-Linux/lpr/src/FineTune.cpp View File

@@ -0,0 +1,67 @@
#include "../include/Finetune.h"
using namespace std;
using namespace cv;

namespace pr {
FineTune::FineTune(string finetune_prototxt, string finetune_caffemodel) {
FTNet = dnn::readNetFromCaffe(finetune_prototxt, finetune_caffemodel);
}
void FineTune::affine_crop(Mat src, vector<Point> pts, Mat &crop)
{
Point2f dst[4] = { Point2f(0,0),Point2f(160,0),Point2f(160,40),Point2f(0,40) };
Point2f srcpt[4] = { Point2f(pts[0]),Point2f(pts[1]) ,Point2f(pts[2]) ,Point2f(pts[3]) };
Mat _mat = getPerspectiveTransform(srcpt, dst);
warpPerspective(src, crop, _mat, Size(160, 40));
}
void FineTune::to_refine(Mat src, vector<Point>pts, Mat& crop)
{
float scale = 3.f;
int cx = 64; int cy = 24;
int cw = 64; int ch = 24;
int tx1 = cx - cw / 2;
int ty1 = cy - ch / 2;
int tx2 = cx + cw / 2;
int ty2 = cy - ch / 2;
int tx3 = cx + cw / 2;
int ty3 = cy + ch / 2;
int tx4 = cx - cw / 2;
int ty4 = cy + ch / 2;
vector<Point2f> dstp(4);
Point2f dst[4] = { (Point2f(tx1*scale, ty1*scale)) ,(Point2f(tx2*scale, ty2*scale)) ,(Point2f(tx3*scale, ty3*scale)) ,(Point2f(tx4*scale, ty4*scale)) };
Point2f pt[4] = { Point2f(pts[0]),Point2f(pts[1]) ,Point2f(pts[2]) ,Point2f(pts[3]) };
//estimater
Mat _mat = getPerspectiveTransform(pt, dst);
warpPerspective(src, crop, _mat, Size(120 * scale, 48 * scale));
}
void FineTune::Finetune(Mat src, Mat& dst)
{
Mat tof;// = src.clone();
resize(src, tof, Size(120, 48));
Mat blob = dnn::blobFromImage(tof, 0.0078125, Size(120, 48), Scalar(127.5, 127.5, 127.5), false, false);
FTNet.setInput(blob);
Mat outblob = FTNet.forward("conv6-3");

float *data = outblob.ptr<float>();
vector<Point> pts(4);
Mat fineMat(Size(2, 4), CV_32F, data);
for (int i = 0; i < fineMat.rows; i++)
{
pts[i].x = fineMat.at<float>(i, 0)*src.cols;
pts[i].y = fineMat.at<float>(i, 1)*src.rows;
}
Mat crop;
to_refine(src, pts, crop);
blob = dnn::blobFromImage(crop, 0.0078128, Size(120, 48), Scalar(127.5, 127.5, 127.5), false, false);
FTNet.setInput(blob);
outblob = FTNet.forward("conv6-3");
data = outblob.ptr<float>();
Mat fineMat2(Size(2, 4), CV_32F, data);
for (int i = 0; i < fineMat.rows; i++)
{
pts[i].x = fineMat2.at<float>(i, 0)*crop.cols;
pts[i].y = fineMat2.at<float>(i, 1)*crop.rows;
}
affine_crop(crop, pts, crop);
dst = crop.clone();
}
}

+ 64
- 79
Prj-Linux/lpr/src/Pipeline.cpp View File

@@ -1,85 +1,70 @@
//
// Created by Jack Yu on 23/10/2017.
//

#include "../include/Pipeline.h"


namespace pr {



const int HorizontalPadding = 4;
PipelinePR::PipelinePR(std::string detector_filename,
std::string finemapping_prototxt, std::string finemapping_caffemodel,
std::string segmentation_prototxt, std::string segmentation_caffemodel,
std::string charRecognization_proto, std::string charRecognization_caffemodel,
std::string segmentationfree_proto,std::string segmentationfree_caffemodel) {
plateDetection = new PlateDetection(detector_filename);
fineMapping = new FineMapping(finemapping_prototxt, finemapping_caffemodel);
plateSegmentation = new PlateSegmentation(segmentation_prototxt, segmentation_caffemodel);
generalRecognizer = new CNNRecognizer(charRecognization_proto, charRecognization_caffemodel);
segmentationFreeRecognizer = new SegmentationFreeRecognizer(segmentationfree_proto,segmentationfree_caffemodel);

}

PipelinePR::~PipelinePR() {

delete plateDetection;
delete fineMapping;
delete plateSegmentation;
delete generalRecognizer;
delete segmentationFreeRecognizer;

PipelinePR::PipelinePR(std::string detect_prototxt, std::string detect_caffemodel,
std::string finetune_prototxt, std::string finetune_caffemodel,
std::string platerec_prototxt, std::string platerec_caffemodel,
std::string dbstring)
{
platedetection = new PlateDetection(detect_prototxt, detect_caffemodel);
finetune = new FineTune(finetune_prototxt, finetune_caffemodel);
platerecognation = new PlateRecognation(platerec_prototxt, platerec_caffemodel);
dbdetection = new DBDetection(dbstring);
}
PipelinePR::~PipelinePR()
{
delete platedetection;
delete finetune;
delete platerecognation;
delete dbdetection;
}
cv::Mat DBcropFromImage(const cv::Mat &image){
cv::Mat cropped;
image.copyTo(cropped);
int cropped_w = cropped.cols;
int cropped_h = cropped.rows;
cv::Rect up,down;
up.y = cropped_h*0.05;up.x = cropped_w*0.2;up.height = cropped_h*0.35;up.width = cropped_w*0.55;
down.y = cropped_h*0.4;down.x = cropped_w*0.05;down.height = cropped_h*0.6;down.width = cropped_w*0.95;
cv::Mat cropUp,cropDown;
cropped(up).copyTo(cropUp);
cropped(down).copyTo(cropDown);
cv::resize(cropUp,cropUp,cv::Size(64,40));
cv::resize(cropDown,cropDown,cv::Size(96,40));
cv::Mat crop = cv::Mat(40,160,CV_8UC3);
cropUp.copyTo(crop(cv::Rect(0,0,64,40)));
cropDown.copyTo(crop(cv::Rect(64,0,96,40)));
return crop;

}

std::vector<PlateInfo> PipelinePR:: RunPiplineAsImage(cv::Mat plateImage,int method) {
std::vector<PlateInfo> results;
std::vector<pr::PlateInfo> plates;
plateDetection->plateDetectionRough(plateImage,plates,36,700);

for (pr::PlateInfo plateinfo:plates) {

cv::Mat image_finemapping = plateinfo.getPlateImage();
image_finemapping = fineMapping->FineMappingVertical(image_finemapping);
image_finemapping = pr::fastdeskew(image_finemapping, 5);



//Segmentation-based

if(method==SEGMENTATION_BASED_METHOD)
{
image_finemapping = fineMapping->FineMappingHorizon(image_finemapping, 2, HorizontalPadding);
cv::resize(image_finemapping, image_finemapping, cv::Size(136+HorizontalPadding, 36));
plateinfo.setPlateImage(image_finemapping);
std::vector<cv::Rect> rects;
plateSegmentation->segmentPlatePipline(plateinfo, 1, rects);
plateSegmentation->ExtractRegions(plateinfo, rects);
cv::copyMakeBorder(image_finemapping, image_finemapping, 0, 0, 0, 20, cv::BORDER_REPLICATE);
plateinfo.setPlateImage(image_finemapping);
generalRecognizer->SegmentBasedSequenceRecognition(plateinfo);
plateinfo.decodePlateNormal(pr::CH_PLATE_CODE);

}
//Segmentation-free
else if(method==SEGMENTATION_FREE_METHOD)
{
image_finemapping = fineMapping->FineMappingHorizon(image_finemapping, 4, HorizontalPadding+3);
cv::resize(image_finemapping, image_finemapping, cv::Size(136+HorizontalPadding, 36));
plateinfo.setPlateImage(image_finemapping);
std::pair<std::string,float> res = segmentationFreeRecognizer->SegmentationFreeForSinglePlate(plateinfo.getPlateImage(),pr::CH_PLATE_CODE);
plateinfo.confidence = res.second;
plateinfo.setPlateName(res.first);
}
results.push_back(plateinfo);
}

return results;

}//namespace pr



std::vector<PlateInfo> PipelinePR::RunPiplineAsImage(cv::Mat plateimg,int IsDB)
{
std::vector<pr::PlateInfo> plates;
std::vector<PlateInfo> plateres;
if(IsDB==1)
{
dbdetection->DBDetect(plateimg,plates,30,1280);
}
else
{
platedetection->Detectssd(plateimg, plates);
}
for (pr::PlateInfo plateinfo : plates) {
cv::Mat image = plateinfo.getPlateImage();
cv::Mat CropImg;
if(IsDB==1)
{
CropImg = DBcropFromImage(image);
platerecognation->segmentation_free_recognation(CropImg, plateinfo);
}
else
{
finetune->Finetune(image, CropImg);
platerecognation->segmentation_free_recognation(CropImg, plateinfo);
}
plateres.push_back(plateinfo);
}
return plateres;
}
}

+ 87
- 16
Prj-Linux/lpr/src/PlateDetection.cpp View File

@@ -1,32 +1,103 @@
#include "../include/PlateDetection.h"
#include "util.h"
namespace pr{
PlateDetection::PlateDetection(std::string filename_cascade){
cascade.load(filename_cascade);
#include "../include/Platedetect.h"

};
void PlateDetection::plateDetectionRough(cv::Mat InputImage,std::vector<pr::PlateInfo> &plateInfos,int min_w,int max_w){
cv::Mat processImage;
using namespace cv;
using namespace std;
namespace pr {

PlateDetection::PlateDetection(std::string ssd_prototxt, std::string ssd_caffemodel)
{
ssdNet = cv::dnn::readNetFromCaffe(ssd_prototxt, ssd_caffemodel);
}
DBDetection::DBDetection(std::string cascadestring)
{
dbcascade.load(cascadestring);
}
void PlateDetection::Detectssd(cv::Mat img, std::vector<pr::PlateInfo> &plateInfos)
{
int cols = img.cols;
int rows = img.rows;
Mat in;
img.convertTo(in, CV_32F);
Mat input(img.size(), CV_32FC3);
Mat inputblob1 = input.reshape(1, { 1, 3,rows,cols });
Mat input_blob = dnn::blobFromImages(in, 0.225, Size(), Scalar(103.53, 116.28, 123.675), false);
float *blobdata = input_blob.ptr<float>();
float *blobdata2 = inputblob1.ptr<float>();
{
for (int i = 0; i < rows; i++)
{
memcpy(blobdata2 + i * cols, blobdata + 3 * i * cols, cols * sizeof(float));
memcpy(blobdata2 + i * cols + rows * cols, blobdata + (1 + 3 * i) * cols, cols * sizeof(float));
memcpy(blobdata2 + i * cols + rows * cols * 2, blobdata + (2 + 3 * i) * cols, cols * sizeof(float));
}
}
ssdNet.setInput(inputblob1);

Mat outputBlob = ssdNet.forward("detection_out");

Mat detectmat(outputBlob.size[2], outputBlob.size[3], CV_32F, outputBlob.ptr<float>());
vector<Rect> recs;
vector<float>scs;
for (int i = 0; i < detectmat.rows; i++)
{
float confidence = detectmat.at<float>(i, 2);
if (confidence > 0.5)
{
int x1, x2, y1, y2;
Rect rec;
Mat cimg;
x1 = int(detectmat.at<float>(i, 3) * cols);
y1 = int(detectmat.at<float>(i, 4) * rows);
x2 = int(detectmat.at<float>(i, 5) * cols);
y2 = int(detectmat.at<float>(i, 6) * rows);
x1 = max(x1, 0);
y1 = max(y1, 0);
x2 = min(x2, cols - 1);
y2 = min(y2, rows - 1);
rec.x = x1; rec.y = y1; rec.width = (x2 - x1 + 1); rec.height = (y2 - y1 + 1);
img(rec).copyTo(cimg);
PlateInfo plateInfo(cimg, rec);
plateInfos.push_back(plateInfo);
}
}
}
cv::Mat cropFromImage(const cv::Mat &image,cv::Rect rect){
int w = image.cols-1;
int h = image.rows-1;
rect.x = std::max(rect.x,0);
rect.y = std::max(rect.y,0);
rect.height = std::min(rect.height,h-rect.y);
rect.width = std::min(rect.width,w-rect.x);
cv::Mat temp(rect.size(), image.type());
cv::Mat cropped;
temp = image(rect);
temp.copyTo(cropped);
return cropped;
}
void DBDetection::DBDetect(cv::Mat InputImage,std::vector<pr::PlateInfo> &plateInfos,int min_w,int max_w)
{
cv::Mat processImage;
cv::cvtColor(InputImage,processImage,cv::COLOR_BGR2GRAY);
std::vector<cv::Rect> platesRegions;
cv::Size minSize(min_w,min_w/4);
cv::Size maxSize(max_w,max_w/4);
cascade.detectMultiScale( processImage, platesRegions,
if (&processImage == NULL)
return;
dbcascade.detectMultiScale( processImage, platesRegions,
1.1, 3, cv::CASCADE_SCALE_IMAGE,minSize,maxSize);
for(auto plate:platesRegions)
{
int zeroadd_w = static_cast<int>(plate.width*0.30);
int zeroadd_h = static_cast<int>(plate.height*2);
int zeroadd_x = static_cast<int>(plate.width*0.15);
int zeroadd_y = static_cast<int>(plate.height*1);
int zeroadd_w = static_cast<int>(plate.width*0.28);
int zeroadd_h = static_cast<int>(plate.height*0.35);
int zeroadd_x = static_cast<int>(plate.width*0.14);
int zeroadd_y = static_cast<int>(plate.height*0.15);
plate.x-=zeroadd_x;
plate.y-=zeroadd_y;
plate.height += zeroadd_h;
plate.width += zeroadd_w;
cv::Mat plateImage = util::cropFromImage(InputImage,plate);
cv::Mat plateImage = cropFromImage(InputImage,plate);
PlateInfo plateInfo(plateImage,plate);
plateInfos.push_back(plateInfo);

}
}
}//namespace pr
}

+ 61
- 0
Prj-Linux/lpr/src/PlateRecognation.cpp View File

@@ -0,0 +1,61 @@
#include "../include/PlateRecognation.h"
#include "../include/Pipeline.h"
using namespace std;
using namespace cv;
namespace pr {

PlateRecognation::PlateRecognation(std::string rec_prototxt, std::string rec_caffemodel)
{
RecNet = cv::dnn::readNetFromCaffe(rec_prototxt, rec_caffemodel);
}
void PlateRecognation::segmentation_free_recognation(cv::Mat src, pr::PlateInfo &plateinfo)
{
float score = 0;
string text = "";
Mat src1 = src.clone();
Mat inputMat(Size(40, 160), CV_8UC3);

for (int j = 0; j < src.rows; j++)
{
for (int i = 0; i < src.cols; i++)
{
inputMat.at<Vec3b>(i, j) = src1.at<Vec3b>(j, i);
}
}
Mat blob = dnn::blobFromImage(inputMat, 1 / 255.f, Size(40, 160), Scalar(0, 0, 0), false, false);
RecNet.setInput(blob);
Mat outblob = RecNet.forward();
int x = outblob.size[2];
int y = outblob.size[0];
float *data = outblob.ptr<float>();
vector<float> scores(84);
vector<int>maxidxs;
vector<float> maxscore;
for (int i = 2; i < 20; i++)
{
for (int j = 0; j < 84; j++)
{
scores[j] = data[j * 20 + i];
}
int idx = max_element(scores.begin(), scores.end()) - scores.begin();
maxidxs.push_back(idx);
maxscore.push_back(scores[idx]);
}
int charnum = 0;
for (int i = 0; i < maxidxs.size(); i++)
{
if (maxidxs[i] < pr::CH_PLATE_CODE.size() && (i == 0 || (maxidxs[i - 1] != maxidxs[i])))
{
text += pr::CH_PLATE_CODE[maxidxs[i]];
score += maxscore[i];
charnum++;
}
}
if (charnum > 0)
{
score /= charnum;
}
plateinfo.setPlateName(text);
plateinfo.confidence = score;
}
}

+ 0
- 404
Prj-Linux/lpr/src/PlateSegmentation.cpp View File

@@ -1,404 +0,0 @@
//
// Created by Jack Yu on 16/10/2017.
//

#include "../include/PlateSegmentation.h"
#include "../include/niBlackThreshold.h"


//#define DEBUG
namespace pr{

PlateSegmentation::PlateSegmentation(std::string prototxt,std::string caffemodel) {
net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);
}
cv::Mat PlateSegmentation::classifyResponse(const cv::Mat &cropped){
cv::Mat inputBlob = cv::dnn::blobFromImage(cropped, 1/255.0, cv::Size(22,22), cv::Scalar(0,0,0),false);
net.setInput(inputBlob,"data");
return net.forward();
}

void drawHist(float* seq,int size,const char* name){
cv::Mat image(300,size,CV_8U);
image.setTo(0);
float* start =seq;
float* end = seq+size;
float l = *std::max_element(start,end);
for(int i = 0;i<size;i++)
{
int p = int(float(seq[i])/l*300);
cv::line(image,cv::Point(i,300),cv::Point(i,300-p),cv::Scalar(255,255,255));
}
cv::resize(image,image,cv::Size(600,100));
cv::imshow(name,image);
}

inline void computeSafeMargin(int &val,const int &rows){
val = std::min(val,rows);
val = std::max(val,0);
}

cv::Rect boxFromCenter(const cv::Point center,int left,int right,int top,int bottom,cv::Size bdSize)
{
cv::Point p1(center.x - left ,center.y - top);
cv::Point p2( center.x + right, center.y + bottom);
p1.x = std::max(0,p1.x);
p1.y = std::max(0,p1.y);
p2.x = std::min(p2.x,bdSize.width-1);
p2.y = std::min(p2.y,bdSize.height-1);
cv::Rect rect(p1,p2);
return rect;
}

cv::Rect boxPadding(cv::Rect rect,int left,int right,int top,int bottom,cv::Size bdSize)
{

cv::Point center(rect.x+(rect.width>>1),rect.y + (rect.height>>1));
int rebuildLeft = (rect.width>>1 )+ left;
int rebuildRight = (rect.width>>1 )+ right;
int rebuildTop = (rect.height>>1 )+ top;
int rebuildBottom = (rect.height>>1 )+ bottom;
return boxFromCenter(center,rebuildLeft,rebuildRight,rebuildTop,rebuildBottom,bdSize);

}



void PlateSegmentation:: refineRegion(cv::Mat &plateImage,const std::vector<int> &candidatePts,const int padding,std::vector<cv::Rect> &rects){
int w = candidatePts[5] - candidatePts[4];
int cols = plateImage.cols;
int rows = plateImage.rows;
for(int i = 0 ; i < candidatePts.size() ; i++)
{
int left = 0;
int right = 0 ;

if(i == 0 ){
left= candidatePts[i];
right = left+w+padding;
}
else {
left = candidatePts[i] - padding;
right = left + w + padding * 2;
}

computeSafeMargin(right,cols);
computeSafeMargin(left,cols);
cv::Rect roi(left,0,right - left,rows-1);
cv::Mat roiImage;
plateImage(roi).copyTo(roiImage);

if (i>=1)
{

cv::Mat roi_thres;
// cv::threshold(roiImage,roi_thres,0,255,cv::THRESH_OTSU|cv::THRESH_BINARY);

niBlackThreshold(roiImage,roi_thres,255,cv::THRESH_BINARY,15,0.27,BINARIZATION_NIBLACK);

std::vector<std::vector<cv::Point>> contours;
cv::findContours(roi_thres,contours,cv::RETR_LIST,cv::CHAIN_APPROX_SIMPLE);
cv::Point boxCenter(roiImage.cols>>1,roiImage.rows>>1);

cv::Rect final_bdbox;
cv::Point final_center;
int final_dist = INT_MAX;


for(auto contour:contours)
{
cv::Rect bdbox = cv::boundingRect(contour);
cv::Point center(bdbox.x+(bdbox.width>>1),bdbox.y + (bdbox.height>>1));
int dist = (center.x - boxCenter.x)*(center.x - boxCenter.x);
if(dist<final_dist and bdbox.height > rows>>1)
{ final_dist =dist;
final_center = center;
final_bdbox = bdbox;
}
}

//rebuild box
if(final_bdbox.height/ static_cast<float>(final_bdbox.width) > 3.5 && final_bdbox.width*final_bdbox.height<10)
final_bdbox = boxFromCenter(final_center,8,8,(rows>>1)-3 , (rows>>1) - 2,roiImage.size());
else {
if(i == candidatePts.size()-1)
final_bdbox = boxPadding(final_bdbox, padding/2, padding, padding/2, padding/2, roiImage.size());
else
final_bdbox = boxPadding(final_bdbox, padding, padding, padding, padding, roiImage.size());


// std::cout<<final_bdbox<<std::endl;
// std::cout<<roiImage.size()<<std::endl;
#ifdef DEBUG
cv::imshow("char_thres",roi_thres);

cv::imshow("char",roiImage(final_bdbox));
cv::waitKey(0);
#endif


}


final_bdbox.x += left;

rects.push_back(final_bdbox);
//

}
else
{
rects.push_back(roi);
}

// else
// {
//
// }

// cv::GaussianBlur(roiImage,roiImage,cv::Size(7,7),3);
//
// cv::imshow("image",roiImage);
// cv::waitKey(0);


}



}
void avgfilter(float *angle_list,int size,int windowsSize) {
float *filterd = new float[size];
for(int i = 0 ; i < size ; i++) filterd [i] = angle_list[i];
// memcpy(filterd,angle_list,size);

cv::Mat kernal_gaussian = cv::getGaussianKernel(windowsSize,3,CV_32F);
float *kernal = (float*)kernal_gaussian.data;
// kernal+=windowsSize;
int r = windowsSize/2;




for (int i = 0; i < size; i++) {
float avg = 0.00f;
for (int j = 0; j < windowsSize; j++) {
if(i+j-r>0&&i+j+r<size-1)
avg += filterd[i + j-r]*kernal[j];
}
// avg = avg / windowsSize;
angle_list[i] = avg;

}

delete filterd;
}

void PlateSegmentation::templateMatchFinding(const cv::Mat &respones,int windowsWidth,std::pair<float,std::vector<int>> &candidatePts){
int rows = respones.rows;
int cols = respones.cols;



float *data = (float*)respones.data;
float *engNum_prob = data;
float *false_prob = data+cols;
float *ch_prob = data+cols*2;

avgfilter(engNum_prob,cols,5);
avgfilter(false_prob,cols,5);
// avgfilter(ch_prob,cols,5);
std::vector<int> candidate_pts(7);
#ifdef DEBUG
drawHist(engNum_prob,cols,"engNum_prob");
drawHist(false_prob,cols,"false_prob");
drawHist(ch_prob,cols,"ch_prob");
cv::waitKey(0);
#endif




int cp_list[7];
float loss_selected = -10;

for(int start = 0 ; start < 20 ; start+=2)
for(int width = windowsWidth-5; width < windowsWidth+5 ; width++ ){
for(int interval = windowsWidth/2; interval < windowsWidth; interval++)
{
int cp1_ch = start;
int cp2_p0 = cp1_ch+ width;
int cp3_p1 = cp2_p0+ width + interval;
int cp4_p2 = cp3_p1 + width;
int cp5_p3 = cp4_p2 + width+1;
int cp6_p4 = cp5_p3 + width+2;
int cp7_p5= cp6_p4+ width+2;

int md1 = (cp1_ch+cp2_p0)>>1;
int md2 = (cp2_p0+cp3_p1)>>1;
int md3 = (cp3_p1+cp4_p2)>>1;
int md4 = (cp4_p2+cp5_p3)>>1;
int md5 = (cp5_p3+cp6_p4)>>1;
int md6 = (cp6_p4+cp7_p5)>>1;




if(cp7_p5>=cols)
continue;
// float loss = ch_prob[cp1_ch]+
// engNum_prob[cp2_p0] +engNum_prob[cp3_p1]+engNum_prob[cp4_p2]+engNum_prob[cp5_p3]+engNum_prob[cp6_p4] +engNum_prob[cp7_p5]
// + (false_prob[md2]+false_prob[md3]+false_prob[md4]+false_prob[md5]+false_prob[md5] + false_prob[md6]);
float loss = ch_prob[cp1_ch]*3 -(false_prob[cp3_p1]+false_prob[cp4_p2]+false_prob[cp5_p3]+false_prob[cp6_p4]+false_prob[cp7_p5]);

if(loss>loss_selected)
{
loss_selected = loss;
cp_list[0]= cp1_ch;
cp_list[1]= cp2_p0;
cp_list[2]= cp3_p1;
cp_list[3]= cp4_p2;
cp_list[4]= cp5_p3;
cp_list[5]= cp6_p4;
cp_list[6]= cp7_p5;
}
}
}
candidate_pts[0] = cp_list[0];
candidate_pts[1] = cp_list[1];
candidate_pts[2] = cp_list[2];
candidate_pts[3] = cp_list[3];
candidate_pts[4] = cp_list[4];
candidate_pts[5] = cp_list[5];
candidate_pts[6] = cp_list[6];

candidatePts.first = loss_selected;
candidatePts.second = candidate_pts;

};


void PlateSegmentation::segmentPlateBySlidingWindows(cv::Mat &plateImage,int windowsWidth,int stride,cv::Mat &respones){


// cv::resize(plateImage,plateImage,cv::Size(136,36));

cv::Mat plateImageGray;
cv::cvtColor(plateImage,plateImageGray,cv::COLOR_BGR2GRAY);
int padding = plateImage.cols-136 ;
// int padding = 0 ;
int height = plateImage.rows - 1;
int width = plateImage.cols - 1 - padding;
for(int i = 0 ; i < width - windowsWidth +1 ; i +=stride)
{
cv::Rect roi(i,0,windowsWidth,height);
cv::Mat roiImage = plateImageGray(roi);
cv::Mat response = classifyResponse(roiImage);
respones.push_back(response);
}




respones = respones.t();
// std::pair<float,std::vector<int>> images ;
//
//
// std::cout<<images.first<<" ";
// for(int i = 0 ; i < images.second.size() ; i++)
// {
// std::cout<<images.second[i]<<" ";
//// cv::line(plateImageGray,cv::Point(images.second[i],0),cv::Point(images.second[i],36),cv::Scalar(255,255,255),1); //DEBUG
// }

// int w = images.second[5] - images.second[4];

// cv::line(plateImageGray,cv::Point(images.second[5]+w,0),cv::Point(images.second[5]+w,36),cv::Scalar(255,255,255),1); //DEBUG
// cv::line(plateImageGray,cv::Point(images.second[5]+2*w,0),cv::Point(images.second[5]+2*w,36),cv::Scalar(255,255,255),1); //DEBUG


// RefineRegion(plateImageGray,images.second,5);

// std::cout<<w<<std::endl;

// std::cout<<<<std::endl;

// cv::resize(plateImageGray,plateImageGray,cv::Size(600,100));



}

// void filterGaussian(cv::Mat &respones,float sigma){
//
// }


void PlateSegmentation::segmentPlatePipline(PlateInfo &plateInfo,int stride,std::vector<cv::Rect> &Char_rects){
cv::Mat plateImage = plateInfo.getPlateImage(); // get src image .
cv::Mat plateImageGray;
cv::cvtColor(plateImage,plateImageGray,cv::COLOR_BGR2GRAY);
//do binarzation
//
std::pair<float,std::vector<int>> sections ; // segment points variables .

cv::Mat respones; //three response of every sub region from origin image .
segmentPlateBySlidingWindows(plateImage,DEFAULT_WIDTH,1,respones);
templateMatchFinding(respones,DEFAULT_WIDTH/stride,sections);
for(int i = 0; i < sections.second.size() ; i++)
{
sections.second[i]*=stride;

}

// std::cout<<sections<<std::endl;

refineRegion(plateImageGray,sections.second,5,Char_rects);
#ifdef DEBUG
for(int i = 0 ; i < sections.second.size() ; i++)
{
std::cout<<sections.second[i]<<" ";
cv::line(plateImageGray,cv::Point(sections.second[i],0),cv::Point(sections.second[i],36),cv::Scalar(255,255,255),1); //DEBUG
}
cv::imshow("plate",plateImageGray);
cv::waitKey(0);
#endif
// cv::waitKey(0);

}

void PlateSegmentation::ExtractRegions(PlateInfo &plateInfo,std::vector<cv::Rect> &rects){
cv::Mat plateImage = plateInfo.getPlateImage();
for(int i = 0 ; i < rects.size() ; i++){
cv::Mat charImage;
plateImage(rects[i]).copyTo(charImage);
if(charImage.channels())
cv::cvtColor(charImage,charImage,cv::COLOR_BGR2GRAY);
// cv::imshow("image",charImage);
// cv::waitKey(0);
cv::equalizeHist(charImage,charImage);
//

//


std::pair<CharType,cv::Mat> char_instance;
if(i == 0 ){

char_instance.first = CHINESE;


} else if(i == 1){
char_instance.first = LETTER;
}
else{
char_instance.first = LETTER_NUMS;
}
char_instance.second = charImage;
plateInfo.appendPlateChar(char_instance);

}

}

}//namespace pr

+ 0
- 23
Prj-Linux/lpr/src/Recognizer.cpp View File

@@ -1,23 +0,0 @@
//
// Created by Jack Yu on 22/10/2017.
//

#include "../include/Recognizer.h"

namespace pr{
void GeneralRecognizer::SegmentBasedSequenceRecognition(PlateInfo &plateinfo){
for(auto char_instance:plateinfo.plateChars)
{
std::pair<CharType,cv::Mat> res;
if(char_instance.second.rows*char_instance.second.cols>40) {
label code_table = recognizeCharacter(char_instance.second);
res.first = char_instance.first;
code_table.copyTo(res.second);
plateinfo.appendPlateCoding(res);
} else{
res.first = INVALID;
plateinfo.appendPlateCoding(res);
}
}
}
}

+ 0
- 89
Prj-Linux/lpr/src/SegmentationFreeRecognizer.cpp View File

@@ -1,89 +0,0 @@
//
// Created by Jack Yu on 28/11/2017.
//
#include "../include/SegmentationFreeRecognizer.h"

namespace pr {
SegmentationFreeRecognizer::SegmentationFreeRecognizer(std::string prototxt, std::string caffemodel) {
net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);
}
inline int judgeCharRange(int id)
{return id<31 || id>63;
}
std::pair<std::string,float> decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table,float thres)
{
cv::MatSize mtsize = code_table.size;
int sequencelength = mtsize[2];
int labellength = mtsize[1];
cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table);
std::string name = "";
std::vector<int> seq(sequencelength);
std::vector<std::pair<int,float>> seq_decode_res;
for(int i = 0 ; i < sequencelength; i++) {
float *fstart = ((float *) (code_table.data) + i * labellength );
int id = std::max_element(fstart,fstart+labellength) - fstart;
seq[i] =id;
}

float sum_confidence = 0;
int plate_lenghth = 0 ;
for(int i = 0 ; i< sequencelength ; i++)
{
if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
{
float *fstart = ((float *) (code_table.data) + i * labellength );
float confidence = *(fstart+seq[i]);
std::pair<int,float> pair_(seq[i],confidence);
seq_decode_res.push_back(pair_);
}
}
int i = 0;
if (seq_decode_res.size()>1 && judgeCharRange(seq_decode_res[0].first) && judgeCharRange(seq_decode_res[1].first))
{
i=2;
int c = seq_decode_res[0].second<seq_decode_res[1].second;
name+=mapping_table[seq_decode_res[c].first];
sum_confidence+=seq_decode_res[c].second;
plate_lenghth++;
}

for(; i < seq_decode_res.size();i++)
{
name+=mapping_table[seq_decode_res[i].first];
sum_confidence +=seq_decode_res[i].second;
plate_lenghth++;
}
std::pair<std::string,float> res;
res.second = sum_confidence/plate_lenghth;
res.first = name;
return res;

}
std::string decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table)
{
cv::MatSize mtsize = code_table.size;
int sequencelength = mtsize[2];
int labellength = mtsize[1];
cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table);
std::string name = "";
std::vector<int> seq(sequencelength);
for(int i = 0 ; i < sequencelength; i++) {
float *fstart = ((float *) (code_table.data) + i * labellength );
int id = std::max_element(fstart,fstart+labellength) - fstart;
seq[i] =id;
}
for(int i = 0 ; i< sequencelength ; i++)
{
if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
name+=mapping_table[seq[i]];
}
return name;
}
std::pair<std::string,float> SegmentationFreeRecognizer::SegmentationFreeForSinglePlate(cv::Mat Image,std::vector<std::string> mapping_table) {
cv::transpose(Image,Image);
cv::Mat inputBlob = cv::dnn::blobFromImage(Image, 1 / 255.0, cv::Size(40,160));
net.setInput(inputBlob, "data");
cv::Mat char_prob_mat = net.forward();
return decodeResults(char_prob_mat,mapping_table,0.00);
}
}

+ 0
- 67
Prj-Linux/lpr/src/util.h View File

@@ -1,67 +0,0 @@
//
// Created by Jack Yu on 04/04/2017.
//

#include <opencv2/opencv.hpp>
namespace util{
template <class T> void swap ( T& a, T& b )
{
T c(a); a=b; b=c;
}
template <class T> T min(T& a,T& b )
{
return a>b?b:a;
}

cv::Mat cropFromImage(const cv::Mat &image,cv::Rect rect){
int w = image.cols-1;
int h = image.rows-1;
rect.x = std::max(rect.x,0);
rect.y = std::max(rect.y,0);
rect.height = std::min(rect.height,h-rect.y);
rect.width = std::min(rect.width,w-rect.x);
cv::Mat temp(rect.size(), image.type());
cv::Mat cropped;
temp = image(rect);
temp.copyTo(cropped);
return cropped;

}

cv::Mat cropBox2dFromImage(const cv::Mat &image,cv::RotatedRect rect)
{
cv::Mat M, rotated, cropped;
float angle = rect.angle;
cv::Size rect_size(rect.size.width,rect.size.height);
if (rect.angle < -45.) {
angle += 90.0;
swap(rect_size.width, rect_size.height);
}
M = cv::getRotationMatrix2D(rect.center, angle, 1.0);
cv::warpAffine(image, rotated, M, image.size(), cv::INTER_CUBIC);
cv::getRectSubPix(rotated, rect_size, rect.center, cropped);
return cropped;
}

cv::Mat calcHist(const cv::Mat &image)
{
cv::Mat hsv;
std::vector<cv::Mat> hsv_planes;
cv::cvtColor(image,hsv,cv::COLOR_BGR2HSV);
cv::split(hsv,hsv_planes);
cv::Mat hist;
int histSize = 256;
float range[] = {0,255};
const float* histRange = {range};
cv::calcHist( &hsv_planes[0], 1, 0, cv::Mat(), hist, 1, &histSize, &histRange,true, true);
return hist;
}
float computeSimilir(const cv::Mat &A,const cv::Mat &B)
{
cv::Mat histA,histB;
histA = calcHist(A);
histB = calcHist(B);
return cv::compareHist(histA,histB,CV_COMP_CORREL);
}
}//namespace util

+ 28
- 0
Prj-Linux/lpr/tests/testPipeLine.cpp View File

@@ -0,0 +1,28 @@
#include"../include/Pipeline.h"

void TEST_PIPELINE()
{
pr::PipelinePR prc("../lpr/model/mininet_ssd_v1.prototxt", "../lpr/model/mininet_ssd_v1.caffemodel",
"../lpr/model/refinenet.prototxt", "../lpr/model/refinenet.caffemodel",
"../lpr/model/SegmenationFree-Inception.prototxt", "../lpr/model/SegmenationFree-Inception.caffemodel",
"../lpr/model/cascade_double.xml");
cv::Mat img = cv::imread("../lpr//res//test.jpg");
std::vector<pr::PlateInfo> res = prc.RunPiplineAsImage(img,0);
for (auto st : res) {
if (st.confidence > 0.75) {
std::cout << st.getPlateName() << " " << st.confidence << std::endl;
cv::Rect region = st.getPlateRect();

cv::rectangle(img, cv::Point(region.x, region.y), cv::Point(region.x + region.width, region.y + region.height), cv::Scalar(255, 255, 0), 2);
}
}

//cv::imshow("image", img);
//cv::waitKey(0);

}
int main()
{
TEST_PIPELINE();
return 0;
}

+ 0
- 34
Prj-Linux/lpr/tests/test_detection.cpp View File

@@ -1,34 +0,0 @@
//
// Created by 庾金科 on 20/09/2017.
//

#include <../include/PlateDetection.h>


void drawRect(cv::Mat image,cv::Rect rect)
{
cv::Point p1(rect.x,rect.y);
cv::Point p2(rect.x+rect.width,rect.y+rect.height);
cv::rectangle(image,p1,p2,cv::Scalar(0,255,0),1);
}


int main()
{
cv::Mat image = cv::imread("res/test1.jpg");
pr::PlateDetection plateDetection("model/cascade.xml");
std::vector<pr::PlateInfo> plates;
plateDetection.plateDetectionRough(image,plates);
for(pr::PlateInfo platex:plates)
{
drawRect(image,platex.getPlateRect());
cv::imwrite("res/cache/test.png",platex.getPlateImage());
cv::imshow("image",platex.getPlateImage());
cv::waitKey(0);
}
cv::imshow("image",image);
cv::waitKey(0);
return 0 ;


}

+ 0
- 34
Prj-Linux/lpr/tests/test_fastdeskew.cpp View File

@@ -1,34 +0,0 @@
//
// Created by Jack Yu on 02/10/2017.
//


#include <../include/FastDeskew.h>


void drawRect(cv::Mat image,cv::Rect rect)
{
cv::Point p1(rect.x,rect.y);
cv::Point p2(rect.x+rect.width,rect.y+rect.height);
cv::rectangle(image,p1,p2,cv::Scalar(0,255,0),1);
}
void TEST_DESKEW(){

cv::Mat image = cv::imread("res/3.png",cv::IMREAD_GRAYSCALE);
// cv::resize(image,image,cv::Size(136*2,36*2));
cv::Mat deskewed = pr::fastdeskew(image,12);
// cv::imwrite("./res/4.png",deskewed);
// cv::Mat deskewed2 = pr::fastdeskew(deskewed,12);
//
cv::imshow("image",deskewed);
cv::waitKey(0);

}
int main()
{

TEST_DESKEW();
return 0 ;


}

+ 0
- 25
Prj-Linux/lpr/tests/test_finemapping.cpp View File

@@ -1,25 +0,0 @@
//
// Created by Jack Yu on 24/09/2017.
//

#include "FineMapping.h"






int main()
{
cv::Mat image = cv::imread("res/cache/test.png");
cv::Mat image_finemapping = pr::FineMapping::FineMappingVertical(image);
pr::FineMapping finemapper = pr::FineMapping("model/HorizonalFinemapping.prototxt","model/HorizonalFinemapping.caffemodel");
image_finemapping = finemapper.FineMappingHorizon(image_finemapping,0,-3);
cv::imwrite("res/cache/finemappingres.png",image_finemapping);
cv::imshow("image",image_finemapping);
cv::waitKey(0);


return 0 ;

}

+ 0
- 199
Prj-Linux/lpr/tests/test_pipeline.cpp View File

@@ -1,199 +0,0 @@
//
// Created by Jack Yu on 23/10/2017.
//

#include "../include/Pipeline.h"




using namespace std;

template<class T>
static unsigned int levenshtein_distance(const T &s1, const T &s2) {
const size_t len1 = s1.size(), len2 = s2.size();
std::vector<unsigned int> col(len2 + 1), prevCol(len2 + 1);

for (unsigned int i = 0; i < prevCol.size(); i++) prevCol[i] = i;
for (unsigned int i = 0; i < len1; i++) {
col[0] = i + 1;
for (unsigned int j = 0; j < len2; j++)
col[j + 1] = min(
min(prevCol[1 + j] + 1, col[j] + 1),
prevCol[j] + (s1[i] == s2[j] ? 0 : 1));
col.swap(prevCol);
}
return prevCol[len2];
}




void TEST_ACC(){

pr::PipelinePR prc("model/cascade.xml",
"model/HorizonalFinemapping.prototxt","model/HorizonalFinemapping.caffemodel",
"model/Segmentation.prototxt","model/Segmentation.caffemodel",
"model/CharacterRecognization.prototxt","model/CharacterRecognization.caffemodel",
"model/SegmenationFree-Inception.prototxt","model/SegmenationFree-Inception.caffemodel"
);

ifstream file;
string imagename;
int n = 0,correct = 0,j = 0,sum = 0;
char filename[] = "/Users/yujinke/Downloads/general_test/1.txt";
string pathh = "/Users/yujinke/Downloads/general_test/";
file.open(filename, ios::in);
while (!file.eof())
{
file >> imagename;
string imgpath = pathh + imagename;
std::cout << "------------------------------------------------" << endl;
cout << "图片名:" << imagename << endl;
cv::Mat image = cv::imread(imgpath);
// cv::imshow("image", image);
// cv::waitKey(0);

std::vector<pr::PlateInfo> res = prc.RunPiplineAsImage(image,pr::SEGMENTATION_FREE_METHOD);

float conf = 0;
vector<float> con ;
vector<string> name;
for (auto st : res) {
if (st.confidence > 0.1) {
//std::cout << st.getPlateName() << " " << st.confidence << std::endl;
con.push_back(st.confidence);
name.push_back(st.getPlateName());
//conf += st.confidence;
}
else
cout << "no string" << endl;
}
// std::cout << conf << std::endl;
int num = con.size();
float max = 0;
string platestr, chpr, ch;
int diff = 0,dif = 0;
for (int i = 0; i < num; i++) {

if (con.at(i) > max)
{
max = con.at(i);
platestr = name.at(i);
}

}
// cout << "max:"<<max << endl;
cout << "string:" << platestr << endl;
chpr = platestr.substr(0, 2);
ch = imagename.substr(0, 2);
diff = levenshtein_distance(imagename, platestr);
dif = diff - 4;
cout << "差距:" <<dif << endl;
sum += dif;
if (ch != chpr) n++;
if (diff == 0) correct++;
j++;
}
float cha = 1 - float(n) / float(j);
std::cout << "------------------------------------------------" << endl;
cout << "车牌总数:" << j << endl;
cout << "汉字识别准确率:"<<cha << endl;
float chaccuracy = 1 - float(sum - n * 2) /float(j * 8);
cout << "字符识别准确率:" << chaccuracy << endl;

}


void TEST_PIPELINE(){

pr::PipelinePR prc("model/cascade.xml",
"model/HorizonalFinemapping.prototxt","model/HorizonalFinemapping.caffemodel",
"model/Segmentation.prototxt","model/Segmentation.caffemodel",
"model/CharacterRecognization.prototxt","model/CharacterRecognization.caffemodel",
"model/SegmentationFree.prototxt","model/SegmentationFree.caffemodel"
);

cv::Mat image = cv::imread("/Users/yujinke/ClionProjects/cpp_ocr_demo/test.png");


std::vector<pr::PlateInfo> res = prc.RunPiplineAsImage(image,pr::SEGMENTATION_FREE_METHOD);

for(auto st:res) {
if(st.confidence>0.75) {
std::cout << st.getPlateName() << " " << st.confidence << std::endl;
cv::Rect region = st.getPlateRect();

cv::rectangle(image,cv::Point(region.x,region.y),cv::Point(region.x+region.width,region.y+region.height),cv::Scalar(255,255,0),2);
}
}

cv::imshow("image",image);
cv::waitKey(0);

}


void TEST_CAM()
{

cv::VideoCapture capture("test1.mp4");
cv::Mat frame;

pr::PipelinePR prc("model/cascade.xml",
"model/HorizonalFinemapping.prototxt","model/HorizonalFinemapping.caffemodel",
"model/Segmentation.prototxt","model/Segmentation.caffemodel",
"model/CharacterRecognization.prototxt","model/CharacterRecognization.caffemodel",
"model/SegmentationFree.prototxt","model/SegmentationFree.caffemodel"
);





while(1) {
//读取下一帧
if (!capture.read(frame)) {
std::cout << "读取视频失败" << std::endl;
exit(1);
}
//
// cv::transpose(frame,frame);
// cv::flip(frame,frame,2);

// cv::resize(frame,frame,cv::Size(frame.cols/2,frame.rows/2));



std::vector<pr::PlateInfo> res = prc.RunPiplineAsImage(frame,pr::SEGMENTATION_FREE_METHOD);

for(auto st:res) {
if(st.confidence>0.75) {
std::cout << st.getPlateName() << " " << st.confidence << std::endl;
cv::Rect region = st.getPlateRect();

cv::rectangle(frame,cv::Point(region.x,region.y),cv::Point(region.x+region.width,region.y+region.height),cv::Scalar(255,255,0),2);
}
}

cv::imshow("image",frame);
cv::waitKey(1);



}

}


int main()
{
TEST_ACC();

// TEST_CAM();
// TEST_PIPELINE();

return 0 ;


}

+ 0
- 54
Prj-Linux/lpr/tests/test_recognization.cpp View File

@@ -1,54 +0,0 @@
//
// Created by Jack Yu on 23/10/2017.
//

#include "../include/CNNRecognizer.h"

std::vector<std::string> chars{"京","沪","津","渝","冀","晋","蒙","辽","吉","黑","苏","浙","皖","闽","赣","鲁","豫","鄂","湘","粤","桂","琼","川","贵","云","藏","陕","甘","青","宁","新","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z"};

#include <opencv2/dnn.hpp>
using namespace cv::dnn;


void getMaxClass(cv::Mat &probBlob, int *classId, double *classProb)
{
// cv::Mat probMat = probBlob.matRefConst().reshape(1, 1); //reshape the blob to 1x1000 matrix
cv::Point classNumber;

cv::minMaxLoc(probBlob, NULL, classProb, NULL, &classNumber);

*classId = classNumber.x;
}

void TEST_RECOGNIZATION(){
// pr::CNNRecognizer instance("model/CharacterRecognization.prototxt","model/CharacterRecognization.caffemodel");
Net net = cv::dnn::readNetFromCaffe("model/CharacterRecognization.prototxt","model/CharacterRecognization.caffemodel");
cv::Mat image = cv::imread("res/char1.png",cv::IMREAD_GRAYSCALE);
cv::resize(image,image,cv::Size(14,30));
cv::equalizeHist(image,image);
cv::Mat inputBlob = cv::dnn::blobFromImage(image, 1/255.0, cv::Size(14,30), false);

net.setInput(inputBlob,"data");

cv::Mat res = net.forward();
std::cout<<res<<std::endl;
float *p = (float*)res.data;
int maxid= 0;
double prob = 0;

getMaxClass(res,&maxid,&prob);



std::cout<<chars[maxid]<<std::endl;





};
int main()
{TEST_RECOGNIZATION();


}

+ 0
- 43
Prj-Linux/lpr/tests/test_segmentation.cpp View File

@@ -1,43 +0,0 @@
//
// Created by Jack Yu on 16/10/2017.
//


#include "../include/PlateSegmentation.h"
#include "../include/CNNRecognizer.h"
#include "../include/Recognizer.h"


std::vector<std::string> chars{"京","沪","津","渝","冀","晋","蒙","辽","吉","黑","苏","浙","皖","闽","赣","鲁","豫","鄂","湘","粤","桂","琼","川","贵","云","藏","陕","甘","青","宁","新","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z"};


void TEST_SLIDINGWINDOWS_EVAL(){
cv::Mat demo = cv::imread("res/cache/finemappingres.png");
cv::resize(demo,demo,cv::Size(136,36));

cv::Mat respones;
pr::PlateSegmentation plateSegmentation("model/Segmentation.prototxt","model/Segmentation.caffemodel");
pr::PlateInfo plate;
plate.setPlateImage(demo);
std::vector<cv::Rect> rects;
plateSegmentation.segmentPlatePipline(plate,1,rects);
plateSegmentation.ExtractRegions(plate,rects);

pr::GeneralRecognizer *recognizer = new pr::CNNRecognizer("model/CharacterRecognization.prototxt","model/CharacterRecognization.caffemodel");
recognizer->SegmentBasedSequenceRecognition(plate);
std::cout<<plate.decodePlateNormal(chars)<<std::endl;


delete(recognizer);





}
int main(){

TEST_SLIDINGWINDOWS_EVAL();

return 0;
}

+ 0
- 54
Prj-Linux/lpr/tests/test_segmentationFree.cpp View File

@@ -1,54 +0,0 @@
//
// Created by Jack Yu on 29/11/2017.
//
#include "../include/SegmentationFreeRecognizer.h"
#include "../include/Pipeline.h"

#include "../include/PlateInfo.h"



std::string decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table)
{
cv::MatSize mtsize = code_table.size;
int sequencelength = mtsize[2];
int labellength = mtsize[1];
cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table);
std::string name = "";
std::vector<int> seq(sequencelength);
for(int i = 0 ; i < sequencelength; i++) {
float *fstart = ((float *) (code_table.data) + i * labellength );
int id = std::max_element(fstart,fstart+labellength) - fstart;
seq[i] =id;
}
for(int i = 0 ; i< sequencelength ; i++)
{
if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
name+=mapping_table[seq[i]];
}
std::cout<<name;
return name;
}


int main()
{
cv::Mat image = cv::imread("res/cache/chars_segment.jpg");
// cv::transpose(image,image);

// cv::resize(image,image,cv::Size(160,40));
cv::imshow("xxx",image);
cv::waitKey(0);
pr::SegmentationFreeRecognizer recognizr("model/SegmenationFree-Inception.prototxt","model/ISegmenationFree-Inception.caffemodel");
std::pair<std::string,float> res = recognizr.SegmentationFreeForSinglePlate(image,pr::CH_PLATE_CODE);
std::cout<<res.first<<" "
<<res.second<<std::endl;


// decodeResults(plate,pr::CH_PLATE_CODE);
cv::imshow("image",image);
cv::waitKey(0);

return 0;

}

+ 0
- 46
Prj-PHP/CMakeLists.txt View File

@@ -1,46 +0,0 @@
cmake_minimum_required(VERSION 3.6)
project(platescan)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
find_package(OpenCV 3.3.0 REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS})
include_directories(include)

add_library( # Sets the name of the library.
platescan

# Sets the library as a shared library.
SHARED

# Provides a relative path to your source file(s).
main.cpp

lpr/CNNRecognizer.cpp
lpr/FastDeskew.cpp
lpr/FineMapping.cpp
lpr/Pipeline.cpp
lpr/PlateDetection.cpp
lpr/PlateSegmentation.cpp
lpr/Recognizer.cpp
lpr/SegmentationFreeRecognizer.cpp
)


target_link_libraries(
platescan
phpcpp
${OpenCV_LIBS}
)

execute_process(COMMAND php-config --extension-dir
OUTPUT_VARIABLE LIBRARY_DIR)

message("PHP_EXTENSIONS_DIR ${LIBRARY_DIR}")

add_custom_command(TARGET platescan
POST_BUILD
COMMAND mv ./libplatescan.so ./platescan.so
COMMAND cp -f ./platescan.so ${LIBRARY_DIR}
COMMAND ${POST_COMPILE_COMMAND}
)

+ 0
- 50
Prj-PHP/README.MD View File

@@ -1,50 +0,0 @@

# Prj-PHP

HyperLPR 在PHP扩展程序中的实现,核心代码拷贝了 Prj-Linux 中的代码。

## CPP 依赖

+ Opencv 3.3
+ PHPCPP

## Linux/Mac 编译

```bash
mkdir build
cd build
cmake ../
make -j
```

## DEMO

```php
// 也可编译完后直接在tests目录直接运行 php platescan.php
$path = realpath("demo.png"); // 图片文件所在路径,realpath转为绝对路径
$model = realpath("model"); // 模型资源所在文件夹
$res = platescan($path, $model, 0.8);
var_dump($res); // string(9) "苏ED0N19"

```

最终实现上边这样的PHP调用

![image](./tests/demo.png)

## 测试备忘

经多次测试发现部分图片难以识别或者容易识别错误,经过筛选反推出如下规律:

### 识别精度高的图片

+ 图片中包含有整个车身
+ 图片清晰度较高,不模糊
+ 图片拍摄角度为正面拍摄,车牌在图片中没有较大幅度的倾斜
+ 图片中的车牌在整个图片中所占位置较小

### 识别精度低的图片

+ 图片模糊,程序未能裁切出正确的车牌,或者裁切后因图片太模糊而无法识别(此处应该可以通过训练更多样本解决)
+ 图片中的车牌在整个图片中占了1/3的位置甚至更高
+ 图片拍摄角度为俯角拍摄,车牌在图片中是倾斜着的

+ 0
- 24
Prj-PHP/include/CNNRecognizer.h View File

@@ -1,24 +0,0 @@
//
// Created by 庾金科 on 21/10/2017.
//

#ifndef SWIFTPR_CNNRECOGNIZER_H
#define SWIFTPR_CNNRECOGNIZER_H

#include "Recognizer.h"
namespace pr{
class CNNRecognizer: public GeneralRecognizer{
public:
const int CHAR_INPUT_W = 14;
const int CHAR_INPUT_H = 30;

CNNRecognizer(std::string prototxt,std::string caffemodel);
label recognizeCharacter(cv::Mat character);
private:
cv::dnn::Net net;

};

}

#endif //SWIFTPR_CNNRECOGNIZER_H

+ 0
- 18
Prj-PHP/include/FastDeskew.h View File

@@ -1,18 +0,0 @@
//
// Created by 庾金科 on 22/09/2017.
//

#ifndef SWIFTPR_FASTDESKEW_H
#define SWIFTPR_FASTDESKEW_H

#include <math.h>
#include <opencv2/opencv.hpp>
namespace pr{

cv::Mat fastdeskew(cv::Mat skewImage,int blockSize);
// cv::Mat spatialTransformer(cv::Mat skewImage);

}//namepace pr


#endif //SWIFTPR_FASTDESKEW_H

+ 0
- 32
Prj-PHP/include/FineMapping.h View File

@@ -1,32 +0,0 @@
//
// Created by 庾金科 on 22/09/2017.
//

#ifndef SWIFTPR_FINEMAPPING_H
#define SWIFTPR_FINEMAPPING_H

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>

#include <string>
namespace pr{
class FineMapping{
public:
FineMapping();


FineMapping(std::string prototxt,std::string caffemodel);
static cv::Mat FineMappingVertical(cv::Mat InputProposal,int sliceNum=15,int upper=0,int lower=-50,int windows_size=17);
cv::Mat FineMappingHorizon(cv::Mat FinedVertical,int leftPadding,int rightPadding);


private:
cv::dnn::Net net;

};




}
#endif //SWIFTPR_FINEMAPPING_H

+ 0
- 60
Prj-PHP/include/Pipeline.h View File

@@ -1,60 +0,0 @@
//
// Created by 庾金科 on 22/10/2017.
//

#ifndef SWIFTPR_PIPLINE_H
#define SWIFTPR_PIPLINE_H

#include "PlateDetection.h"
#include "PlateSegmentation.h"
#include "CNNRecognizer.h"
#include "PlateInfo.h"
#include "FastDeskew.h"
#include "FineMapping.h"
#include "Recognizer.h"
#include "SegmentationFreeRecognizer.h"

namespace pr{

const std::vector<std::string> CH_PLATE_CODE{"京", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "皖", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂",
"琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
"B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
"Y", "Z","港","学","使","警","澳","挂","军","北","南","广","沈","兰","成","济","海","民","航","空"};



const int SEGMENTATION_FREE_METHOD = 0;
const int SEGMENTATION_BASED_METHOD = 1;

class PipelinePR{
public:
GeneralRecognizer *generalRecognizer;
PlateDetection *plateDetection;
PlateSegmentation *plateSegmentation;
FineMapping *fineMapping;
SegmentationFreeRecognizer *segmentationFreeRecognizer;

PipelinePR(std::string detector_filename,
std::string finemapping_prototxt,std::string finemapping_caffemodel,
std::string segmentation_prototxt,std::string segmentation_caffemodel,
std::string charRecognization_proto,std::string charRecognization_caffemodel,
std::string segmentationfree_proto,std::string segmentationfree_caffemodel
);
~PipelinePR();



std::vector<std::string> plateRes;
std::vector<PlateInfo> RunPiplineAsImage(cv::Mat plateImage,int method);







};


}
#endif //SWIFTPR_PIPLINE_H

+ 0
- 33
Prj-PHP/include/PlateDetection.h View File

@@ -1,33 +0,0 @@
//
// Created by 庾金科 on 20/09/2017.
//

#ifndef SWIFTPR_PLATEDETECTION_H
#define SWIFTPR_PLATEDETECTION_H

#include <opencv2/opencv.hpp>
#include <PlateInfo.h>
#include <vector>
namespace pr{
class PlateDetection{
public:
PlateDetection(std::string filename_cascade);
PlateDetection();
void LoadModel(std::string filename_cascade);
void plateDetectionRough(cv::Mat InputImage,std::vector<pr::PlateInfo> &plateInfos,int min_w=36,int max_w=800);
// std::vector<pr::PlateInfo> plateDetectionRough(cv::Mat InputImage,int min_w= 60,int max_h = 400);


// std::vector<pr::PlateInfo> plateDetectionRoughByMultiScaleEdge(cv::Mat InputImage);



private:
cv::CascadeClassifier cascade;


};

}// namespace pr

#endif //SWIFTPR_PLATEDETECTION_H

+ 0
- 126
Prj-PHP/include/PlateInfo.h View File

@@ -1,126 +0,0 @@
//
// Created by 庾金科 on 20/09/2017.
//

#ifndef SWIFTPR_PLATEINFO_H
#define SWIFTPR_PLATEINFO_H
#include <opencv2/opencv.hpp>
namespace pr {

typedef std::vector<cv::Mat> Character;

enum PlateColor { BLUE, YELLOW, WHITE, GREEN, BLACK,UNKNOWN};
enum CharType {CHINESE,LETTER,LETTER_NUMS,INVALID};


class PlateInfo {
public:
std::vector<std::pair<CharType,cv::Mat>> plateChars;
std::vector<std::pair<CharType,cv::Mat>> plateCoding;
float confidence = 0;
PlateInfo(const cv::Mat &plateData, std::string plateName, cv::Rect plateRect, PlateColor plateType) {
licensePlate = plateData;
name = plateName;
ROI = plateRect;
Type = plateType;
}
PlateInfo(const cv::Mat &plateData, cv::Rect plateRect, PlateColor plateType) {
licensePlate = plateData;
ROI = plateRect;
Type = plateType;
}
PlateInfo(const cv::Mat &plateData, cv::Rect plateRect) {
licensePlate = plateData;
ROI = plateRect;
}
PlateInfo() {

}

cv::Mat getPlateImage() {
return licensePlate;
}

void setPlateImage(cv::Mat plateImage){
licensePlate = plateImage;
}

cv::Rect getPlateRect() {
return ROI;
}

void setPlateRect(cv::Rect plateRect) {
ROI = plateRect;
}
cv::String getPlateName() {
return name;

}
void setPlateName(cv::String plateName) {
name = plateName;
}
int getPlateType() {
return Type;
}

void appendPlateChar(const std::pair<CharType,cv::Mat> &plateChar)
{
plateChars.push_back(plateChar);
}

void appendPlateCoding(const std::pair<CharType,cv::Mat> &charProb){
plateCoding.push_back(charProb);
}

// cv::Mat getPlateChars(int id) {
// if(id<PlateChars.size())
// return PlateChars[id];
// }
std::string decodePlateNormal(std::vector<std::string> mappingTable) {
std::string decode;
for(auto plate:plateCoding) {
float *prob = (float *)plate.second.data;
if(plate.first == CHINESE) {

decode += mappingTable[std::max_element(prob,prob+31) - prob];
confidence+=*std::max_element(prob,prob+31);


// std::cout<<*std::max_element(prob,prob+31)<<std::endl;

}

else if(plate.first == LETTER) {
decode += mappingTable[std::max_element(prob+41,prob+65)- prob];
confidence+=*std::max_element(prob+41,prob+65);
}

else if(plate.first == LETTER_NUMS) {
decode += mappingTable[std::max_element(prob+31,prob+65)- prob];
confidence+=*std::max_element(prob+31,prob+65);
// std::cout<<*std::max_element(prob+31,prob+65)<<std::endl;

}
else if(plate.first == INVALID)
{
decode+='*';
}

}
name = decode;

confidence/=7;

return decode;
}

private:
cv::Mat licensePlate;
cv::Rect ROI;
std::string name ;
PlateColor Type;
};
}


#endif //SWIFTPR_PLATEINFO_H

+ 0
- 39
Prj-PHP/include/PlateSegmentation.h View File

@@ -1,39 +0,0 @@
//
// Created by 庾金科 on 16/10/2017.
//

#ifndef SWIFTPR_PLATESEGMENTATION_H
#define SWIFTPR_PLATESEGMENTATION_H

#include "opencv2/opencv.hpp"
#include <opencv2/dnn.hpp>
#include "PlateInfo.h"

namespace pr{


class PlateSegmentation{
public:
const int PLATE_NORMAL = 6;
const int PLATE_NORMAL_GREEN = 7;
const int DEFAULT_WIDTH = 20;
PlateSegmentation(std::string phototxt,std::string caffemodel);
PlateSegmentation(){}
void segmentPlatePipline(PlateInfo &plateInfo,int stride,std::vector<cv::Rect> &Char_rects);

void segmentPlateBySlidingWindows(cv::Mat &plateImage,int windowsWidth,int stride,cv::Mat &respones);
void templateMatchFinding(const cv::Mat &respones,int windowsWidth,std::pair<float,std::vector<int>> &candidatePts);
void refineRegion(cv::Mat &plateImage,const std::vector<int> &candidatePts,const int padding,std::vector<cv::Rect> &rects);
void ExtractRegions(PlateInfo &plateInfo,std::vector<cv::Rect> &rects);
cv::Mat classifyResponse(const cv::Mat &cropped);
private:
cv::dnn::Net net;


// RefineRegion()

};

}//namespace pr

#endif //SWIFTPR_PLATESEGMENTATION_H

+ 0
- 23
Prj-PHP/include/Recognizer.h View File

@@ -1,23 +0,0 @@
//
// Created by 庾金科 on 20/10/2017.
//


#ifndef SWIFTPR_RECOGNIZER_H
#define SWIFTPR_RECOGNIZER_H

#include "PlateInfo.h"
#include "opencv2/dnn.hpp"
namespace pr{
typedef cv::Mat label;
class GeneralRecognizer{
public:
virtual label recognizeCharacter(cv::Mat character) = 0;
// virtual cv::Mat SegmentationFreeForSinglePlate(cv::Mat plate) = 0;
void SegmentBasedSequenceRecognition(PlateInfo &plateinfo);
void SegmentationFreeSequenceRecognition(PlateInfo &plateInfo);

};

}
#endif //SWIFTPR_RECOGNIZER_H

+ 0
- 28
Prj-PHP/include/SegmentationFreeRecognizer.h View File

@@ -1,28 +0,0 @@
//
// Created by 庾金科 on 28/11/2017.
//

#ifndef SWIFTPR_SEGMENTATIONFREERECOGNIZER_H
#define SWIFTPR_SEGMENTATIONFREERECOGNIZER_H

#include "Recognizer.h"
namespace pr{


class SegmentationFreeRecognizer{
public:
const int CHAR_INPUT_W = 14;
const int CHAR_INPUT_H = 30;
const int CHAR_LEN = 84;

SegmentationFreeRecognizer(std::string prototxt,std::string caffemodel);
std::pair<std::string,float> SegmentationFreeForSinglePlate(cv::Mat plate,std::vector<std::string> mapping_table);


private:
cv::dnn::Net net;

};

}
#endif //SWIFTPR_SEGMENTATIONFREERECOGNIZER_H

+ 0
- 107
Prj-PHP/include/niBlackThreshold.h View File

@@ -1,107 +0,0 @@
//
// Created by 庾金科 on 26/10/2017.
//

#ifndef SWIFTPR_NIBLACKTHRESHOLD_H
#define SWIFTPR_NIBLACKTHRESHOLD_H


#include <opencv2/opencv.hpp>
using namespace cv;

enum LocalBinarizationMethods{
BINARIZATION_NIBLACK = 0, //!< Classic Niblack binarization. See @cite Niblack1985 .
BINARIZATION_SAUVOLA = 1, //!< Sauvola's technique. See @cite Sauvola1997 .
BINARIZATION_WOLF = 2, //!< Wolf's technique. See @cite Wolf2004 .
BINARIZATION_NICK = 3 //!< NICK technique. See @cite Khurshid2009 .
};


void niBlackThreshold( InputArray _src, OutputArray _dst, double maxValue,
int type, int blockSize, double k, int binarizationMethod )
{
// Input grayscale image
Mat src = _src.getMat();
CV_Assert(src.channels() == 1);
CV_Assert(blockSize % 2 == 1 && blockSize > 1);
if (binarizationMethod == BINARIZATION_SAUVOLA) {
CV_Assert(src.depth() == CV_8U);
}
type &= THRESH_MASK;
// Compute local threshold (T = mean + k * stddev)
// using mean and standard deviation in the neighborhood of each pixel
// (intermediate calculations are done with floating-point precision)
Mat test;
Mat thresh;
{
// note that: Var[X] = E[X^2] - E[X]^2
Mat mean, sqmean, variance, stddev, sqrtVarianceMeanSum;
double srcMin, stddevMax;
boxFilter(src, mean, CV_32F, Size(blockSize, blockSize),
Point(-1,-1), true, BORDER_REPLICATE);
sqrBoxFilter(src, sqmean, CV_32F, Size(blockSize, blockSize),
Point(-1,-1), true, BORDER_REPLICATE);
variance = sqmean - mean.mul(mean);
sqrt(variance, stddev);
switch (binarizationMethod)
{
case BINARIZATION_NIBLACK:
thresh = mean + stddev * static_cast<float>(k);

break;
case BINARIZATION_SAUVOLA:
thresh = mean.mul(1. + static_cast<float>(k) * (stddev / 128.0 - 1.));
break;
case BINARIZATION_WOLF:
minMaxIdx(src, &srcMin,NULL);
minMaxIdx(stddev, NULL, &stddevMax);
thresh = mean - static_cast<float>(k) * (mean - srcMin - stddev.mul(mean - srcMin) / stddevMax);
break;
case BINARIZATION_NICK:
sqrt(variance + sqmean, sqrtVarianceMeanSum);
thresh = mean + static_cast<float>(k) * sqrtVarianceMeanSum;
break;
default:
CV_Error( CV_StsBadArg, "Unknown binarization method" );
break;
}
thresh.convertTo(thresh, src.depth());

thresh.convertTo(test, src.depth());
//
// cv::imshow("imagex",test);
// cv::waitKey(0);

}
// Prepare output image
_dst.create(src.size(), src.type());
Mat dst = _dst.getMat();
CV_Assert(src.data != dst.data); // no inplace processing
// Apply thresholding: ( pixel > threshold ) ? foreground : background
Mat mask;
switch (type)
{
case THRESH_BINARY: // dst = (src > thresh) ? maxval : 0
case THRESH_BINARY_INV: // dst = (src > thresh) ? 0 : maxval
compare(src, thresh, mask, (type == THRESH_BINARY ? CMP_GT : CMP_LE));
dst.setTo(0);
dst.setTo(maxValue, mask);
break;
case THRESH_TRUNC: // dst = (src > thresh) ? thresh : src
compare(src, thresh, mask, CMP_GT);
src.copyTo(dst);
thresh.copyTo(dst, mask);
break;
case THRESH_TOZERO: // dst = (src > thresh) ? src : 0
case THRESH_TOZERO_INV: // dst = (src > thresh) ? 0 : src
compare(src, thresh, mask, (type == THRESH_TOZERO ? CMP_GT : CMP_LE));
dst.setTo(0);
src.copyTo(dst, mask);
break;
default:
CV_Error( CV_StsBadArg, "Unknown threshold type" );
break;
}
}

#endif //SWIFTPR_NIBLACKTHRESHOLD_H

+ 0
- 19
Prj-PHP/lpr/CNNRecognizer.cpp View File

@@ -1,19 +0,0 @@
//
// Created by 庾金科 on 21/10/2017.
//

#include "CNNRecognizer.h"

namespace pr{
CNNRecognizer::CNNRecognizer(std::string prototxt,std::string caffemodel){
net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);
}

label CNNRecognizer::recognizeCharacter(cv::Mat charImage){
if(charImage.channels()== 3)
cv::cvtColor(charImage,charImage,cv::COLOR_BGR2GRAY);
cv::Mat inputBlob = cv::dnn::blobFromImage(charImage, 1/255.0, cv::Size(CHAR_INPUT_W,CHAR_INPUT_H), cv::Scalar(0,0,0),false);
net.setInput(inputBlob,"data");
return net.forward();
}
}

+ 0
- 108
Prj-PHP/lpr/FastDeskew.cpp View File

@@ -1,108 +0,0 @@
//
// Created by Jack Yu on 02/10/2017.
//



#include "FastDeskew.h"

namespace pr{
const int ANGLE_MIN = 30 ;
const int ANGLE_MAX = 150 ;
const int PLATE_H = 36;
const int PLATE_W = 136;
int angle(float x,float y)
{
return atan2(x,y)*180/3.1415;
}

std::vector<float> avgfilter(std::vector<float> angle_list,int windowsSize) {
std::vector<float> angle_list_filtered(angle_list.size() - windowsSize + 1);
for (int i = 0; i < angle_list.size() - windowsSize + 1; i++) {
float avg = 0.00f;
for (int j = 0; j < windowsSize; j++) {
avg += angle_list[i + j];
}
avg = avg / windowsSize;
angle_list_filtered[i] = avg;
}

return angle_list_filtered;
}


void drawHist(std::vector<float> seq){
cv::Mat image(300,seq.size(),CV_8U);
image.setTo(0);

for(int i = 0;i<seq.size();i++)
{
float l = *std::max_element(seq.begin(),seq.end());

int p = int(float(seq[i])/l*300);

cv::line(image,cv::Point(i,300),cv::Point(i,300-p),cv::Scalar(255,255,255));
}
cv::imshow("vis",image);
}

cv::Mat correctPlateImage(cv::Mat skewPlate,float angle,float maxAngle)
{
cv::Mat dst;
cv::Size size_o(skewPlate.cols,skewPlate.rows);
int extend_padding = 0;
extend_padding = static_cast<int>(skewPlate.rows*tan(cv::abs(angle)/180* 3.14) );
cv::Size size(skewPlate.cols + extend_padding ,skewPlate.rows);
float interval = abs(sin((angle /180) * 3.14)* skewPlate.rows);
cv::Point2f pts1[4] = {cv::Point2f(0,0),cv::Point2f(0,size_o.height),cv::Point2f(size_o.width,0),cv::Point2f(size_o.width,size_o.height)};
if(angle>0) {
cv::Point2f pts2[4] = {cv::Point2f(interval, 0), cv::Point2f(0, size_o.height),
cv::Point2f(size_o.width, 0), cv::Point2f(size_o.width - interval, size_o.height)};
cv::Mat M = cv::getPerspectiveTransform(pts1,pts2);
cv::warpPerspective(skewPlate,dst,M,size);
}
else {
cv::Point2f pts2[4] = {cv::Point2f(0, 0), cv::Point2f(interval, size_o.height), cv::Point2f(size_o.width-interval, 0),
cv::Point2f(size_o.width, size_o.height)};
cv::Mat M = cv::getPerspectiveTransform(pts1,pts2);
cv::warpPerspective(skewPlate,dst,M,size,cv::INTER_CUBIC);
}
return dst;
}
cv::Mat fastdeskew(cv::Mat skewImage,int blockSize){
const int FILTER_WINDOWS_SIZE = 5;
std::vector<float> angle_list(180);
memset(angle_list.data(),0,angle_list.size()*sizeof(int));
cv::Mat bak;
skewImage.copyTo(bak);
if(skewImage.channels() == 3)
cv::cvtColor(skewImage,skewImage,cv::COLOR_RGB2GRAY);
if(skewImage.channels() == 1)
{
cv::Mat eigen;
cv::cornerEigenValsAndVecs(skewImage,eigen,blockSize,5);
for( int j = 0; j < skewImage.rows; j+=blockSize )
{ for( int i = 0; i < skewImage.cols; i+=blockSize )
{
float x2 = eigen.at<cv::Vec6f>(j, i)[4];
float y2 = eigen.at<cv::Vec6f>(j, i)[5];
int angle_cell = angle(x2,y2);
angle_list[(angle_cell + 180)%180]+=1.0;
}
}
}
std::vector<float> filtered = avgfilter(angle_list,5);
int maxPos = std::max_element(filtered.begin(),filtered.end()) - filtered.begin() + FILTER_WINDOWS_SIZE/2;
if(maxPos>ANGLE_MAX)
maxPos = (-maxPos+90+180)%180;
if(maxPos<ANGLE_MIN)
maxPos-=90;
maxPos=90-maxPos;
cv::Mat deskewed = correctPlateImage(bak, static_cast<float>(maxPos),60.0f);
return deskewed;
}



}//namespace pr

+ 0
- 170
Prj-PHP/lpr/FineMapping.cpp View File

@@ -1,170 +0,0 @@
#include "FineMapping.h"
namespace pr{

const int FINEMAPPING_H = 60 ;
const int FINEMAPPING_W = 140;
const int PADDING_UP_DOWN = 30;
void drawRect(cv::Mat image,cv::Rect rect)
{
cv::Point p1(rect.x,rect.y);
cv::Point p2(rect.x+rect.width,rect.y+rect.height);
cv::rectangle(image,p1,p2,cv::Scalar(0,255,0),1);
}


FineMapping::FineMapping(std::string prototxt,std::string caffemodel) {
net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);

}

cv::Mat FineMapping::FineMappingHorizon(cv::Mat FinedVertical,int leftPadding,int rightPadding)
{

// if(FinedVertical.channels()==1)
// cv::cvtColor(FinedVertical,FinedVertical,cv::COLOR_GRAY2BGR);
cv::Mat inputBlob = cv::dnn::blobFromImage(FinedVertical, 1/255.0, cv::Size(66,16),
cv::Scalar(0,0,0),false);

net.setInput(inputBlob,"data");
cv::Mat prob = net.forward();
int front = static_cast<int>(prob.at<float>(0,0)*FinedVertical.cols);
int back = static_cast<int>(prob.at<float>(0,1)*FinedVertical.cols);
front -= leftPadding ;
if(front<0) front = 0;
back +=rightPadding;
if(back>FinedVertical.cols-1) back=FinedVertical.cols - 1;
cv::Mat cropped = FinedVertical.colRange(front,back).clone();
return cropped;


}
std::pair<int,int> FitLineRansac(std::vector<cv::Point> pts,int zeroadd = 0 )
{
std::pair<int,int> res;
if(pts.size()>2)
{
cv::Vec4f line;
cv::fitLine(pts,line,cv::DIST_HUBER,0,0.01,0.01);
float vx = line[0];
float vy = line[1];
float x = line[2];
float y = line[3];
int lefty = static_cast<int>((-x * vy / vx) + y);
int righty = static_cast<int>(((136- x) * vy / vx) + y);
res.first = lefty+PADDING_UP_DOWN+zeroadd;
res.second = righty+PADDING_UP_DOWN+zeroadd;
return res;
}
res.first = zeroadd;
res.second = zeroadd;
return res;
}

cv::Mat FineMapping::FineMappingVertical(cv::Mat InputProposal,int sliceNum,int upper,int lower,int windows_size){
cv::Mat PreInputProposal;
cv::Mat proposal;
cv::resize(InputProposal,PreInputProposal,cv::Size(FINEMAPPING_W,FINEMAPPING_H));
if(InputProposal.channels() == 3)
cv::cvtColor(PreInputProposal,proposal,cv::COLOR_BGR2GRAY);
else
PreInputProposal.copyTo(proposal);
// this will improve some sen
cv::Mat kernal = cv::getStructuringElement(cv::MORPH_ELLIPSE,cv::Size(1,3));
float diff = static_cast<float>(upper-lower);
diff/=static_cast<float>(sliceNum-1);
cv::Mat binary_adaptive;
std::vector<cv::Point> line_upper;
std::vector<cv::Point> line_lower;
int contours_nums=0;
for(int i = 0 ; i < sliceNum ; i++)
{
std::vector<std::vector<cv::Point> > contours;
float k =lower + i*diff;
cv::adaptiveThreshold(proposal,binary_adaptive,255,cv::ADAPTIVE_THRESH_MEAN_C,cv::THRESH_BINARY,windows_size,k);
cv::Mat draw;
binary_adaptive.copyTo(draw);
cv::findContours(binary_adaptive,contours,cv::RETR_EXTERNAL,cv::CHAIN_APPROX_SIMPLE);
for(auto contour: contours)
{
cv::Rect bdbox =cv::boundingRect(contour);
float lwRatio = bdbox.height/static_cast<float>(bdbox.width);
int bdboxAera = bdbox.width*bdbox.height;
if (( lwRatio>0.7&&bdbox.width*bdbox.height>100 && bdboxAera<300)
|| (lwRatio>3.0 && bdboxAera<100 && bdboxAera>10))
{
cv::Point p1(bdbox.x, bdbox.y);
cv::Point p2(bdbox.x + bdbox.width, bdbox.y + bdbox.height);
line_upper.push_back(p1);
line_lower.push_back(p2);
contours_nums+=1;
}
}
}
if(contours_nums<41)
{
cv::bitwise_not(InputProposal,InputProposal);
cv::Mat kernal = cv::getStructuringElement(cv::MORPH_ELLIPSE,cv::Size(1,5));
cv::Mat bak;
cv::resize(InputProposal,bak,cv::Size(FINEMAPPING_W,FINEMAPPING_H));
cv::erode(bak,bak,kernal);
if(InputProposal.channels() == 3)
cv::cvtColor(bak,proposal,cv::COLOR_BGR2GRAY);
else
proposal = bak;
int contours_nums=0;
for(int i = 0 ; i < sliceNum ; i++)
{
std::vector<std::vector<cv::Point> > contours;
float k =lower + i*diff;
cv::adaptiveThreshold(proposal,binary_adaptive,255,cv::ADAPTIVE_THRESH_MEAN_C,cv::THRESH_BINARY,windows_size,k);
cv::Mat draw;
binary_adaptive.copyTo(draw);
cv::findContours(binary_adaptive,contours,cv::RETR_EXTERNAL,cv::CHAIN_APPROX_SIMPLE);
for(auto contour: contours)
{
cv::Rect bdbox =cv::boundingRect(contour);
float lwRatio = bdbox.height/static_cast<float>(bdbox.width);
int bdboxAera = bdbox.width*bdbox.height;
if (( lwRatio>0.7&&bdbox.width*bdbox.height>120 && bdboxAera<300)
|| (lwRatio>3.0 && bdboxAera<100 && bdboxAera>10))
{

cv::Point p1(bdbox.x, bdbox.y);
cv::Point p2(bdbox.x + bdbox.width, bdbox.y + bdbox.height);
line_upper.push_back(p1);
line_lower.push_back(p2);
contours_nums+=1;
}
}
}
}
cv::Mat rgb;
cv::copyMakeBorder(PreInputProposal, rgb, PADDING_UP_DOWN, PADDING_UP_DOWN, 0, 0, cv::BORDER_REPLICATE);
std::pair<int, int> A;
std::pair<int, int> B;
A = FitLineRansac(line_upper, -1);
B = FitLineRansac(line_lower, 1);
int leftyB = A.first;
int rightyB = A.second;
int leftyA = B.first;
int rightyA = B.second;
int cols = rgb.cols;
int rows = rgb.rows;
std::vector<cv::Point2f> corners(4);
corners[0] = cv::Point2f(cols - 1, rightyA);
corners[1] = cv::Point2f(0, leftyA);
corners[2] = cv::Point2f(cols - 1, rightyB);
corners[3] = cv::Point2f(0, leftyB);
std::vector<cv::Point2f> corners_trans(4);
corners_trans[0] = cv::Point2f(136, 36);
corners_trans[1] = cv::Point2f(0, 36);
corners_trans[2] = cv::Point2f(136, 0);
corners_trans[3] = cv::Point2f(0, 0);
cv::Mat transform = cv::getPerspectiveTransform(corners, corners_trans);
cv::Mat quad = cv::Mat::zeros(36, 136, CV_8UC3);
cv::warpPerspective(rgb, quad, transform, quad.size());
return quad;
}
}



+ 0
- 101
Prj-PHP/lpr/Pipeline.cpp View File

@@ -1,101 +0,0 @@
//
// Created by 庾金科 on 23/10/2017.
//

#include "Pipeline.h"


namespace pr {



const int HorizontalPadding = 4;
PipelinePR::PipelinePR(std::string detector_filename,
std::string finemapping_prototxt, std::string finemapping_caffemodel,
std::string segmentation_prototxt, std::string segmentation_caffemodel,
std::string charRecognization_proto, std::string charRecognization_caffemodel,
std::string segmentationfree_proto,std::string segmentationfree_caffemodel) {
plateDetection = new PlateDetection(detector_filename);
fineMapping = new FineMapping(finemapping_prototxt, finemapping_caffemodel);
plateSegmentation = new PlateSegmentation(segmentation_prototxt, segmentation_caffemodel);
generalRecognizer = new CNNRecognizer(charRecognization_proto, charRecognization_caffemodel);
segmentationFreeRecognizer = new SegmentationFreeRecognizer(segmentationfree_proto,segmentationfree_caffemodel);

}

PipelinePR::~PipelinePR() {

delete plateDetection;
delete fineMapping;
delete plateSegmentation;
delete generalRecognizer;
delete segmentationFreeRecognizer;


}

std::vector<PlateInfo> PipelinePR:: RunPiplineAsImage(cv::Mat plateImage,int method) {
std::vector<PlateInfo> results;
std::vector<pr::PlateInfo> plates;
plateDetection->plateDetectionRough(plateImage,plates,36,700);

for (pr::PlateInfo plateinfo:plates) {

cv::Mat image_finemapping = plateinfo.getPlateImage();
image_finemapping = fineMapping->FineMappingVertical(image_finemapping);
image_finemapping = pr::fastdeskew(image_finemapping, 5);



//Segmentation-based

if(method==SEGMENTATION_BASED_METHOD)
{
image_finemapping = fineMapping->FineMappingHorizon(image_finemapping, 2, HorizontalPadding);
cv::resize(image_finemapping, image_finemapping, cv::Size(136+HorizontalPadding, 36));
// cv::imshow("image_finemapping",image_finemapping);
// cv::waitKey(0);
plateinfo.setPlateImage(image_finemapping);
std::vector<cv::Rect> rects;

plateSegmentation->segmentPlatePipline(plateinfo, 1, rects);
plateSegmentation->ExtractRegions(plateinfo, rects);
cv::copyMakeBorder(image_finemapping, image_finemapping, 0, 0, 0, 20, cv::BORDER_REPLICATE);
plateinfo.setPlateImage(image_finemapping);
generalRecognizer->SegmentBasedSequenceRecognition(plateinfo);
plateinfo.decodePlateNormal(pr::CH_PLATE_CODE);

}
//Segmentation-free
else if(method==SEGMENTATION_FREE_METHOD)
{

image_finemapping = fineMapping->FineMappingHorizon(image_finemapping, 4, HorizontalPadding+3);

cv::resize(image_finemapping, image_finemapping, cv::Size(136+HorizontalPadding, 36));
// cv::imwrite("./test.png",image_finemapping);
// cv::imshow("image_finemapping",image_finemapping);
// cv::waitKey(0);
plateinfo.setPlateImage(image_finemapping);
// std::vector<cv::Rect> rects;

std::pair<std::string,float> res = segmentationFreeRecognizer->SegmentationFreeForSinglePlate(plateinfo.getPlateImage(),pr::CH_PLATE_CODE);
plateinfo.confidence = res.second;
plateinfo.setPlateName(res.first);
}



results.push_back(plateinfo);
}

// for (auto str:results) {
// std::cout << str << std::endl;
// }
return results;

}//namespace pr



}

+ 0
- 32
Prj-PHP/lpr/PlateDetection.cpp View File

@@ -1,32 +0,0 @@
#include "PlateDetection.h"
#include "util.h"
namespace pr{
PlateDetection::PlateDetection(std::string filename_cascade){
cascade.load(filename_cascade);

};
void PlateDetection::plateDetectionRough(cv::Mat InputImage,std::vector<pr::PlateInfo> &plateInfos,int min_w,int max_w){
cv::Mat processImage;
cv::cvtColor(InputImage,processImage,cv::COLOR_BGR2GRAY);
std::vector<cv::Rect> platesRegions;
cv::Size minSize(min_w,min_w/4);
cv::Size maxSize(max_w,max_w/4);
cascade.detectMultiScale( processImage, platesRegions,
1.1, 3, cv::CASCADE_SCALE_IMAGE,minSize,maxSize);
for(auto plate:platesRegions)
{
int zeroadd_w = static_cast<int>(plate.width*0.30);
int zeroadd_h = static_cast<int>(plate.height*2);
int zeroadd_x = static_cast<int>(plate.width*0.15);
int zeroadd_y = static_cast<int>(plate.height*1);
plate.x-=zeroadd_x;
plate.y-=zeroadd_y;
plate.height += zeroadd_h;
plate.width += zeroadd_w;
cv::Mat plateImage = util::cropFromImage(InputImage,plate);
PlateInfo plateInfo(plateImage,plate);
plateInfos.push_back(plateInfo);

}
}
}//namespace pr

+ 0
- 404
Prj-PHP/lpr/PlateSegmentation.cpp View File

@@ -1,404 +0,0 @@
//
// Created by 庾金科 on 16/10/2017.
//

#include "PlateSegmentation.h"
#include "niBlackThreshold.h"


//#define DEBUG
namespace pr{

PlateSegmentation::PlateSegmentation(std::string prototxt,std::string caffemodel) {
net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);
}
cv::Mat PlateSegmentation::classifyResponse(const cv::Mat &cropped){
cv::Mat inputBlob = cv::dnn::blobFromImage(cropped, 1/255.0, cv::Size(22,22), cv::Scalar(0,0,0),false);
net.setInput(inputBlob,"data");
return net.forward();
}

void drawHist(float* seq,int size,const char* name){
cv::Mat image(300,size,CV_8U);
image.setTo(0);
float* start =seq;
float* end = seq+size;
float l = *std::max_element(start,end);
for(int i = 0;i<size;i++)
{
int p = int(float(seq[i])/l*300);
cv::line(image,cv::Point(i,300),cv::Point(i,300-p),cv::Scalar(255,255,255));
}
cv::resize(image,image,cv::Size(600,100));
cv::imshow(name,image);
}

inline void computeSafeMargin(int &val,const int &rows){
val = std::min(val,rows);
val = std::max(val,0);
}

cv::Rect boxFromCenter(const cv::Point center,int left,int right,int top,int bottom,cv::Size bdSize)
{
cv::Point p1(center.x - left ,center.y - top);
cv::Point p2( center.x + right, center.y + bottom);
p1.x = std::max(0,p1.x);
p1.y = std::max(0,p1.y);
p2.x = std::min(p2.x,bdSize.width-1);
p2.y = std::min(p2.y,bdSize.height-1);
cv::Rect rect(p1,p2);
return rect;
}

cv::Rect boxPadding(cv::Rect rect,int left,int right,int top,int bottom,cv::Size bdSize)
{

cv::Point center(rect.x+(rect.width>>1),rect.y + (rect.height>>1));
int rebuildLeft = (rect.width>>1 )+ left;
int rebuildRight = (rect.width>>1 )+ right;
int rebuildTop = (rect.height>>1 )+ top;
int rebuildBottom = (rect.height>>1 )+ bottom;
return boxFromCenter(center,rebuildLeft,rebuildRight,rebuildTop,rebuildBottom,bdSize);

}



void PlateSegmentation:: refineRegion(cv::Mat &plateImage,const std::vector<int> &candidatePts,const int padding,std::vector<cv::Rect> &rects){
int w = candidatePts[5] - candidatePts[4];
int cols = plateImage.cols;
int rows = plateImage.rows;
for(int i = 0 ; i < candidatePts.size() ; i++)
{
int left = 0;
int right = 0 ;

if(i == 0 ){
left= candidatePts[i];
right = left+w+padding;
}
else {
left = candidatePts[i] - padding;
right = left + w + padding * 2;
}

computeSafeMargin(right,cols);
computeSafeMargin(left,cols);
cv::Rect roi(left,0,right - left,rows-1);
cv::Mat roiImage;
plateImage(roi).copyTo(roiImage);

if (i>=1)
{

cv::Mat roi_thres;
// cv::threshold(roiImage,roi_thres,0,255,cv::THRESH_OTSU|cv::THRESH_BINARY);

niBlackThreshold(roiImage,roi_thres,255,cv::THRESH_BINARY,15,0.27,BINARIZATION_NIBLACK);

std::vector<std::vector<cv::Point>> contours;
cv::findContours(roi_thres,contours,cv::RETR_LIST,cv::CHAIN_APPROX_SIMPLE);
cv::Point boxCenter(roiImage.cols>>1,roiImage.rows>>1);

cv::Rect final_bdbox;
cv::Point final_center;
int final_dist = INT_MAX;


for(auto contour:contours)
{
cv::Rect bdbox = cv::boundingRect(contour);
cv::Point center(bdbox.x+(bdbox.width>>1),bdbox.y + (bdbox.height>>1));
int dist = (center.x - boxCenter.x)*(center.x - boxCenter.x);
if(dist<final_dist and bdbox.height > rows>>1)
{ final_dist =dist;
final_center = center;
final_bdbox = bdbox;
}
}

//rebuild box
if(final_bdbox.height/ static_cast<float>(final_bdbox.width) > 3.5 && final_bdbox.width*final_bdbox.height<10)
final_bdbox = boxFromCenter(final_center,8,8,(rows>>1)-3 , (rows>>1) - 2,roiImage.size());
else {
if(i == candidatePts.size()-1)
final_bdbox = boxPadding(final_bdbox, padding/2, padding, padding/2, padding/2, roiImage.size());
else
final_bdbox = boxPadding(final_bdbox, padding, padding, padding, padding, roiImage.size());


// std::cout<<final_bdbox<<std::endl;
// std::cout<<roiImage.size()<<std::endl;
#ifdef DEBUG
cv::imshow("char_thres",roi_thres);

cv::imshow("char",roiImage(final_bdbox));
cv::waitKey(0);
#endif


}


final_bdbox.x += left;

rects.push_back(final_bdbox);
//

}
else
{
rects.push_back(roi);
}

// else
// {
//
// }

// cv::GaussianBlur(roiImage,roiImage,cv::Size(7,7),3);
//
// cv::imshow("image",roiImage);
// cv::waitKey(0);


}



}
void avgfilter(float *angle_list,int size,int windowsSize) {
float *filterd = new float[size];
for(int i = 0 ; i < size ; i++) filterd [i] = angle_list[i];
// memcpy(filterd,angle_list,size);

cv::Mat kernal_gaussian = cv::getGaussianKernel(windowsSize,3,CV_32F);
float *kernal = (float*)kernal_gaussian.data;
// kernal+=windowsSize;
int r = windowsSize/2;




for (int i = 0; i < size; i++) {
float avg = 0.00f;
for (int j = 0; j < windowsSize; j++) {
if(i+j-r>0&&i+j+r<size-1)
avg += filterd[i + j-r]*kernal[j];
}
// avg = avg / windowsSize;
angle_list[i] = avg;

}

delete filterd;
}

void PlateSegmentation::templateMatchFinding(const cv::Mat &respones,int windowsWidth,std::pair<float,std::vector<int>> &candidatePts){
int rows = respones.rows;
int cols = respones.cols;



float *data = (float*)respones.data;
float *engNum_prob = data;
float *false_prob = data+cols;
float *ch_prob = data+cols*2;

avgfilter(engNum_prob,cols,5);
avgfilter(false_prob,cols,5);
// avgfilter(ch_prob,cols,5);
std::vector<int> candidate_pts(7);
#ifdef DEBUG
drawHist(engNum_prob,cols,"engNum_prob");
drawHist(false_prob,cols,"false_prob");
drawHist(ch_prob,cols,"ch_prob");
cv::waitKey(0);
#endif




int cp_list[7];
float loss_selected = -10;

for(int start = 0 ; start < 20 ; start+=2)
for(int width = windowsWidth-5; width < windowsWidth+5 ; width++ ){
for(int interval = windowsWidth/2; interval < windowsWidth; interval++)
{
int cp1_ch = start;
int cp2_p0 = cp1_ch+ width;
int cp3_p1 = cp2_p0+ width + interval;
int cp4_p2 = cp3_p1 + width;
int cp5_p3 = cp4_p2 + width+1;
int cp6_p4 = cp5_p3 + width+2;
int cp7_p5= cp6_p4+ width+2;

int md1 = (cp1_ch+cp2_p0)>>1;
int md2 = (cp2_p0+cp3_p1)>>1;
int md3 = (cp3_p1+cp4_p2)>>1;
int md4 = (cp4_p2+cp5_p3)>>1;
int md5 = (cp5_p3+cp6_p4)>>1;
int md6 = (cp6_p4+cp7_p5)>>1;




if(cp7_p5>=cols)
continue;
// float loss = ch_prob[cp1_ch]+
// engNum_prob[cp2_p0] +engNum_prob[cp3_p1]+engNum_prob[cp4_p2]+engNum_prob[cp5_p3]+engNum_prob[cp6_p4] +engNum_prob[cp7_p5]
// + (false_prob[md2]+false_prob[md3]+false_prob[md4]+false_prob[md5]+false_prob[md5] + false_prob[md6]);
float loss = ch_prob[cp1_ch]*3 -(false_prob[cp3_p1]+false_prob[cp4_p2]+false_prob[cp5_p3]+false_prob[cp6_p4]+false_prob[cp7_p5]);

if(loss>loss_selected)
{
loss_selected = loss;
cp_list[0]= cp1_ch;
cp_list[1]= cp2_p0;
cp_list[2]= cp3_p1;
cp_list[3]= cp4_p2;
cp_list[4]= cp5_p3;
cp_list[5]= cp6_p4;
cp_list[6]= cp7_p5;
}
}
}
candidate_pts[0] = cp_list[0];
candidate_pts[1] = cp_list[1];
candidate_pts[2] = cp_list[2];
candidate_pts[3] = cp_list[3];
candidate_pts[4] = cp_list[4];
candidate_pts[5] = cp_list[5];
candidate_pts[6] = cp_list[6];

candidatePts.first = loss_selected;
candidatePts.second = candidate_pts;

};


void PlateSegmentation::segmentPlateBySlidingWindows(cv::Mat &plateImage,int windowsWidth,int stride,cv::Mat &respones){


// cv::resize(plateImage,plateImage,cv::Size(136,36));

cv::Mat plateImageGray;
cv::cvtColor(plateImage,plateImageGray,cv::COLOR_BGR2GRAY);
int padding = plateImage.cols-136 ;
// int padding = 0 ;
int height = plateImage.rows - 1;
int width = plateImage.cols - 1 - padding;
for(int i = 0 ; i < width - windowsWidth +1 ; i +=stride)
{
cv::Rect roi(i,0,windowsWidth,height);
cv::Mat roiImage = plateImageGray(roi);
cv::Mat response = classifyResponse(roiImage);
respones.push_back(response);
}




respones = respones.t();
// std::pair<float,std::vector<int>> images ;
//
//
// std::cout<<images.first<<" ";
// for(int i = 0 ; i < images.second.size() ; i++)
// {
// std::cout<<images.second[i]<<" ";
//// cv::line(plateImageGray,cv::Point(images.second[i],0),cv::Point(images.second[i],36),cv::Scalar(255,255,255),1); //DEBUG
// }

// int w = images.second[5] - images.second[4];

// cv::line(plateImageGray,cv::Point(images.second[5]+w,0),cv::Point(images.second[5]+w,36),cv::Scalar(255,255,255),1); //DEBUG
// cv::line(plateImageGray,cv::Point(images.second[5]+2*w,0),cv::Point(images.second[5]+2*w,36),cv::Scalar(255,255,255),1); //DEBUG


// RefineRegion(plateImageGray,images.second,5);

// std::cout<<w<<std::endl;

// std::cout<<<<std::endl;

// cv::resize(plateImageGray,plateImageGray,cv::Size(600,100));



}

// void filterGaussian(cv::Mat &respones,float sigma){
//
// }


void PlateSegmentation::segmentPlatePipline(PlateInfo &plateInfo,int stride,std::vector<cv::Rect> &Char_rects){
cv::Mat plateImage = plateInfo.getPlateImage(); // get src image .
cv::Mat plateImageGray;
cv::cvtColor(plateImage,plateImageGray,cv::COLOR_BGR2GRAY);
//do binarzation
//
std::pair<float,std::vector<int>> sections ; // segment points variables .

cv::Mat respones; //three response of every sub region from origin image .
segmentPlateBySlidingWindows(plateImage,DEFAULT_WIDTH,1,respones);
templateMatchFinding(respones,DEFAULT_WIDTH/stride,sections);
for(int i = 0; i < sections.second.size() ; i++)
{
sections.second[i]*=stride;

}

// std::cout<<sections<<std::endl;

refineRegion(plateImageGray,sections.second,5,Char_rects);
#ifdef DEBUG
for(int i = 0 ; i < sections.second.size() ; i++)
{
std::cout<<sections.second[i]<<" ";
cv::line(plateImageGray,cv::Point(sections.second[i],0),cv::Point(sections.second[i],36),cv::Scalar(255,255,255),1); //DEBUG
}
cv::imshow("plate",plateImageGray);
cv::waitKey(0);
#endif
// cv::waitKey(0);

}

void PlateSegmentation::ExtractRegions(PlateInfo &plateInfo,std::vector<cv::Rect> &rects){
cv::Mat plateImage = plateInfo.getPlateImage();
for(int i = 0 ; i < rects.size() ; i++){
cv::Mat charImage;
plateImage(rects[i]).copyTo(charImage);
if(charImage.channels())
cv::cvtColor(charImage,charImage,cv::COLOR_BGR2GRAY);
// cv::imshow("image",charImage);
// cv::waitKey(0);
cv::equalizeHist(charImage,charImage);
//

//


std::pair<CharType,cv::Mat> char_instance;
if(i == 0 ){

char_instance.first = CHINESE;


} else if(i == 1){
char_instance.first = LETTER;
}
else{
char_instance.first = LETTER_NUMS;
}
char_instance.second = charImage;
plateInfo.appendPlateChar(char_instance);

}

}

}//namespace pr

+ 0
- 23
Prj-PHP/lpr/Recognizer.cpp View File

@@ -1,23 +0,0 @@
//
// Created by Jack Yu on 22/10/2017.
//

#include "Recognizer.h"

namespace pr{
void GeneralRecognizer::SegmentBasedSequenceRecognition(PlateInfo &plateinfo){
for(auto char_instance:plateinfo.plateChars)
{
std::pair<CharType,cv::Mat> res;
if(char_instance.second.rows*char_instance.second.cols>40) {
label code_table = recognizeCharacter(char_instance.second);
res.first = char_instance.first;
code_table.copyTo(res.second);
plateinfo.appendPlateCoding(res);
} else{
res.first = INVALID;
plateinfo.appendPlateCoding(res);
}
}
}
}

+ 0
- 89
Prj-PHP/lpr/SegmentationFreeRecognizer.cpp View File

@@ -1,89 +0,0 @@
//
// Created by Jack Yu on 28/11/2017.
//
#include "SegmentationFreeRecognizer.h"

namespace pr {
SegmentationFreeRecognizer::SegmentationFreeRecognizer(std::string prototxt, std::string caffemodel) {
net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);
}
inline int judgeCharRange(int id)
{return id<31 || id>63;
}
std::pair<std::string,float> decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table,float thres)
{
cv::MatSize mtsize = code_table.size;
int sequencelength = mtsize[2];
int labellength = mtsize[1];
cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table);
std::string name = "";
std::vector<int> seq(sequencelength);
std::vector<std::pair<int,float>> seq_decode_res;
for(int i = 0 ; i < sequencelength; i++) {
float *fstart = ((float *) (code_table.data) + i * labellength );
int id = std::max_element(fstart,fstart+labellength) - fstart;
seq[i] =id;
}

float sum_confidence = 0;
int plate_lenghth = 0 ;
for(int i = 0 ; i< sequencelength ; i++)
{
if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
{
float *fstart = ((float *) (code_table.data) + i * labellength );
float confidence = *(fstart+seq[i]);
std::pair<int,float> pair_(seq[i],confidence);
seq_decode_res.push_back(pair_);
}
}
int i = 0;
if (seq_decode_res.size()>1 && judgeCharRange(seq_decode_res[0].first) && judgeCharRange(seq_decode_res[1].first))
{
i=2;
int c = seq_decode_res[0].second<seq_decode_res[1].second;
name+=mapping_table[seq_decode_res[c].first];
sum_confidence+=seq_decode_res[c].second;
plate_lenghth++;
}

for(; i < seq_decode_res.size();i++)
{
name+=mapping_table[seq_decode_res[i].first];
sum_confidence +=seq_decode_res[i].second;
plate_lenghth++;
}
std::pair<std::string,float> res;
res.second = sum_confidence/plate_lenghth;
res.first = name;
return res;

}
std::string decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table)
{
cv::MatSize mtsize = code_table.size;
int sequencelength = mtsize[2];
int labellength = mtsize[1];
cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table);
std::string name = "";
std::vector<int> seq(sequencelength);
for(int i = 0 ; i < sequencelength; i++) {
float *fstart = ((float *) (code_table.data) + i * labellength );
int id = std::max_element(fstart,fstart+labellength) - fstart;
seq[i] =id;
}
for(int i = 0 ; i< sequencelength ; i++)
{
if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
name+=mapping_table[seq[i]];
}
return name;
}
std::pair<std::string,float> SegmentationFreeRecognizer::SegmentationFreeForSinglePlate(cv::Mat Image,std::vector<std::string> mapping_table) {
cv::transpose(Image,Image);
cv::Mat inputBlob = cv::dnn::blobFromImage(Image, 1 / 255.0, cv::Size(40,160));
net.setInput(inputBlob, "data");
cv::Mat char_prob_mat = net.forward();
return decodeResults(char_prob_mat,mapping_table,0.00);
}
}

+ 0
- 67
Prj-PHP/lpr/util.h View File

@@ -1,67 +0,0 @@
//
// Created by Jack Yu on 04/04/2017.
//

#include <opencv2/opencv.hpp>
namespace util{
template <class T> void swap ( T& a, T& b )
{
T c(a); a=b; b=c;
}
template <class T> T min(T& a,T& b )
{
return a>b?b:a;
}

cv::Mat cropFromImage(const cv::Mat &image,cv::Rect rect){
int w = image.cols-1;
int h = image.rows-1;
rect.x = std::max(rect.x,0);
rect.y = std::max(rect.y,0);
rect.height = std::min(rect.height,h-rect.y);
rect.width = std::min(rect.width,w-rect.x);
cv::Mat temp(rect.size(), image.type());
cv::Mat cropped;
temp = image(rect);
temp.copyTo(cropped);
return cropped;

}

cv::Mat cropBox2dFromImage(const cv::Mat &image,cv::RotatedRect rect)
{
cv::Mat M, rotated, cropped;
float angle = rect.angle;
cv::Size rect_size(rect.size.width,rect.size.height);
if (rect.angle < -45.) {
angle += 90.0;
swap(rect_size.width, rect_size.height);
}
M = cv::getRotationMatrix2D(rect.center, angle, 1.0);
cv::warpAffine(image, rotated, M, image.size(), cv::INTER_CUBIC);
cv::getRectSubPix(rotated, rect_size, rect.center, cropped);
return cropped;
}

cv::Mat calcHist(const cv::Mat &image)
{
cv::Mat hsv;
std::vector<cv::Mat> hsv_planes;
cv::cvtColor(image,hsv,cv::COLOR_BGR2HSV);
cv::split(hsv,hsv_planes);
cv::Mat hist;
int histSize = 256;
float range[] = {0,255};
const float* histRange = {range};
cv::calcHist( &hsv_planes[0], 1, 0, cv::Mat(), hist, 1, &histSize, &histRange,true, true);
return hist;
}
float computeSimilir(const cv::Mat &A,const cv::Mat &B)
{
cv::Mat histA,histB;
histA = calcHist(A);
histB = calcHist(B);
return cv::compareHist(histA,histB,CV_COMP_CORREL);
}
}//namespace util

+ 0
- 107
Prj-PHP/main.cpp View File

@@ -1,107 +0,0 @@
//
// Created by Coleflowers on 20/06/2018.
// Updated by Justid on 02/07/2018.
//
#include <phpcpp.h>
#include <iostream>

#include "PlateSegmentation.h"
#include "CNNRecognizer.h"
#include "Recognizer.h"
#include "PlateDetection.h"
#include "FastDeskew.h"
#include "FineMapping.h"
#include "Pipeline.h"

/* 关闭原opencv报错输出 */
int handleError( int status, const char* func_name,
const char* err_msg, const char* file_name,
int line, void* userdata )
{
//Do nothing -- will suppress console output
return 0; //Return value is not used
}

/**
* 车牌图片识别
* @params imgpath 图片的绝对路径
* @params modelpath 识别模型所在文件夹路径
* @params confidence 可信度要求,可选参数,默认值0.75
* @return 车牌号 图片路径的图片不存在的话 返回空值
*/
cv::String scan(std::string imgpath, std::string modelpath, double confidence){
cv::redirectError(handleError);
try {
pr::PipelinePR prc(modelpath+"/cascade.xml",
modelpath+"/HorizonalFinemapping.prototxt",modelpath+"/HorizonalFinemapping.caffemodel",
modelpath+"/Segmentation.prototxt",modelpath+"/Segmentation.caffemodel",
modelpath+"/CharacterRecognization.prototxt",modelpath+"/CharacterRecognization.caffemodel",
modelpath+"/SegmentationFree.prototxt",modelpath+"/SegmentationFree.caffemodel"
);
cv::Mat image = cv::imread(imgpath);
std::vector<pr::PlateInfo> res = prc.RunPiplineAsImage(image,pr::SEGMENTATION_FREE_METHOD);

cv::String platenum = "";
for(auto st:res) {
if(st.confidence>confidence) {
platenum = st.getPlateName();
break;
}
}

return platenum;
}
catch( cv::Exception& e )
{
const char* err_msg = e.what();
throw Php::Exception(err_msg);
}

}


Php::Value funcWrapper(Php::Parameters &params) {
// 图片路径
std::string img = params[0];
// 模型路径(文件夹)
std::string model = params[1];
// 可信度要求
double confidence = 0.75;

if (params.size() == 3){
confidence = (double)params[2];
}

cv::String res = scan(img, model, confidence);
return res.c_str();
}


/**
* tell the compiler that the get_module is a pure C function
*/
extern "C" {
/**
* Function that is called by PHP right after the PHP process
* has started, and that returns an address of an internal PHP
* strucure with all the details and features of your extension
*
* @return void* a pointer to an address that is understood by PHP
*/
PHPCPP_EXPORT void *get_module() {
// static(!) Php::Extension object that should stay in memory
// for the entire duration of the process (that's why it's static)
static Php::Extension extension("platescan", "1.0");
// @todo add your own functions, classes, namespaces to the extension
extension.add<funcWrapper>("platescan", {
Php::ByVal("imgpath", Php::Type::String, true),
Php::ByVal("modelpath", Php::Type::String, true),
Php::ByVal("confidence", Php::Type::Float, false)
});
// return the extension
return extension;
}
}

+ 0
- 2
Prj-PHP/platescan.ini View File

@@ -1,2 +0,0 @@
extension=platescan.so


BIN
Prj-PHP/tests/demo.png View File

Before After
Width: 720  |  Height: 682  |  Size: 830 kB

+ 0
- 21
Prj-PHP/tests/model/README.md View File

@@ -1,21 +0,0 @@
将/Prj-Linux/lpr/model目录下的

cascade.xml

CharacterRecognization.caffemodel

CharacterRecognization.prototxt

HorizonalFinemapping.caffemodel

HorizonalFinemapping.prototxt

SegmenationFree-Inception.caffemodel

SegmenationFree-Inception.prototxt

Segmentation.caffemodel

Segmentation.prototxt

放置在该目录

+ 0
- 13
Prj-PHP/tests/platescan.php View File

@@ -1,13 +0,0 @@
<?php
//
// Created by Coleflowers on 20/06/2018.
// Updated by JustID on 03/07/2018.
//

/**
* 车牌识别PHP扩展程序测试
*/
$res = platescan(realpath("demo.png"),realpath("model"),0.8);
var_dump($res);

?>

BIN
Prj-Win/.vs/Prj-Win/v14/.suo View File


BIN
model/ocr_plate_all_gru.h5 → Prj-Win/Prj-Win.VC.db View File


+ 10
- 17
Prj-Win/Prj-Win/Prj-Win.vcxproj View File

@@ -34,7 +34,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v140_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
@@ -82,6 +82,8 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<IncludePath>D:\opencv-3.4.2\build\install\include\opencv2;D:\opencv-3.4.2\build\install\include;$(IncludePath)</IncludePath>
<LibraryPath>D:\opencv-3.4.2\build\install\x86\vc14\lib;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
@@ -131,6 +133,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>opencv_aruco342.lib;opencv_aruco342d.lib;opencv_bgsegm342.lib;opencv_bgsegm342d.lib;opencv_bioinspired342.lib;opencv_bioinspired342d.lib;opencv_calib3d342.lib;opencv_calib3d342d.lib;opencv_ccalib342.lib;opencv_ccalib342d.lib;opencv_core342.lib;opencv_core342d.lib;opencv_datasets342.lib;opencv_datasets342d.lib;opencv_dnn342.lib;opencv_dnn342d.lib;opencv_dnn_objdetect342.lib;opencv_dnn_objdetect342d.lib;opencv_dpm342.lib;opencv_dpm342d.lib;opencv_face342.lib;opencv_face342d.lib;opencv_features2d342.lib;opencv_features2d342d.lib;opencv_flann342.lib;opencv_flann342d.lib;opencv_fuzzy342.lib;opencv_fuzzy342d.lib;opencv_hfs342.lib;opencv_hfs342d.lib;opencv_highgui342.lib;opencv_highgui342d.lib;opencv_imgcodecs342.lib;opencv_imgcodecs342d.lib;opencv_imgproc342.lib;opencv_imgproc342d.lib;opencv_img_hash342.lib;opencv_img_hash342d.lib;opencv_line_descriptor342.lib;opencv_line_descriptor342d.lib;opencv_ml342.lib;opencv_ml342d.lib;opencv_objdetect342.lib;opencv_objdetect342d.lib;opencv_optflow342.lib;opencv_optflow342d.lib;opencv_phase_unwrapping342.lib;opencv_phase_unwrapping342d.lib;opencv_photo342.lib;opencv_photo342d.lib;opencv_plot342.lib;opencv_plot342d.lib;opencv_reg342.lib;opencv_reg342d.lib;opencv_rgbd342.lib;opencv_rgbd342d.lib;opencv_saliency342.lib;opencv_saliency342d.lib;opencv_shape342.lib;opencv_shape342d.lib;opencv_stereo342.lib;opencv_stereo342d.lib;opencv_stitching342.lib;opencv_stitching342d.lib;opencv_structured_light342.lib;opencv_structured_light342d.lib;opencv_superres342.lib;opencv_superres342d.lib;opencv_surface_matching342.lib;opencv_surface_matching342d.lib;opencv_text342.lib;opencv_text342d.lib;opencv_tracking342.lib;opencv_tracking342d.lib;opencv_video342.lib;opencv_video342d.lib;opencv_videoio342.lib;opencv_videoio342d.lib;opencv_videostab342.lib;opencv_videostab342d.lib;opencv_xfeatures2d342.lib;opencv_xfeatures2d342d.lib;opencv_ximgproc342.lib;opencv_ximgproc342d.lib;opencv_xobjdetect342.lib;opencv_xobjdetect342d.lib;opencv_xphoto342.lib;opencv_xphoto342d.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -152,28 +155,18 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="..\lpr\include\CNNRecognizer.h" />
<ClInclude Include="..\lpr\include\FastDeskew.h" />
<ClInclude Include="..\lpr\include\FineMapping.h" />
<ClInclude Include="..\lpr\include\niBlackThreshold.h" />
<ClInclude Include="..\lpr\include\Finetune.h" />
<ClInclude Include="..\lpr\include\Pipeline.h" />
<ClInclude Include="..\lpr\include\PlateDetection.h" />
<ClInclude Include="..\lpr\include\Platedetect.h" />
<ClInclude Include="..\lpr\include\PlateInfo.h" />
<ClInclude Include="..\lpr\include\PlateSegmentation.h" />
<ClInclude Include="..\lpr\include\Recognizer.h" />
<ClInclude Include="..\lpr\include\SegmentationFreeRecognizer.h" />
<ClInclude Include="..\lpr\src\util.h" />
<ClInclude Include="..\lpr\include\PlateRecognation.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\lpr\src\CNNRecognizer.cpp" />
<ClCompile Include="..\lpr\src\FastDeskew.cpp" />
<ClCompile Include="..\lpr\src\FineMapping.cpp" />
<ClCompile Include="..\lpr\src\FineTune.cpp" />
<ClCompile Include="..\lpr\src\Pipeline.cpp" />
<ClCompile Include="..\lpr\src\PlateDetection.cpp" />
<ClCompile Include="..\lpr\src\PlateSegmentation.cpp" />
<ClCompile Include="..\lpr\src\Recognizer.cpp" />
<ClCompile Include="..\lpr\src\SegmentationFreeRecognizer.cpp" />
<ClCompile Include="..\lpr\tests\test_pipeline.cpp" />
<ClCompile Include="..\lpr\src\PlateRecognation.cpp" />
<ClCompile Include="..\lpr\tests\testPipeLine.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">


+ 7
- 37
Prj-Win/Prj-Win/Prj-Win.vcxproj.filters View File

@@ -18,67 +18,37 @@
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\lpr\include\CNNRecognizer.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="..\lpr\include\FastDeskew.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="..\lpr\include\FineMapping.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="..\lpr\include\niBlackThreshold.h">
<ClInclude Include="..\lpr\include\Finetune.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="..\lpr\include\Pipeline.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="..\lpr\include\PlateDetection.h">
<ClInclude Include="..\lpr\include\Platedetect.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="..\lpr\include\PlateInfo.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="..\lpr\include\PlateSegmentation.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="..\lpr\include\Recognizer.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="..\lpr\src\util.h">
<Filter>源文件</Filter>
</ClInclude>
<ClInclude Include="..\lpr\include\SegmentationFreeRecognizer.h">
<ClInclude Include="..\lpr\include\PlateRecognation.h">
<Filter>头文件</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\lpr\src\CNNRecognizer.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="..\lpr\src\FastDeskew.cpp">
<ClCompile Include="..\lpr\src\FineTune.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="..\lpr\src\FineMapping.cpp">
<ClCompile Include="..\lpr\src\Pipeline.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="..\lpr\src\PlateDetection.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="..\lpr\src\PlateSegmentation.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="..\lpr\src\Recognizer.cpp">
<ClCompile Include="..\lpr\src\PlateRecognation.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="..\lpr\tests\test_pipeline.cpp">
<ClCompile Include="..\lpr\tests\testPipeLine.cpp">
<Filter>源文件\test</Filter>
</ClCompile>
<ClCompile Include="..\lpr\src\Pipeline.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="..\lpr\src\SegmentationFreeRecognizer.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
</Project>

+ 16
- 0
Prj-Win/Prj-Win/Release/Prj-Win.Build.CppClean.log View File

@@ -0,0 +1,16 @@
e:\jdkj\hyperlpr\prj-win\prj-win\release\vc140.pdb
e:\jdkj\hyperlpr\prj-win\prj-win\release\testpipeline.obj
e:\jdkj\hyperlpr\prj-win\prj-win\release\platerecognation.obj
e:\jdkj\hyperlpr\prj-win\prj-win\release\platedetection.obj
e:\jdkj\hyperlpr\prj-win\prj-win\release\pipeline.obj
e:\jdkj\hyperlpr\prj-win\prj-win\release\finetune.obj
e:\jdkj\hyperlpr\prj-win\release\prj-win.exe
e:\jdkj\hyperlpr\prj-win\release\prj-win.ipdb
e:\jdkj\hyperlpr\prj-win\release\prj-win.iobj
e:\jdkj\hyperlpr\prj-win\release\prj-win.pdb
e:\jdkj\hyperlpr\prj-win\prj-win\release\prj-win.tlog\cl.command.1.tlog
e:\jdkj\hyperlpr\prj-win\prj-win\release\prj-win.tlog\cl.read.1.tlog
e:\jdkj\hyperlpr\prj-win\prj-win\release\prj-win.tlog\cl.write.1.tlog
e:\jdkj\hyperlpr\prj-win\prj-win\release\prj-win.tlog\link.command.1.tlog
e:\jdkj\hyperlpr\prj-win\prj-win\release\prj-win.tlog\link.read.1.tlog
e:\jdkj\hyperlpr\prj-win\prj-win\release\prj-win.tlog\link.write.1.tlog

+ 1
- 0
Prj-Win/Prj-Win/Release/Prj-Win.log View File

@@ -0,0 +1 @@


+ 1
- 0
Prj-Win/Prj-Win/x64/Debug/Prj-Win.log View File

@@ -0,0 +1 @@
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.Cpp.Platform.targets(57,5): error MSB8020: The build tools for v141 (Platform Toolset = 'v141') cannot be found. To build using the v141 build tools, please install v141 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".

+ 0
- 24
Prj-Win/lpr/include/CNNRecognizer.h View File

@@ -1,24 +0,0 @@
//
// Created by Jack Yu on 21/10/2017.
//

#ifndef SWIFTPR_CNNRECOGNIZER_H
#define SWIFTPR_CNNRECOGNIZER_H

#include "Recognizer.h"
namespace pr{
class CNNRecognizer: public GeneralRecognizer{
public:
const int CHAR_INPUT_W = 14;
const int CHAR_INPUT_H = 30;

CNNRecognizer(std::string prototxt,std::string caffemodel);
label recognizeCharacter(cv::Mat character);
private:
cv::dnn::Net net;

};

}

#endif //SWIFTPR_CNNRECOGNIZER_H

+ 0
- 18
Prj-Win/lpr/include/FastDeskew.h View File

@@ -1,18 +0,0 @@
//
// Created by 庾金科 on 22/09/2017.
//

#ifndef SWIFTPR_FASTDESKEW_H
#define SWIFTPR_FASTDESKEW_H

#include <math.h>
#include <opencv2/opencv.hpp>
namespace pr{

cv::Mat fastdeskew(cv::Mat skewImage,int blockSize);
// cv::Mat spatialTransformer(cv::Mat skewImage);

}//namepace pr


#endif //SWIFTPR_FASTDESKEW_H

+ 0
- 32
Prj-Win/lpr/include/FineMapping.h View File

@@ -1,32 +0,0 @@
//
// Created by 庾金科 on 22/09/2017.
//

#ifndef SWIFTPR_FINEMAPPING_H
#define SWIFTPR_FINEMAPPING_H

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>

#include <string>
namespace pr{
class FineMapping{
public:
FineMapping();


FineMapping(std::string prototxt,std::string caffemodel);
static cv::Mat FineMappingVertical(cv::Mat InputProposal,int sliceNum=15,int upper=0,int lower=-50,int windows_size=17);
cv::Mat FineMappingHorizon(cv::Mat FinedVertical,int leftPadding,int rightPadding);


private:
cv::dnn::Net net;

};




}
#endif //SWIFTPR_FINEMAPPING_H

+ 18
- 0
Prj-Win/lpr/include/Finetune.h View File

@@ -0,0 +1,18 @@
#ifndef _FINETUNE_H_
#define _FINETUNE_H_
#include<vector>
#include<opencv2\dnn.hpp>
#include<opencv.hpp>
namespace pr {
class FineTune {
public:

FineTune(std::string finetune_prototxt, std::string finetune_caffemodel);
void Finetune(cv::Mat img, cv::Mat &resImg);
void to_refine(cv::Mat img, std::vector<cv::Point> pts, cv::Mat &out);
void affine_crop(cv::Mat img, std::vector<cv::Point> pts, cv::Mat &out);
private:
cv::dnn::Net FTNet;
};
}//namespace pr
#endif // !_FINETUNE_H_

+ 39
- 59
Prj-Win/lpr/include/Pipeline.h View File

@@ -1,60 +1,40 @@
//
// Created by â×½ð¿Æ on 22/10/2017.
//

#ifndef SWIFTPR_PIPLINE_H
#define SWIFTPR_PIPLINE_H

#include "PlateDetection.h"
#include "PlateSegmentation.h"
#include "CNNRecognizer.h"
#include "PlateInfo.h"
#include "FastDeskew.h"
#include "FineMapping.h"
#include "Recognizer.h"
#include "SegmentationFreeRecognizer.h"

namespace pr{

const std::vector<std::string> CH_PLATE_CODE{"¾©", "»¦", "½ò", "Óå", "¼½", "½ú", "ÃÉ", "ÁÉ", "¼ª", "ºÚ", "ËÕ", "Õã", "Íî", "Ãö", "¸Ó", "³", "Ô¥", "¶õ", "Ïæ", "ÔÁ", "¹ð",
"Çí", "´¨", "¹ó", "ÔÆ", "²Ø", "ÉÂ", "¸Ê", "Çà", "Äþ", "ÐÂ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
"B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
"Y", "Z","¸Û","ѧ","ʹ","¾¯","°Ä","¹Ò","¾ü","±±","ÄÏ","¹ã","Éò","À¼","³É","¼Ã","º£","Ãñ","º½","¿Õ"};



const int SEGMENTATION_FREE_METHOD = 0;
const int SEGMENTATION_BASED_METHOD = 1;

class PipelinePR{
public:
GeneralRecognizer *generalRecognizer;
PlateDetection *plateDetection;
PlateSegmentation *plateSegmentation;
FineMapping *fineMapping;
SegmentationFreeRecognizer *segmentationFreeRecognizer;

PipelinePR(std::string detector_filename,
std::string finemapping_prototxt,std::string finemapping_caffemodel,
std::string segmentation_prototxt,std::string segmentation_caffemodel,
std::string charRecognization_proto,std::string charRecognization_caffemodel,
std::string segmentationfree_proto,std::string segmentationfree_caffemodel
);
~PipelinePR();



std::vector<std::string> plateRes;
std::vector<PlateInfo> RunPiplineAsImage(cv::Mat plateImage,int method);







};


#pragma warning(disable:4430)
#ifndef _PIPLINE_H
#define _PIPLINE_H
#include <vector>
#include "Finetune.h"
#include "Platedetect.h"
#include "PlateRecognation.h"
//#include "PlateColor.h"
using namespace std;
using namespace cv;
namespace pr
{
const std::vector<std::string> CH_PLATE_CODE{ "京", "沪", "津", "�", "冀", "晋", "蒙", "辽", "�", "黑", "�", "浙", "皖", "闽", "赣", "�", "豫", "鄂", "湘", "粤", "桂",
"�", "�", "贵", "云", "�", "陕", "甘", "�", "�", "新", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
"B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
"Y", "Z","港","学","使","警","澳","挂","军","北","�","广","沈","兰","�","济","海","民","航","空" };


class PipelinePR {

public:
PlateDetection *platedetection;
FineTune *finetune;
PlateRecognation *platerecognation;
DBDetection *dbdetection;


PipelinePR(std::string detect_prototxt, std::string detect_caffemodel,
std::string finetune_prototxt, std::string finetune_caffemodel,
std::string platerec_prototxt, std::string platerec_caffemodel,
std::string dbstring);
~PipelinePR();

std::vector<std::string> plateRes;
std::vector<PlateInfo> RunPiplineAsImage(cv::Mat srcImage,int IsDB);

};
}
#endif //SWIFTPR_PIPLINE_H
#endif // !SWIFTPR_PIPLINE_H

+ 0
- 33
Prj-Win/lpr/include/PlateDetection.h View File

@@ -1,33 +0,0 @@
//
// Created by 庾金科 on 20/09/2017.
//

#ifndef SWIFTPR_PLATEDETECTION_H
#define SWIFTPR_PLATEDETECTION_H

#include <opencv2/opencv.hpp>
#include <PlateInfo.h>
#include <vector>
namespace pr{
class PlateDetection{
public:
PlateDetection(std::string filename_cascade);
PlateDetection();
void LoadModel(std::string filename_cascade);
void plateDetectionRough(cv::Mat InputImage,std::vector<pr::PlateInfo> &plateInfos,int min_w=36,int max_w=800);
// std::vector<pr::PlateInfo> plateDetectionRough(cv::Mat InputImage,int min_w= 60,int max_h = 400);


// std::vector<pr::PlateInfo> plateDetectionRoughByMultiScaleEdge(cv::Mat InputImage);



private:
cv::CascadeClassifier cascade;


};

}// namespace pr

#endif //SWIFTPR_PLATEDETECTION_H

+ 5
- 5
Prj-Win/lpr/include/PlateInfo.h View File

@@ -1,7 +1,3 @@
//
// Created by 庾金科 on 20/09/2017.
//

#ifndef SWIFTPR_PLATEINFO_H
#define SWIFTPR_PLATEINFO_H
#include <opencv2/opencv.hpp>
@@ -62,7 +58,11 @@ namespace pr {
int getPlateType() {
return Type;
}

int setPlateType(PlateColor platetype)
{
Type = platetype;
return 0;
}
void appendPlateChar(const std::pair<CharType,cv::Mat> &plateChar)
{
plateChars.push_back(plateChar);


+ 15
- 0
Prj-Win/lpr/include/PlateRecognation.h View File

@@ -0,0 +1,15 @@
#ifndef _PLATERECOGNATION_H_
#define _PLATERECOGNATION_H_
#include <opencv2\dnn.hpp>
#include "PlateInfo.h"
namespace pr {
class PlateRecognation {
public:
PlateRecognation(std::string Rec_prototxt, std::string Rec_cafffemodel);
void segmentation_free_recognation(cv::Mat src, pr::PlateInfo &plateinfo);
private:
cv::dnn::Net RecNet;
};
}//namespace pr
#endif // !_PLATERECOGNATION_H_


+ 0
- 35
Prj-Win/lpr/include/PlateSegmentation.h View File

@@ -1,35 +0,0 @@
#ifndef SWIFTPR_PLATESEGMENTATION_H
#define SWIFTPR_PLATESEGMENTATION_H

#include "opencv2/opencv.hpp"
#include <opencv2/dnn.hpp>
#include "PlateInfo.h"

namespace pr{


class PlateSegmentation{
public:
const int PLATE_NORMAL = 6;
const int PLATE_NORMAL_GREEN = 7;
const int DEFAULT_WIDTH = 20;
PlateSegmentation(std::string phototxt,std::string caffemodel);
PlateSegmentation(){}
void segmentPlatePipline(PlateInfo &plateInfo,int stride,std::vector<cv::Rect> &Char_rects);

void segmentPlateBySlidingWindows(cv::Mat &plateImage,int windowsWidth,int stride,cv::Mat &respones);
void templateMatchFinding(const cv::Mat &respones,int windowsWidth,std::pair<float,std::vector<int>> &candidatePts);
void refineRegion(cv::Mat &plateImage,const std::vector<int> &candidatePts,const int padding,std::vector<cv::Rect> &rects);
void ExtractRegions(PlateInfo &plateInfo,std::vector<cv::Rect> &rects);
cv::Mat classifyResponse(const cv::Mat &cropped);
private:
cv::dnn::Net net;


// RefineRegion()

};

}//namespace pr

#endif //SWIFTPR_PLATESEGMENTATION_H

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save