Browse Source

'初始提交'

fetches/jiege0525_admin/master
songer 6 years ago
parent
commit
d4437e40f4
100 changed files with 18883 additions and 0 deletions
  1. +28
    -0
      .classpath
  2. +58
    -0
      .project
  3. +12
    -0
      .settings/.jsdtscope
  4. +2
    -0
      .settings/com.genuitec.eclipse.j2eedt.core.prefs
  5. +6
    -0
      .settings/org.eclipse.core.resources.prefs
  6. +99
    -0
      .settings/org.eclipse.jdt.core.prefs
  7. +4
    -0
      .settings/org.eclipse.m2e.core.prefs
  8. +10
    -0
      .settings/org.eclipse.wst.common.component
  9. +8
    -0
      .settings/org.eclipse.wst.common.project.facet.core.xml
  10. +1
    -0
      .settings/org.eclipse.wst.jsdt.ui.superType.container
  11. +1
    -0
      .settings/org.eclipse.wst.jsdt.ui.superType.name
  12. +2
    -0
      .settings/org.eclipse.wst.validation.prefs
  13. +225
    -0
      pom.xml
  14. +4
    -0
      readme
  15. +753
    -0
      src/main/java/com/acts/opencv/base/BaseMethodController.java
  16. +277
    -0
      src/main/java/com/acts/opencv/base/CardController.java
  17. +447
    -0
      src/main/java/com/acts/opencv/base/CardPlusController.java
  18. +241
    -0
      src/main/java/com/acts/opencv/base/PageController.java
  19. +174
    -0
      src/main/java/com/acts/opencv/base/RealTestController.java
  20. +279
    -0
      src/main/java/com/acts/opencv/base/RectificationController.java
  21. +50
    -0
      src/main/java/com/acts/opencv/common/mapper/BeanMapper.java
  22. +164
    -0
      src/main/java/com/acts/opencv/common/mapper/JaxbMapper.java
  23. +302
    -0
      src/main/java/com/acts/opencv/common/mapper/JsonMapper.java
  24. +30
    -0
      src/main/java/com/acts/opencv/common/mapper/adapters/MapAdapter.java
  25. +63
    -0
      src/main/java/com/acts/opencv/common/mapper/adapters/MapConvertor.java
  26. +202
    -0
      src/main/java/com/acts/opencv/common/utils/CommonUtil.java
  27. +65
    -0
      src/main/java/com/acts/opencv/common/utils/Constants.java
  28. +67
    -0
      src/main/java/com/acts/opencv/common/utils/Exceptions.java
  29. +142
    -0
      src/main/java/com/acts/opencv/common/utils/OpenCVUtil.java
  30. +57
    -0
      src/main/java/com/acts/opencv/common/utils/RectComp.java
  31. +301
    -0
      src/main/java/com/acts/opencv/common/utils/Reflections.java
  32. +150
    -0
      src/main/java/com/acts/opencv/common/web/BaseController.java
  33. +67
    -0
      src/main/java/com/acts/opencv/demo/DemoController.java
  34. BIN
      src/main/resources/WEB-INF/lib/opencv-2413.jar
  35. BIN
      src/main/resources/WEB-INF/lib/x64/opencv_java2413.dll
  36. BIN
      src/main/resources/WEB-INF/lib/x86/opencv_java2413.dll
  37. +22
    -0
      src/main/resources/config.properties
  38. +19
    -0
      src/main/resources/database.properties
  39. +1505
    -0
      src/main/resources/lbpcascade_frontalface.xml
  40. +138
    -0
      src/main/resources/logback.xml
  41. +9
    -0
      src/main/resources/redis.properties
  42. +140
    -0
      src/main/resources/spring-context.xml
  43. +69
    -0
      src/main/resources/spring-mvc.xml
  44. BIN
      src/main/resources/tessdata/chi_sim.traineddata
  45. BIN
      src/main/resources/tessdata/eng.traineddata
  46. BIN
      src/main/resources/tessdata/normal.traineddata
  47. BIN
      src/main/resources/tessdata/num.traineddata
  48. +42
    -0
      src/main/webapp/WEB-INF/tags/header.tag
  49. +51
    -0
      src/main/webapp/WEB-INF/web.xml
  50. +221
    -0
      src/main/webapp/index.jsp
  51. +23
    -0
      src/main/webapp/main.jsp
  52. +19
    -0
      src/main/webapp/module/execute.jsp
  53. +10
    -0
      src/main/webapp/module/include/common.jsp
  54. +4
    -0
      src/main/webapp/statics/bower_components/font-awesome/css/font-awesome.min.css
  55. BIN
      src/main/webapp/statics/bower_components/font-awesome/fonts/FontAwesome.otf
  56. BIN
      src/main/webapp/statics/bower_components/font-awesome/fonts/fontawesome-webfont.eot
  57. +2671
    -0
      src/main/webapp/statics/bower_components/font-awesome/fonts/fontawesome-webfont.svg
  58. BIN
      src/main/webapp/statics/bower_components/font-awesome/fonts/fontawesome-webfont.ttf
  59. BIN
      src/main/webapp/statics/bower_components/font-awesome/fonts/fontawesome-webfont.woff
  60. BIN
      src/main/webapp/statics/bower_components/font-awesome/fonts/fontawesome-webfont.woff2
  61. +7
    -0
      src/main/webapp/statics/css/AdminLTE.min.css
  62. +760
    -0
      src/main/webapp/statics/css/alt/AdminLTE-bootstrap-social.css
  63. +1
    -0
      src/main/webapp/statics/css/alt/AdminLTE-bootstrap-social.min.css
  64. +93
    -0
      src/main/webapp/statics/css/alt/AdminLTE-fullcalendar.css
  65. +1
    -0
      src/main/webapp/statics/css/alt/AdminLTE-fullcalendar.min.css
  66. +100
    -0
      src/main/webapp/statics/css/alt/AdminLTE-select2.css
  67. +1
    -0
      src/main/webapp/statics/css/alt/AdminLTE-select2.min.css
  68. +4002
    -0
      src/main/webapp/statics/css/alt/AdminLTE-without-plugins.css
  69. +7
    -0
      src/main/webapp/statics/css/alt/AdminLTE-without-plugins.min.css
  70. +6
    -0
      src/main/webapp/statics/css/bootstrap.min.css
  71. +2
    -0
      src/main/webapp/statics/css/common.css
  72. +11
    -0
      src/main/webapp/statics/css/ionicons.min.css
  73. +1781
    -0
      src/main/webapp/statics/css/skins/_all-skins.css
  74. +1
    -0
      src/main/webapp/statics/css/skins/_all-skins.min.css
  75. +171
    -0
      src/main/webapp/statics/css/skins/skin-black-light.css
  76. +1
    -0
      src/main/webapp/statics/css/skins/skin-black-light.min.css
  77. +161
    -0
      src/main/webapp/statics/css/skins/skin-black.css
  78. +1
    -0
      src/main/webapp/statics/css/skins/skin-black.min.css
  79. +163
    -0
      src/main/webapp/statics/css/skins/skin-blue-light.css
  80. +1
    -0
      src/main/webapp/statics/css/skins/skin-blue-light.min.css
  81. +142
    -0
      src/main/webapp/statics/css/skins/skin-blue.css
  82. +1
    -0
      src/main/webapp/statics/css/skins/skin-blue.min.css
  83. +152
    -0
      src/main/webapp/statics/css/skins/skin-green-light.css
  84. +1
    -0
      src/main/webapp/statics/css/skins/skin-green-light.min.css
  85. +134
    -0
      src/main/webapp/statics/css/skins/skin-green.css
  86. +1
    -0
      src/main/webapp/statics/css/skins/skin-green.min.css
  87. +152
    -0
      src/main/webapp/statics/css/skins/skin-purple-light.css
  88. +1
    -0
      src/main/webapp/statics/css/skins/skin-purple-light.min.css
  89. +134
    -0
      src/main/webapp/statics/css/skins/skin-purple.css
  90. +1
    -0
      src/main/webapp/statics/css/skins/skin-purple.min.css
  91. +152
    -0
      src/main/webapp/statics/css/skins/skin-red-light.css
  92. +1
    -0
      src/main/webapp/statics/css/skins/skin-red-light.min.css
  93. +134
    -0
      src/main/webapp/statics/css/skins/skin-red.css
  94. +1
    -0
      src/main/webapp/statics/css/skins/skin-red.min.css
  95. +152
    -0
      src/main/webapp/statics/css/skins/skin-yellow-light.css
  96. +1
    -0
      src/main/webapp/statics/css/skins/skin-yellow-light.min.css
  97. +134
    -0
      src/main/webapp/statics/css/skins/skin-yellow.css
  98. +1
    -0
      src/main/webapp/statics/css/skins/skin-yellow.min.css
  99. +1083
    -0
      src/main/webapp/statics/css/style.min.css
  100. BIN
      src/main/webapp/statics/images/MORPH_BLACKHAT.png

+ 28
- 0
.classpath View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>

+ 58
- 0
.project View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>java_opencv</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.genuitec.eclipse.j2eedt.core.DeploymentDescriptorValidator</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.genuitec.eclipse.ast.deploy.core.DeploymentBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.genuitec.eclipse.springframework.springbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.genuitec.eclipse.springframework.springnature</nature>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
</projectDescription>

+ 12
- 0
.settings/.jsdtscope View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src/main/webapp"/>
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
<attributes>
<attribute name="hide" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary/StandardBrowser/html5"/>
<classpathentry kind="output" path=""/>
</classpath>

+ 2
- 0
.settings/com.genuitec.eclipse.j2eedt.core.prefs View File

@@ -0,0 +1,2 @@
defaultTldInfo=f\=http\://java.sun.com/jsf/core;http\://java.sun.com/jsf/html\=h;http\://struts.apache.org/tags-bean\=bean;http\://java.sun.com/jsp/jstl/fmt\=fmt;bean\=http\://struts.apache.org/tags-bean;nested\=http\://struts.apache.org/tags-nested;http\://java.sun.com/jsp/jstl/sql\=sql;c\=http\://java.sun.com/jsp/jstl/core;fmt\=http\://java.sun.com/jsp/jstl/fmt;http\://struts.apache.org/tags-logic\=logic;http\://java.sun.com/jsp/jstl/xml\=x;http\://java.sun.com/jsp/jstl/core\=c;logic\=http\://struts.apache.org/tags-logic;h\=http\://java.sun.com/jsf/html;http\://struts.apache.org/tags-tiles\=tiles;http\://java.sun.com/jsp/jstl/functions\=fn;tiles\=http\://struts.apache.org/tags-tiles;sql\=http\://java.sun.com/jsp/jstl/sql;http\://struts.apache.org/tags-html\=html;html\=http\://struts.apache.org/tags-html;http\://struts.apache.org/tags-nested\=nested;http\://java.sun.com/jsf/core\=f;fn\=http\://java.sun.com/jsp/jstl/functions;x\=http\://java.sun.com/jsp/jstl/xml
eclipse.preferences.version=1

+ 6
- 0
.settings/org.eclipse.core.resources.prefs View File

@@ -0,0 +1,6 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/main/resources/config.properties=UTF-8
encoding//src/test/java=UTF-8
encoding/<project>=UTF-8

+ 99
- 0
.settings/org.eclipse.jdt.core.prefs View File

@@ -0,0 +1,99 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
org.eclipse.jdt.core.compiler.problem.deadCode=warning
org.eclipse.jdt.core.compiler.problem.deprecation=warning
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
org.eclipse.jdt.core.compiler.problem.nullReference=warning
org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.7

+ 4
- 0
.settings/org.eclipse.m2e.core.prefs View File

@@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

+ 10
- 0
.settings/org.eclipse.wst.common.component View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="java_opencv">
<wb-resource deploy-path="/" source-path="/target/m2e-jee/web-resources"/>
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<property name="java-output-path" value="/java_opencv/target/classes"/>
<property name="context-root" value="java_opencv"/>
</wb-module>
</project-modules>

+ 8
- 0
.settings/org.eclipse.wst.common.project.facet.core.xml View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<installed facet="maven" version="1.0"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="jst.web" version="2.4"/>
<installed facet="java" version="1.7"/>
</faceted-project>

+ 1
- 0
.settings/org.eclipse.wst.jsdt.ui.superType.container View File

@@ -0,0 +1 @@
org.eclipse.wst.jsdt.launching.baseBrowserLibrary

+ 1
- 0
.settings/org.eclipse.wst.jsdt.ui.superType.name View File

@@ -0,0 +1 @@
Window

+ 2
- 0
.settings/org.eclipse.wst.validation.prefs View File

@@ -0,0 +1,2 @@
disabled=06target
eclipse.preferences.version=1

+ 225
- 0
pom.xml View File

@@ -0,0 +1,225 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.acts</groupId>
<artifactId>java_opencv</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>java_opencv</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jdk.version>1.7</jdk.version>
<spring.version>4.2.5.RELEASE</spring.version>
<hibernate.version>5.1.0.Final</hibernate.version>
<jackson.version>2.8.8</jackson.version>
<logback.version>1.2.3</logback.version>
<swagger2.version>2.7.0</swagger2.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- servlet支持 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- spring支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.10.1.RELEASE</version>
</dependency>
<!-- hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<!-- commons-configuration -->
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>
<!--commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<!-- jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- 构建Restful API -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
<!-- opencv -->
<dependency>
<groupId>com.acts</groupId>
<artifactId>opencv</artifactId>
<version>2.4.13</version>
</dependency>
<!-- tesseract-ocr -->
<!-- <dependency>
<groupId>com.acts</groupId>
<artifactId>tess4j</artifactId>
<version>3.0.0</version>
</dependency> -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.0.0</version>
</dependency>


</dependencies>
<build>
<finalName>java_opencv</finalName>
</build>
</project>

+ 4
- 0
readme View File

@@ -0,0 +1,4 @@
## jar添加到本地仓库命令如下,切换到项目地址下执行该命令即可
mvn install:install-file -Dfile=src/main/resources/WEB-INF/lib/opencv-2413.jar -DgroupId=com.acts -DartifactId=opencv -Dversion=2.4.13 -Dpackaging=jar

## mvn install:install-file -Dfile=src/main/resources/WEB-INF/lib/tess4j-3.3.1.jar -DgroupId=com.acts -DartifactId=tess4j -Dversion=3.3.1 -Dpackaging=jar

+ 753
- 0
src/main/java/com/acts/opencv/base/BaseMethodController.java View File

@@ -0,0 +1,753 @@
package com.acts.opencv.base;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Vector;

import javax.servlet.http.HttpServletResponse;

import org.opencv.core.Core;
import org.opencv.core.Core.MinMaxLocResult;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfFloat;
import org.opencv.core.MatOfInt;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.acts.opencv.common.utils.CommonUtil;
import com.acts.opencv.common.utils.Constants;
import com.acts.opencv.common.utils.OpenCVUtil;
import com.acts.opencv.common.web.BaseController;
import com.acts.opencv.demo.DemoController;


@Controller
@RequestMapping(value = "base")
public class BaseMethodController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);

/**
* 二值化方法测试
* 创建者 Songer
* 创建时间 2018年3月9日
*/
@RequestMapping(value = "binary")
public void binary(HttpServletResponse response, String imagefile, Integer binaryType, Double thresh, Double maxval) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 二值化方法");

// 灰度化
// Imgproc.cvtColor(source, destination, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
// 加载为灰度图显示
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
logger.info("binaryType:{},thresh:{},maxval:{}", binaryType, thresh, maxval);
switch (binaryType) {
case 0:
binaryType = Imgproc.THRESH_BINARY;
break;
case 1:
binaryType = Imgproc.THRESH_BINARY_INV;
break;
case 2:
binaryType = Imgproc.THRESH_TRUNC;
break;
case 3:
binaryType = Imgproc.THRESH_TOZERO;
break;
case 4:
binaryType = Imgproc.THRESH_TOZERO_INV;
break;
default:
break;
}
Imgproc.threshold(source, destination, Double.valueOf(thresh), Double.valueOf(maxval), binaryType);
// Imgproc.adaptiveThreshold(source, destination, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 31, 15);
// Imgproc.threshold(source, destination, 170, 255, Imgproc.THRESH_BINARY_INV);
// Imgproc.threshold(source, destination, 127, 255, Imgproc.THRESH_TOZERO);
// Imgproc.threshold(source, destination, 0, 255, Imgproc.THRESH_TOZERO_INV);

// String filename = imagefile.substring(imagefile.lastIndexOf("/"), imagefile.length());
// String filename_end = filename.substring(filename.lastIndexOf("."), filename.length());
// String filename_pre = filename.substring(0, filename.lastIndexOf("."));
// System.out.println(filename_pre);
// System.out.println(filename_end);
// filename = filename_pre + "_" + binaryType + "_" + thresh + "_" + maxval + "_" + filename_end;

// 原方式1生成图片后,页面读取的方式,但是实时性不好改为方式2
// String destPath = Constants.DIST_IMAGE_PATH + filename;
// File dstfile = new File(destPath);
// if (StringUtils.isNotBlank(filename) && dstfile.isFile() && dstfile.exists()) {
// dstfile.delete();
// logger.info("删除图片:" + filename);
// }
// Highgui.imwrite(destPath, destination);
// logger.info("生成目标图片==============" + destPath);
// renderString(response, filename);
// renderString(response, Constants.SUCCESS);
// 方式1end//

// 方式2,回写页面图片流
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(destination);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}

}

/**
* 自适用二值化
* @Author 王嵩
* @param response
* @param imagefile
* @param binaryType 二值化类型
* @param blockSize 附近区域面积
* @param constantC 它只是一个常数,从平均值或加权平均值中减去的常数
* @Date 2018年4月9日
* 更新日志
* 2018年4月9日 王嵩 首次创建
*/
@RequestMapping(value = "adaptiveBinary")
public void adaptiveBinary(HttpServletResponse response, String imagefile, Integer adaptiveMethod,
Integer binaryType, Integer blockSize,
Double constantC) {
//
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 自适用二值化方法");

// 灰度化
// Imgproc.cvtColor(source, destination, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
// 加载为灰度图显示
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
logger.info("binaryType:{},blockSize:{},constantC:{}", binaryType, blockSize, constantC);
switch (adaptiveMethod) {
case 0:
adaptiveMethod = Imgproc.ADAPTIVE_THRESH_MEAN_C;
break;
case 1:
adaptiveMethod = Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C;
break;
}

switch (binaryType) {
case 0:
binaryType = Imgproc.THRESH_BINARY;
break;
case 1:
binaryType = Imgproc.THRESH_BINARY_INV;
break;
case 2:
binaryType = Imgproc.THRESH_TRUNC;
break;
case 3:
binaryType = Imgproc.THRESH_TOZERO;
break;
case 4:
binaryType = Imgproc.THRESH_TOZERO_INV;
break;
default:
break;
}
Imgproc.adaptiveThreshold(source, destination, 255, adaptiveMethod, binaryType,
blockSize, constantC);

// 方式2,回写页面图片流
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(destination);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}

}

/**
* 高斯滤波方法测试
* 创建者 Songer
* 创建时间 2018年3月9日
*/
@RequestMapping(value = "gaussian")
public void gaussian(HttpServletResponse response, String imagefile, String kwidth, String kheight, String sigmaX,
String sigmaY) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 二值化方法");

String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
logger.info("kwidth:{},kheight:{},sigmaX:{},sigmaY:{}", kwidth, kheight, sigmaX, sigmaY);
Imgproc.GaussianBlur(source, destination,
new Size(2 * Integer.valueOf(kwidth) + 1, 2 * Integer.valueOf(kheight) + 1),
Integer.valueOf(sigmaX), Integer.valueOf(sigmaY));
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(destination);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 图片缩放方法测试
* 创建者 Songer
* 创建时间 2018年3月15日
*/
@RequestMapping(value = "resize")
public void resize(HttpServletResponse response, String imagefile, Double rewidth, Double reheight,
Integer resizeType) {
// 默认都是放大
double width = rewidth;
double height = reheight;

if (resizeType == 2) {
width = 1 / width;
height = 1 / height;
}
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 图片缩放方法测试");
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
logger.info("resizeType:{},rewidth:{},reheight:{}", resizeType, rewidth, reheight);
Imgproc.resize(source, destination, new Size(0, 0), width, height, 0);
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(destination);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 腐蚀膨胀测试
* 创建者 Songer
* 创建时间 2018年3月15日
*/
@RequestMapping(value = "erodingAndDilation")
public void erodingAndDilation(HttpServletResponse response, String imagefile, Double kSize, Integer operateType,
Integer shapeType, boolean isBinary) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 腐蚀膨胀测试测试");
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
if (isBinary) {
source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
// Imgproc.threshold(source, source, 100, 255, Imgproc.THRESH_BINARY);
}
double size = Double.valueOf(kSize);
int shape = 0;
switch (shapeType) {
case 0:
shape = Imgproc.MORPH_RECT;
break;
case 1:
shape = Imgproc.MORPH_CROSS;
break;
case 2:
shape = Imgproc.MORPH_ELLIPSE;
break;
}
Mat element = Imgproc.getStructuringElement(shape, new Size(2 * size + 1, 2 * size + 1));
logger.info("kSize:{},operateType:{},shapeType:{},isBinary:{}", kSize, operateType, shapeType, isBinary);
if (operateType == 1) {// 腐蚀
Imgproc.erode(source, destination, element);
} else {// 膨胀
Imgproc.dilate(source, destination, element);
}
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(destination);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 腐蚀膨胀使用进阶
* 更高级的形态学变换处理:morphologyEx
* 创建者 Songer
* 创建时间 2018年3月15日
*/
@RequestMapping(value = "morphologyEx")
public void morphologyEx(HttpServletResponse response, String imagefile, Double kSize, Integer operateType,
Integer shapeType, boolean isBinary) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 腐蚀膨胀测试测试");
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
if (isBinary) {
source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
// Imgproc.threshold(source, source, 100, 255, Imgproc.THRESH_BINARY);
}
double size = Double.valueOf(kSize);
int shape = 0;
switch (shapeType) {
case 0:
shape = Imgproc.MORPH_RECT;
break;
case 1:
shape = Imgproc.MORPH_CROSS;
break;
case 2:
shape = Imgproc.MORPH_ELLIPSE;
break;
}

int op = 2;
switch (operateType) {// 主要是为了方便查看参数是哪一个
case 2:
op = Imgproc.MORPH_OPEN;
break;
case 3:
op = Imgproc.MORPH_CLOSE;
break;
case 4:
op = Imgproc.MORPH_GRADIENT;
break;
case 5:
op = Imgproc.MORPH_TOPHAT;
break;
case 6:
op = Imgproc.MORPH_BLACKHAT;
break;
case 7:
op = Imgproc.MORPH_HITMISS;
break;
}

Mat element = Imgproc.getStructuringElement(shape, new Size(2 * size + 1, 2 * size + 1));
logger.info("kSize:{},operateType:{},shapeType:{},isBinary:{}", kSize, operateType, shapeType, isBinary);

Imgproc.morphologyEx(source, destination, op, element);
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(destination);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}

}

/**
* 边缘检测Canny
* 创建者 Songer
* 创建时间 2018年3月15日
*/
@RequestMapping(value = "canny")
public void canny(HttpServletResponse response, String imagefile, Double threshold1, Double threshold2,
boolean isBinary) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 边缘检测测试");
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
Imgproc.Canny(source, destination, threshold1, threshold2);
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(destination);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 霍夫线变换
* 创建者 Songer
* 创建时间 2018年3月19日
*/
@RequestMapping(value = "houghline")
public void houghline(HttpServletResponse response, String imagefile, Double threshold1, Double threshold2,
Integer threshold, Double minLineLength, Double maxLineGap) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 霍夫线变换测试");
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
Mat source1 = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);// 彩色图
Mat source2 = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);// 灰度图
Mat lineMat = new Mat(source2.rows(), source2.cols(), source2.type());
Mat destination = new Mat(source2.rows(), source2.cols(), source2.type());
Imgproc.Canny(source2, destination, threshold1, threshold2);
Imgproc.HoughLinesP(destination, lineMat, 1, Math.PI / 180, threshold, minLineLength, maxLineGap);
int[] a = new int[(int) lineMat.total() * lineMat.channels()]; // 数组a存储检测出的直线端点坐标
lineMat.get(0, 0, a);
for (int i = 0; i < a.length; i += 4) {
// new Scalar(255, 0, 0) blue
// new Scalar(0, 255, 0) green
// new Scalar(0, 0, 255) red
Core.line(source1, new Point(a[i], a[i + 1]), new Point(a[i + 2], a[i + 3]), new Scalar(0, 255, 0), 2);
}

try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(source1);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 霍夫圆变换
* 创建者 Songer
* 创建时间 2018年3月20日
*/
@RequestMapping(value = "houghcircle")
public void houghcircle(HttpServletResponse response, String imagefile, Double minDist, Double param1,
Double param2, Integer minRadius, Integer maxRadius) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 霍夫圆变换测试");
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
Mat source1 = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);// 彩色图
Mat source2 = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);// 灰度图
Mat circleMat = new Mat(source2.rows(), source2.cols(), source2.type());

Imgproc.HoughCircles(source2, circleMat, Imgproc.CV_HOUGH_GRADIENT, 1.0, minDist, param1, param2, minRadius,
maxRadius);// 霍夫变换检测圆
System.out.println("----------------" + circleMat.cols());
int cols = circleMat.cols();
// Point anchor01 = new Point();
if (cols > 0) {
for (int i = 0; i < cols; i++) {
double vCircle[] = circleMat.get(0, i);
Point center = new Point(vCircle[0], vCircle[1]);
int radius = (int) Math.round(vCircle[2]);
Core.circle(source1, center, 3, new Scalar(0, 255, 0), -1, 8, 0);// 绿色圆心
Core.circle(source1, center, radius, new Scalar(0, 0, 255), 3, 8, 0);// 红色圆边
// anchor01.x = vCircle[0];
// anchor01.y = vCircle[1];

}
}
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(source1);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 颜色识别测试
* 创建者 Songer
* 创建时间 2018年3月20日
*/
@RequestMapping(value = "findcolor")
public void findcolor(HttpServletResponse response, String imagefile, Integer color,
Integer colorType) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 查找颜色测试");
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
if (colorType == 1) {// 1为RGB方式,2为HSV方式
double B = 0;
double G = 0;
double R = 0;
switch (color) {
case 1:// red
B = 0;
G = 0;
R = 255;
break;
case 2:// blue
B = 255;
G = 0;
R = 0;
break;
case 3:// green
B = 0;
G = 255;
R = 0;
break;
case 4:// yellow
B = 0;
G = 255;
R = 255;
break;
}
Core.inRange(source, new Scalar(B, G, R), new Scalar(B, G, R), destination);
} else {// HSV方式
Imgproc.cvtColor(source, source, Imgproc.COLOR_BGR2HSV);
double min = 0;
double max = 0;
// 泛红色系(176,90,90)-(0, 90, 90)-(20,255,255) 简易:0-20
// 泛蓝色系(100, 90, 90)-(120,255,255)
// 泛绿色系(60, 90, 90)-(80,255,255)
// 泛黄色系(23, 90, 90)-(38,255,255)
switch (color) {
case 1:// red
min = 0;
max = 20;
break;
case 2:// blue
min = 100;
max = 120;
break;
case 3:// green
min = 60;
max = 80;
break;
case 4:// yellow
min = 23;
max = 38;
break;
}
Core.inRange(source, new Scalar(min, 90, 90), new Scalar(max, 255, 255), destination);
}
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(destination);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 轮廓识别测试
* 创建者 Songer
* 创建时间 2018年3月20日
*/
@RequestMapping(value = "contours")
public void contours(HttpServletResponse response, String imagefile, Integer mode, Integer method,
Integer contourNum) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 轮廓识别测试");
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
logger.info("mode:{},method:{}", mode, method);

switch (mode) {
case 0:
mode = Imgproc.RETR_EXTERNAL;
break;
case 1:
mode = Imgproc.RETR_LIST;
break;
case 2:
mode = Imgproc.RETR_CCOMP;
break;
case 3:
mode = Imgproc.RETR_TREE;
break;
}
switch (method) {
case 0:
method = Imgproc.CV_CHAIN_CODE;
break;
case 1:
method = Imgproc.CHAIN_APPROX_NONE;
break;
case 2:
method = Imgproc.CHAIN_APPROX_SIMPLE;
break;
case 3:
method = Imgproc.CHAIN_APPROX_TC89_L1;
break;
case 4:
method = Imgproc.CHAIN_APPROX_TC89_KCOS;
break;
case 5:
method = Imgproc.CV_LINK_RUNS;
break;
}

Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
// Mat destination = new Mat(source.rows(), source.cols(), source.type());
Mat destination = Mat.zeros(source.size(), CvType.CV_8UC3);
Mat hierarchy = new Mat(source.rows(), source.cols(), CvType.CV_8UC1, new Scalar(0));
Vector<MatOfPoint> contours = new Vector<MatOfPoint>();
Imgproc.findContours(source, contours, hierarchy, mode, method, new Point());
System.out.println(contours.size());
logger.info("轮廓数量为:{},当前请求要展现第{}个轮廓", contours.size(), contourNum);
// contourNum因为轮廓计数是从0开始
if (contourNum == -1 || (contourNum + 1) > contours.size()) {
logger.info("轮廓数量已经超出,默认显示所有轮廓,轮廓数量:{}", contours.size());
contourNum = -1;
}
Imgproc.drawContours(destination, contours, contourNum, new Scalar(0, 255, 0), 2);
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(destination);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 模板查找测试
* 创建者 Songer
* 创建时间 2018年3月21日
*/
@RequestMapping(value = "findtemplate")
public void findtemplate(HttpServletResponse response, String imagefile, Integer method, Integer imageType,
Double x1, Double y1, Double x2, Double y2, Double width, Double height) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 模板查找测试");
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
// Mat destination = new Mat(source.rows(), source.cols(), source.type());
// String templateimage = Constants.SOURCE_IMAGE_PATH + "/template.png";
// System.out.println(templateimage);
// Mat matchtemp = Highgui.imread(templateimage);
// 优化代码,模板图像直接通过前端截取或取得,而不是写死,此处用到了OpenCV的截取图像功能
logger.info("{},{},{},{}", x1, y1, width, height);
Mat matchtemp = source.submat(new Rect(Integer.valueOf(CommonUtil.setScare(x1.toString(), 0)), Integer
.valueOf(CommonUtil.setScare(y1.toString(), 0)), Integer.valueOf(CommonUtil.setScare(width.toString(),
0)), Integer.valueOf(CommonUtil.setScare(height.toString(), 0))));

int result_cols = source.cols() - matchtemp.cols() + 1;
int result_rows = source.rows() - matchtemp.rows() + 1;
Mat destination = new Mat(result_rows, result_cols, CvType.CV_32FC1);
Imgproc.matchTemplate(source, matchtemp, destination, method);
// 矩阵归一化处理
Core.normalize(destination, destination, 0, 255, Core.NORM_MINMAX, -1, new Mat());
// minMaxLoc(imagematch, minVal, maxVal2, minLoc, maxLoc01, new Mat());
MinMaxLocResult minmaxLoc = Core.minMaxLoc(destination);
Point matchLoc = new Point();
switch (method) {
case 0:
// method = Imgproc.TM_SQDIFF;
matchLoc = minmaxLoc.minLoc;
break;
case 1:
// method = Imgproc.TM_SQDIFF_NORMED;
matchLoc = minmaxLoc.minLoc;
break;
case 2:
// method = Imgproc.TM_CCORR;
matchLoc = minmaxLoc.maxLoc;
break;
case 3:
// method = Imgproc.TM_CCORR_NORMED;
matchLoc = minmaxLoc.maxLoc;
break;
case 4:
// method = Imgproc.TM_CCOEFF;
matchLoc = minmaxLoc.maxLoc;
break;
case 5:
// method = Imgproc.TM_CCOEFF_NORMED;
matchLoc = minmaxLoc.maxLoc;
break;
default:
// method = Imgproc.TM_SQDIFF;
matchLoc = minmaxLoc.minLoc;
break;
}

if (imageType == 0) {// 显示过程图片
source = destination;
} else {// 显示最终框选结果
Core.rectangle(source, matchLoc, new Point(matchLoc.x + matchtemp.cols(), matchLoc.y + matchtemp.rows()),
new Scalar(0, 255, 0), 2);
}
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(source);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 灰度直方图
* @Author 王嵩
* @param response
* @param imagefile
* @param cols
* @return Mat
* @Date 2018年4月2日
* 更新日志
* 2018年4月2日 王嵩 首次创建
*
*/
@RequestMapping(value = "grayHistogram")
public void grayHistogram(HttpServletResponse response, String imagefile, Integer cols, Integer imageW,
Integer imageH, Integer imageKedu, boolean isShow) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 灰度直方图测试");
String sourcePath = Constants.PATH + imagefile;
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
java.util.List<Mat> images = new ArrayList<>();
images.add(source);
MatOfInt channels = new MatOfInt(0); // 图像通道数,0表示只有一个通道
MatOfInt histSize = new MatOfInt(cols); // CV_8U类型的图片范围是0~255,共有256个灰度级
Mat histogramOfGray = new Mat(); // 输出直方图结果,共有256行,行数的相当于对应灰度值,每一行的值相当于该灰度值所占比例
MatOfFloat histRange = new MatOfFloat(0, 255);
Imgproc.calcHist(images, channels, new Mat(), histogramOfGray, histSize, histRange, false); // 计算直方图
MinMaxLocResult minmaxLoc = Core.minMaxLoc(histogramOfGray);
// 按行归一化
// Core.normalize(histogramOfGray, histogramOfGray, 0, histogramOfGray.rows(), Core.NORM_MINMAX, -1, new Mat());

// 创建画布
int histImgRows = imageH;
int histImgCols = imageW;
int colStep = (int) Math.floor((histImgCols) / histSize.get(0, 0)[0]);
Mat histImg = new Mat(histImgRows, histImgCols, CvType.CV_8UC3, new Scalar(255, 255, 255)); // 重新建一张图片,绘制直方图

int max = (int) minmaxLoc.maxVal;
System.out.println("max--------" + max);
double bin_u = (double) (histImg.height() - 20) / max; // max: 最高条的像素个数,则 bin_u 为单个像素的高度
int kedu = 0;
for (int i = 1; kedu <= minmaxLoc.maxVal; i++) {
kedu = i * max / 10;
// 在图像中显示文本字符串
Core.putText(histImg, kedu + "", new Point(0, histImg.height() - 5 - kedu * bin_u), 1, 1, new Scalar(255,0, 0));
if (isShow) {
// 附上高度坐标线,因为高度在画图时-了20,此处也减掉
Core.line(histImg, new Point(0, histImg.height() - 20 - kedu * bin_u),
new Point(imageW, histImg.height() - 20 - (kedu + 1) * bin_u), new Scalar(255, 0, 0), 1, 8, 0);
}
}

System.out.println("灰度级:" + histSize.get(0, 0)[0]);
for (int i = 0; i < histSize.get(0, 0)[0]; i++) { // 画出每一个灰度级分量的比例,注意OpenCV将Mat最左上角的点作为坐标原点
Core.rectangle(histImg, new Point(colStep * i, histImgRows - 20), new Point(colStep * (i + 1), histImgRows
- bin_u * Math.round(histogramOfGray.get(i, 0)[0]) - 20), new Scalar(0, 0, 0), 1, 8, 0);
// if (i % 10 == 0) {
// Core.putText(histImg, Integer.toString(i), new Point(colStep * i, histImgRows - 5), 1, 1, new Scalar(255,
// 0, 0)); // 附上x轴刻度
// }
// 每隔10画一下刻度,方式2
kedu = i * imageKedu;
Core.rectangle(histImg, new Point(colStep * kedu, histImgRows - 20), new Point(colStep * (kedu + 1),
histImgRows - 20), new Scalar(255, 0, 0), 2, 8, 0);
Core.putText(histImg, kedu + "", new Point(histImgCols / 256 * kedu, histImgRows - 5), 1, 1, new Scalar(
255, 0, 0)); // 附上x轴刻度
}
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(histImg);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}

}
}

+ 277
- 0
src/main/java/com/acts/opencv/base/CardController.java View File

@@ -0,0 +1,277 @@
package com.acts.opencv.base;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.TreeMap;
import java.util.Vector;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.acts.opencv.common.utils.Constants;
import com.acts.opencv.common.utils.RectComp;
import com.acts.opencv.common.web.BaseController;
import com.acts.opencv.demo.DemoController;


@Controller
@RequestMapping(value = "card")
public class CardController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);

/**
* 答题卡识别
* step1 高斯模糊
* 创建者 Songer
* 创建时间 2018年3月22日
*/
@RequestMapping(value = "step1")
public void step1(HttpServletResponse response, String imagefile, Integer ksize) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 高斯模糊");

String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
// 加载为灰度图显示
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
Imgproc.GaussianBlur(source, destination, new Size(2 * ksize + 1, 2 * ksize + 1), 0, 0);
String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "card1.png";
File dstfile = new File(destPath);
if (StringUtils.isNotBlank(destPath) && dstfile.isFile() && dstfile.exists()) {
dstfile.delete();
logger.info("删除图片:" + destPath);
}
Highgui.imwrite(destPath, destination);
logger.info("生成目标图片==============" + destPath);
renderString(response, Constants.DEST_IMAGE_PATH + "card1.png");

}

/**
* 答题卡识别
* step2 二值化,反向二值化
* 创建者 Songer
* 创建时间 2018年3月22日
*/
@RequestMapping(value = "step2")
public void step2(HttpServletResponse response, String imagefile, Double thresh) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 二值化处理");

// 灰度化
// Imgproc.cvtColor(source, destination, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
// 加载为灰度图显示
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
Imgproc.threshold(source, destination, thresh, 255, Imgproc.THRESH_BINARY_INV);
String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "card2.png";
File dstfile = new File(destPath);
if (StringUtils.isNotBlank(destPath) && dstfile.isFile() && dstfile.exists()) {
dstfile.delete();
logger.info("删除图片:" + destPath);
}
Highgui.imwrite(destPath, destination);
logger.info("生成目标图片==============" + destPath);
renderString(response, Constants.DEST_IMAGE_PATH + "card2.png");

}

/**
* 答题卡识别
* step3 膨胀腐蚀闭运算(针对反向二值图是开运算)
* 创建者 Songer
* 创建时间 2018年3月22日
*/
@RequestMapping(value = "step3")
public void step3(HttpServletResponse response, String imagefile, Integer ksize) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 开运算");

// 灰度化
// Imgproc.cvtColor(source, destination, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
// 加载为灰度图显示
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2 * ksize + 1, 2 * ksize + 1));

Imgproc.morphologyEx(source, destination, Imgproc.MORPH_OPEN, element);
String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "card3.png";
File dstfile = new File(destPath);
if (StringUtils.isNotBlank(destPath) && dstfile.isFile() && dstfile.exists()) {
dstfile.delete();
logger.info("删除图片:" + destPath);
}
Highgui.imwrite(destPath, destination);
logger.info("生成目标图片==============" + destPath);
renderString(response, Constants.DEST_IMAGE_PATH + "card3.png");
}

/**
* 答题卡识别
* step4 轮廓识别
* 创建者 Songer
* 创建时间 2018年3月22日
*/
@RequestMapping(value = "step4")
public void step4(HttpServletResponse response, String imagefile) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 轮廓识别");

// 灰度化
// Imgproc.cvtColor(source, destination, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
// 加载为灰度图显示
Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Highgui.imwrite("D:\\test\\abc\\source.png", source);
//此处固定写死,取每一行选项,切割后进行轮廓识别
Mat ch1 = source.submat(new Rect(170, 52, 294, 32));
Mat ch2 = source.submat(new Rect(170, 104, 294, 32));
Mat ch3 = source.submat(new Rect(170, 156, 294, 32));
Mat ch4 = source.submat(new Rect(170, 208, 294, 32));
Mat ch5 = source.submat(new Rect(170, 260, 294, 32));

Mat ch6 = source.submat(new Rect(706, 50, 294, 32));
Mat ch7 = source.submat(new Rect(706, 104, 294, 32));
Mat ch8 = source.submat(new Rect(706, 156, 294, 32));
Mat ch9 = source.submat(new Rect(706, 208, 294, 32));
Mat ch10 = source.submat(new Rect(706, 260, 294, 32));

Mat ch11 = source.submat(new Rect(1237, 50, 294, 32));
Mat ch12 = source.submat(new Rect(1237, 104, 294, 32));
Mat ch13 = source.submat(new Rect(1237, 156, 294, 32));
Mat ch14 = source.submat(new Rect(1237, 208, 294, 32));
Mat ch15 = source.submat(new Rect(1237, 260, 294, 32));

Mat ch16 = source.submat(new Rect(1766, 50, 294, 32));
Mat ch17 = source.submat(new Rect(1766, 104, 294, 32));
Mat ch18 = source.submat(new Rect(1766, 156, 294, 32));
Mat ch19 = source.submat(new Rect(1766, 208, 294, 32));
Mat ch20 = source.submat(new Rect(1766, 260, 294, 32));

Mat ch21 = source.submat(new Rect(170, 358, 294, 32));
Mat ch22 = source.submat(new Rect(170, 410, 294, 32));
Mat ch23 = source.submat(new Rect(170, 462, 294, 32));
Mat ch24 = source.submat(new Rect(170, 514, 294, 32));
Mat ch25 = source.submat(new Rect(170, 566, 294, 32));
List<Mat> chlist = new ArrayList<Mat>();
chlist.add(ch1);
chlist.add(ch2);
chlist.add(ch3);
chlist.add(ch4);
chlist.add(ch5);
chlist.add(ch6);
chlist.add(ch7);
chlist.add(ch8);
chlist.add(ch9);
chlist.add(ch10);
chlist.add(ch11);
chlist.add(ch12);
chlist.add(ch13);
chlist.add(ch14);
chlist.add(ch15);
chlist.add(ch16);
chlist.add(ch17);
chlist.add(ch18);
chlist.add(ch19);
chlist.add(ch20);
chlist.add(ch21);
chlist.add(ch22);
chlist.add(ch23);
chlist.add(ch24);
chlist.add(ch25);

Mat hierarchy = new Mat();
java.util.TreeMap<Integer,String> listenAnswer = new TreeMap<Integer,String>();
for (int no=0;no<chlist.size();no++) {
Vector<MatOfPoint> contours = new Vector<MatOfPoint>();
Mat ch = chlist.get(no);
Imgproc.findContours(ch, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point());

Vector<RectComp> rectCompList = new Vector<RectComp>();
for(int i = 0;i<contours.size();i++){
MatOfPoint mop= contours.get(i);
// 获取轮廓外矩,即使用最小矩形将轮廓包裹
Rect rm = Imgproc.boundingRect(mop);
RectComp rc = new RectComp(rm);
rectCompList.add(rc);
}
// System.out.println(no+"size="+rectCompList.size());
Collections.sort(rectCompList);
// for(int t = 0;t<rectCompList.size();t++){
// RectComp rect = rectCompList.get(t);
// System.out.println(rect.getRm().area() + "--------" + rect.getRm().x);
// if (rect.getRm().area() < 300) {// 小于300的pass,完美填图的话是≈1500
// continue;
// }
// if (rect.getRm().x < 68) {
// listenAnswer.put(Integer.valueOf(no), "A");
// } else if ((rect.getRm().x > 68) && (rect.getRm().x < 148)) {
// listenAnswer.put(Integer.valueOf(no), "B");
// } else if ((rect.getRm().x > 148) && (rect.getRm().x < 228)) {
// listenAnswer.put(Integer.valueOf(no), "C");
// } else if (rect.getRm().x > 228) {
// listenAnswer.put(Integer.valueOf(no), "D");
// }
// }
// 因为已经按面积排序了,所以取第一个面积最大的轮廓即可
RectComp rect = rectCompList.get(0);
System.out.println(rect.getRm().area() + "--------" + rect.getRm().x);
if (rect.getRm().area() > 300) {// 小于300的pass,说明未填写,完美填图的话是≈1500
if (rect.getRm().x < 68) {
listenAnswer.put(Integer.valueOf(no), "A");
} else if ((rect.getRm().x > 68) && (rect.getRm().x < 148)) {
listenAnswer.put(Integer.valueOf(no), "B");
} else if ((rect.getRm().x > 148) && (rect.getRm().x < 228)) {
listenAnswer.put(Integer.valueOf(no), "C");
} else if (rect.getRm().x > 228) {
listenAnswer.put(Integer.valueOf(no), "D");
}
} else {
listenAnswer.put(Integer.valueOf(no), "未填写");
}

Mat result = new Mat(ch.size(), CvType.CV_8U, new Scalar(255));
Imgproc.drawContours(result, contours, -1, new Scalar(0, 255, 0), 2);
String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "ch" + (no + 1) + ".png";
File dstfile = new File(destPath);
if (StringUtils.isNotBlank(destPath) && dstfile.isFile() && dstfile.exists()) {
dstfile.delete();
logger.info("删除图片:" + destPath);
}
Highgui.imwrite(destPath, result);
logger.info("生成目标图片==============" + result);
}
String resultValue = "最终结果:试题编号-答案<br> ";
for (Integer key : listenAnswer.keySet()) {
resultValue += "【" + (key + 1) + ":" + listenAnswer.get(key) + "】";
if ((key + 1) % 5 == 0) {
resultValue += "<br>";
}
}
renderString(response, resultValue);
}

}

+ 447
- 0
src/main/java/com/acts/opencv/base/CardPlusController.java View File

@@ -0,0 +1,447 @@
package com.acts.opencv.base;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TreeMap;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.opencv.core.Core;
import org.opencv.core.Core.MinMaxLocResult;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfFloat;
import org.opencv.core.MatOfInt;
import org.opencv.core.Point;
import org.opencv.core.Range;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.opencv.photo.Photo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.acts.opencv.common.utils.Constants;
import com.acts.opencv.common.utils.OpenCVUtil;
import com.acts.opencv.common.web.BaseController;
import com.acts.opencv.demo.DemoController;


@Controller
@RequestMapping(value = "cardPlus")
public class CardPlusController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);

/**
* 答题卡识别优化
* 创建者 Songer
* 创建时间 2018年3月23日
*/
@RequestMapping(value = "answerSheet")
public void answerSheet(HttpServletResponse response, String imagefile, Integer binary_thresh,
String blue_red_thresh) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 完整答题卡识别");

String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
Mat sourceMat = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
long t1 = new Date().getTime();
String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk0.png";
Highgui.imwrite(destPath, sourceMat);
logger.info("原答题卡图片======" + destPath);
// 初始图片灰度图
Mat sourceMat1 = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk1.png";
Highgui.imwrite(destPath, sourceMat1);
logger.info("生成灰度图======" + destPath);
// 先膨胀 后腐蚀算法,开运算消除细小杂点
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2 * 1 + 1, 2 * 1 + 1));
Imgproc.morphologyEx(sourceMat1, sourceMat1, Imgproc.MORPH_OPEN, element);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk2.png";
Highgui.imwrite(destPath, sourceMat1);
logger.info("生成膨胀腐蚀后的图======" + destPath);

// 切割右侧和底部标记位图片
Mat rightMark = new Mat(sourceMat1, new Rect(sourceMat1.cols() - 100, 0, 100, sourceMat1.rows()));

destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk3.png";
Highgui.imwrite(destPath, rightMark);
logger.info("截取右侧定位点图======" + destPath);
// 平滑处理消除噪点毛刺等等
Imgproc.GaussianBlur(rightMark, rightMark, new Size(3, 3), 0);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk4.png";
Highgui.imwrite(destPath, rightMark);
logger.info("平滑处理后的右侧定位点图======" + destPath);

// 根据右侧定位获取水平投影,并获取纵向坐标
Mat matright = horizontalProjection(rightMark);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk5.png";
Highgui.imwrite(destPath, matright);
logger.info("右侧水平投影图======" + destPath);
// 获取y坐标点,返回的是横向条状图集合
List<Rect> listy = getBlockRect(matright, 1, 0);

Mat footMark = new Mat(sourceMat1, new Rect(0, sourceMat1.rows() - 150, sourceMat1.cols(), 50));
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk6.png";
Highgui.imwrite(destPath, footMark);
logger.info("截取底部定位点图======" + destPath);

Imgproc.GaussianBlur(footMark, footMark, new Size(3, 3), 0);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk7.png";
Highgui.imwrite(destPath, footMark);
logger.info("平滑处理后的底部定位点图======" + destPath);

// 根据底部定位获取垂直投影,并获取横向坐标
Mat matbootom = verticalProjection(footMark);

destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk8.png";
Highgui.imwrite(destPath, matbootom);
logger.info("底部垂直投影图======" + destPath);
// 获取x坐标点,返回的是竖向的柱状图集合
List<Rect> listx = getBlockRect(matbootom, 0, 0);



// 高阶处理:增加HSV颜色查找,查找红色像素点
Mat matRed = findColorbyHSV(sourceMat, 156, 180);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk9.png";
Highgui.imwrite(destPath, matRed);
logger.info("HSV找出红色像素点======" + destPath);

Mat dstNoRed = new Mat(sourceMat1.rows(), sourceMat1.cols(), sourceMat1.type());
dstNoRed = OpenCVUtil.dilation(sourceMat1);
// Imgproc.threshold(sourceMat1, dstNoRed, 190, 255, Imgproc.THRESH_BINARY);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk10.png";
Highgui.imwrite(destPath, dstNoRed);
logger.info("原灰度图的图片======" + destPath);

Photo.inpaint(dstNoRed, matRed, dstNoRed, 1, Photo.INPAINT_NS);
// findBlackColorbyHSV(sourceMat);
// for (int i = 0;i<dstNoRed.rows();i++) {
// for (int j = 0; j < dstNoRed.cols(); j++) {
// if(matRed.get(i, j)[0]==255){//代表识别出的红色区域
// dstNoRed.put(i,j,255);
// }
// }
// }

destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk11.png";
Highgui.imwrite(destPath, dstNoRed);
logger.info("去除红颜色后的图片======" + destPath);

Mat grayHistogram1 = getGrayHistogram(dstNoRed);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk12.png";
Highgui.imwrite(destPath, grayHistogram1);
logger.info("灰度直方图图片1======" + destPath);

destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk13.png";
Mat answerMat = dstNoRed.submat(new Rect(41, 895, 278, 133));
Mat grayHistogram2 = getGrayHistogram(answerMat);
Highgui.imwrite(destPath, grayHistogram2);
logger.info("灰度直方图图片2======" + destPath);

destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk14.png";
Imgproc.threshold(dstNoRed, dstNoRed, binary_thresh, 255, Imgproc.THRESH_BINARY_INV);
Highgui.imwrite(destPath, dstNoRed);
logger.info("去除红色基础上进行二值化======" + destPath);
String redvalue = StringUtils.split(blue_red_thresh, ",")[0];
String bluevalue = StringUtils.split(blue_red_thresh, ",")[1];
System.out.println(bluevalue + " " + redvalue);
TreeMap<Integer, String> resultMap = new TreeMap<Integer, String>();
StringBuffer resultValue = new StringBuffer();
for (int no = 0; no < listx.size(); no++) {
Rect rectx = listx.get(no);
for (int an = 0; an < listy.size(); an++) {
Rect recty = listy.get(an);
Mat selectdst = new Mat(dstNoRed, new Range(recty.y, recty.y + recty.height), new Range(rectx.x,
rectx.x
+ rectx.width));
// 本来是在每个区域内进行二值化,后来挪至了14步,整体进行二值化,因此注释掉此处2行
// Mat selectdst = new Mat(select.rows(), select.cols(), select.type());
// Imgproc.threshold(select, selectdst, 170, 255, Imgproc.THRESH_BINARY);

// System.out.println("rectx.x, recty.y=="+rectx.x+","+recty.y+"rectx.width,recty.height=="+rectx.width+","+recty.height);
double p100 = Core.countNonZero(selectdst) * 100 / (selectdst.size().area());
String que_answer = getQA(no, an);
Integer que = Integer.valueOf(que_answer.split("_")[0]);
String answer = que_answer.split("_")[1];
// System.out.println(Core.countNonZero(selectdst) + "/" + selectdst.size().area());
System.out.println(que_answer + ": " + p100);

if (p100 >= Integer.valueOf(bluevalue)) {// 蓝色
Core.rectangle(sourceMat, new Point(rectx.x, recty.y), new Point(rectx.x + rectx.width, recty.y
+ recty.height), new Scalar(255, 0, 0), 2);
// logger.info(que_answer + ":填涂");
if (StringUtils.isNotEmpty(resultMap.get(que))) {
resultMap.put(que, resultMap.get(que) + "," + answer);
} else {
resultMap.put(que, answer);
}
} else if (p100 > Integer.valueOf(redvalue) && p100 < Integer.valueOf(bluevalue)) {// 红色
Core.rectangle(sourceMat, new Point(rectx.x, recty.y), new Point(rectx.x + rectx.width, recty.y
+ recty.height), new Scalar(0, 0, 255), 2);
// logger.info(que_answer + ":临界");
if (StringUtils.isNotEmpty(resultMap.get(que))) {
resultMap.put(que, resultMap.get(que) + ",(" + answer + ")");
} else {
resultMap.put(que, "(" + answer + ")");
}
} else {// 绿色
Core.rectangle(sourceMat, new Point(rectx.x, recty.y), new Point(rectx.x + rectx.width, recty.y
+ recty.height), new Scalar(0, 255, 0), 1);
// logger.info(que_answer + ":未涂");
}
}
}

// for (Object result : resultMap.keySet()) {
for (int i = 1; i <= 100; i++) {
// logger.info("key=" + result + " value=" + resultMap.get(result));
resultValue.append(" " + i + "=" + (StringUtils.isEmpty(resultMap.get(i)) ? "未填写" : resultMap.get(i)));
if (i % 5 == 0) {
resultValue.append("<br>");
}
}
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk15.png";
Highgui.imwrite(destPath, sourceMat);
logger.info("框选填图区域,绿色为选项,蓝色为填图,红色为临界======" + destPath);
long t2 = new Date().getTime();
System.out.println(t2 - t1);

// logger.info("输出最终结果:" + resultValue.toString());

renderString(response, resultValue.toString());
}

/**
* 绘制灰度直方图用于调整识别区域阈值判断
* @Author 王嵩
* @param 输入Mat对象img
* @return Mat
* @Date 2018年3月28日
* 更新日志
* 2018年3月28日 王嵩 首次创建
*
*/
public Mat getGrayHistogram(Mat img) {
java.util.List<Mat> images = new ArrayList<>();
images.add(img);
MatOfInt channels = new MatOfInt(0); // 图像通道数,0表示只有一个通道
MatOfInt histSize = new MatOfInt(256); // CV_8U类型的图片范围是0~255,共有256个灰度级
Mat histogramOfGray = new Mat(); // 输出直方图结果,共有256行,行数的相当于对应灰度值,每一行的值相当于该灰度值所占比例
MatOfFloat histRange = new MatOfFloat(0, 255);
Imgproc.calcHist(images, channels, new Mat(), histogramOfGray, histSize, histRange, false); // 计算直方图
MinMaxLocResult minmaxLoc = Core.minMaxLoc(histogramOfGray);
// 按行归一化
// Core.normalize(histogramOfGray, histogramOfGray, 0, histogramOfGray.rows(), Core.NORM_MINMAX, -1, new Mat());

// 创建画布
int histImgRows = 600;
int histImgCols = 1300;
System.out.println("---------" + histSize.get(0, 0)[0]);
int colStep = (int) Math.floor(histImgCols / histSize.get(0, 0)[0]);// 舍去小数,不能四舍五入,有可能列宽不够
Mat histImg = new Mat(histImgRows, histImgCols, CvType.CV_8UC3, new Scalar(255, 255, 255)); // 重新建一张图片,绘制直方图


int max = (int) minmaxLoc.maxVal;
System.out.println("--------" + max);
double bin_u = (double) (histImgRows - 20) / max; // max: 最高条的像素个数,则 bin_u 为单个像素的高度,因为画直方图的时候上移了20像素,要减去
int kedu = 0;
for (int i = 1; kedu <= minmaxLoc.maxVal; i++) {
kedu = i * max / 10;
// 在图像中显示文本字符串
Core.putText(histImg, kedu + "", new Point(0, histImgRows - kedu * bin_u), 1, 1, new Scalar(0, 0, 0));
}


for (int i = 0; i < histSize.get(0, 0)[0]; i++) { // 画出每一个灰度级分量的比例,注意OpenCV将Mat最左上角的点作为坐标原点
// System.out.println(i + ":=====" + histogramOfGray.get(i, 0)[0]);
Core.rectangle(histImg, new Point(colStep * i, histImgRows - 20), new Point(colStep * (i + 1), histImgRows
- bin_u * Math.round(histogramOfGray.get(i, 0)[0]) - 20),
new Scalar(0, 0, 0), 1, 8, 0);
kedu = i * 10;
// 每隔10画一下刻度
Core.rectangle(histImg, new Point(colStep * kedu, histImgRows - 20), new Point(colStep * (kedu + 1),
histImgRows - 20), new Scalar(255, 0, 0), 2, 8, 0);
Core.putText(histImg, kedu + "", new Point(colStep * kedu, histImgRows - 5), 1, 1, new Scalar(255, 0, 0)); // 附上x轴刻度
}

return histImg;

}

// 获取题号及选项填涂情况
public String getQA(int no,int an){
//返回1A、1B、1C...2A类似这样的返回值
int first = no + 1 + an / 4 * 20;
String second = "";
if (an % 4 == 0) {
second = "A";
} else if (an % 4 == 1) {
second = "B";
} else if (an % 4 == 2) {
second = "C";
} else if (an % 4 == 3) {
second = "D";
}
return first + "_" + second;
}

public static void main(String[] args) {
System.out.println(5 / 3);
}
/**
* 红色色系0-20,160-180
* 蓝色色系100-120
* 绿色色系60-80
* 黄色色系23-38
* 识别出的颜色会标记为白色,其他的为黑色
* @param min
* @param max
*/
public static Mat findColorbyHSV(Mat source, int min, int max) {
Mat hsv_image = new Mat();
Imgproc.GaussianBlur(source, source, new Size(3, 3), 0, 0);
Imgproc.cvtColor(source, hsv_image, Imgproc.COLOR_BGR2HSV);
// String imagenameb = "D:\\test\\testImge\\ttbefore.jpg";
// Highgui.imwrite(imagenameb, hsv_image);
Mat thresholded = new Mat();
Core.inRange(hsv_image, new Scalar(min, 90, 90), new Scalar(max, 255, 255), thresholded);
return thresholded;
}

/**
* 查找黑色
* @param source
* @param min
* @param max
* @return
*/
public static Mat findBlackColorbyHSV(Mat source) {
Mat hsv_image = new Mat();
Imgproc.GaussianBlur(source, source, new Size(3, 3), 0, 0);
Imgproc.cvtColor(source, hsv_image, Imgproc.COLOR_BGR2HSV);
String imagenameb = "D:\\test\\testImge\\ttbefore.jpg";
Highgui.imwrite(imagenameb, hsv_image);
Mat thresholded = new Mat();
Core.inRange(hsv_image, new Scalar(0, 0, 0), new Scalar(180, 255, 46), thresholded);
String ttblack = "D:\\test\\testImge\\ttblack.jpg";
Highgui.imwrite(ttblack, thresholded);
return thresholded;
}

/**
* 水平投影
* @param source 传入灰度图片Mat
* @return
*/
public static Mat horizontalProjection(Mat source) {
Mat dst = new Mat(source.rows(), source.cols(), source.type());
// 先进行反转二值化
Imgproc.threshold(source, dst, 150, 255, Imgproc.THRESH_BINARY_INV);
// 水平积分投影
// 每一行的白色像素的个数
int[] rowswidth = new int[dst.rows()];
for (int i = 0; i < dst.rows(); i++) {
for (int j = 0; j < dst.cols(); j++) {
if (dst.get(i, j)[0] == 255) {
rowswidth[i]++;
}
}
}
// 定义一个白色跟原图一样大小的画布
Mat matResult = new Mat(dst.rows(), dst.cols(), CvType.CV_8UC1, new Scalar(255, 255, 255));
// 将每一行按照行像素值大小填充像素宽度
for (int i = 0; i < matResult.rows(); i++) {
for (int j = 0; j < rowswidth[i]; j++) {
matResult.put(i, j, 0);
}
}
return matResult;
}

/**
* 垂直投影
* @param source 传入灰度图片Mat
* @return
*/
public static Mat verticalProjection(Mat source) {
// 先进行反转二值化
Mat dst = new Mat(source.rows(), source.cols(), source.type());
Imgproc.threshold(source, dst, 150, 255, Imgproc.THRESH_BINARY_INV);
// 垂直积分投影
// 每一列的白色像素的个数
int[] colswidth = new int[dst.cols()];
for (int j = 0; j < dst.cols(); j++) {
for (int i = 0; i < dst.rows(); i++) {
if (dst.get(i, j)[0] == 255) {
colswidth[j]++;
}
}
}
Mat matResult = new Mat(dst.rows(), dst.cols(), CvType.CV_8UC1, new Scalar(255, 255, 255));
// 将每一列按照列像素值大小填充像素宽度
for (int j = 0; j < matResult.cols(); j++) {
for (int i = 0; i < colswidth[j]; i++) {
matResult.put(matResult.rows() - 1 - i, j, 0);
}
}
return matResult;
}

/**
* 图片切块
* @param srcMat 传入水平或垂直投影的图片对象Mat
* @param proType 传入投影Mat对象的 投影方式0:垂直投影图片,竖向切割;1:水平投影图片,横向切割
* @param rowY 由于传来的是原始图片的部分切片,要计算切块的实际坐标位置需要给出切片时所在的坐标,所以需要传递横向切片的y坐标或者纵向切片的横坐标
* 如当proType==0时,传入的是切片的垂直投影,那么切成块后能得出x坐标及块宽高度,但是实际y坐标需要加上原切片的y坐标值,所以rowXY为切片的y坐标点,
* 同理当proType==1时,rowXY应该为x坐标
* @return
*/
public static List<Rect> getBlockRect(Mat srcImg, Integer proType, int rowXY) {
Imgproc.threshold(srcImg, srcImg, 150, 255, Imgproc.THRESH_BINARY_INV);
// 注意 countNonZero 方法是获取非0像素(白色像素)数量,所以一般要对图像进行二值化反转
List<Rect> rectList = new ArrayList<Rect>();
int size = proType == 0 ? srcImg.cols() : srcImg.rows();
int[] pixNum = new int[size];
if (proType == 0) {
for (int i = 0; i < srcImg.cols(); i++) {
Mat col = srcImg.col(i);
pixNum[i] = Core.countNonZero(col) > 1 ? Core.countNonZero(col) : 0;
}
} else {// 水平投影只关注行
for (int i = 0; i < srcImg.rows(); i++) {
Mat row = srcImg.row(i);
pixNum[i] = Core.countNonZero(row) > 1 ? Core.countNonZero(row) : 0;
}
}
int startIndex = 0;// 记录进入字符区的索引
int endIndex = 0;// 记录进入空白区域的索引
boolean inBlock = false;// 是否遍历到了字符区内
for (int i = 0; i < size; i++) {
if (!inBlock && pixNum[i] != 0) {// 进入字符区,上升跳变沿
inBlock = true;
startIndex = i;
} else if (pixNum[i] == 0 && inBlock) {// 进入空白区,下降跳变沿存储
endIndex = i;
inBlock = false;
Rect rect = null;
if (proType == 0) {
rect = new Rect(startIndex, rowXY, (endIndex - startIndex), srcImg.rows());
} else {
rect = new Rect(rowXY, startIndex, srcImg.cols(), (endIndex - startIndex));
}
rectList.add(rect);
}
}
return rectList;
}

}

+ 241
- 0
src/main/java/com/acts/opencv/base/PageController.java View File

@@ -0,0 +1,241 @@
package com.acts.opencv.base;

import java.io.File;
import java.util.Vector;

import javax.servlet.http.HttpServletResponse;

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import org.opencv.core.Core;
import org.opencv.core.Core.MinMaxLocResult;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.acts.opencv.common.utils.Constants;
import com.acts.opencv.common.utils.OpenCVUtil;
import com.acts.opencv.common.web.BaseController;
import com.acts.opencv.demo.DemoController;


@Controller
@RequestMapping(value = "page")
public class PageController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);

/**
* 答题卡识别优化
* 创建者 Songer
* 创建时间 2018年3月23日
*/
@RequestMapping(value = "pageOCR")
public void pageOCR(HttpServletResponse response, String imagefile, Integer ocrType) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 页码识别");

String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
// Mat sourceMat = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
// String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "dtk0.png";
// Highgui.imwrite(destPath, sourceMat);
String result = "";
if (ocrType == 1) {// tesseract ocr 识别方式
result = getPageNoByTesseract(sourcePath);
} else if (ocrType == 2) {// 轮廓识别
result = getPageNoByContours(sourcePath);
} else {
result = getPageNoByTemplate(sourcePath);
}
renderString(response, result);
}

// public static void main(String[] args) {
// long t1 = new Date().getTime();
// try {
// File imageFile = new File("D:\\test\\testImge\\t3.bmp");
// Tesseract instance = new Tesseract(); // JNA Interface Mapping
// instance.setLanguage("chi_sim");
// String result = instance.doOCR(imageFile);
// System.out.println("result=====" + result);
// long t2 = new Date().getTime();
// System.out.println((t2 - t1));
// } catch (TesseractException e) {
// e.printStackTrace();
// }
// }

/**
* 使用tesseract方式识别页码,注意tessdata放到tomcat的bin目录下
* @Author 王嵩
* @param filePath
* @return String
* @Date 2018年4月4日
* 更新日志
* 2018年4月4日 王嵩 首次创建
*
*/
public String getPageNoByTesseract(String filePath) {
String result = "";
try {
File file = new File(filePath);
Tesseract instance = new Tesseract(); // JNA Interface Mapping
instance.setLanguage("chi_sim");//
result = instance.doOCR(file);
logger.info("result====={}", result);
} catch (TesseractException e) {
e.printStackTrace();
}
return result;
}

/**
* 使用轮廓识别页码
* @Author 王嵩
* @param filePath
* @return String
* @Date 2018年4月8日
* 更新日志
* 2018年4月8日 王嵩 首次创建
*
*/
public String getPageNoByContours(String filePath) {
Mat source = Highgui.imread(filePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
System.out.println("row" + source.rows() + " col " + source.cols());
// 二值化反转
Mat bininv = new Mat(source.rows(), source.cols(), source.type());
Imgproc.threshold(source, bininv, 170, 255, Imgproc.THRESH_BINARY_INV);
// 腐蚀膨胀,用于消除噪点和干扰项
Mat destination = OpenCVUtil.eroding(bininv);
destination = OpenCVUtil.dilation(destination);
// 轮廓识别
Vector<MatOfPoint> contours = OpenCVUtil.findContours(destination);
int pageSize = 0;
// 原颜色图片加载,用于画出识别轮廓,实际开发不需要
Mat image = Highgui.imread(filePath, Highgui.CV_LOAD_IMAGE_COLOR);
for (int i = 0; i < contours.size(); i++) {
Mat result = new Mat(destination.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));
Imgproc.drawContours(result, contours, i, new Scalar(0, 0, 255), 1);
MatOfPoint mop = contours.get(i);
// 获取轮廓面积
double contArea = Math.abs(Imgproc.contourArea(mop, false));
Rect r = Imgproc.boundingRect(mop);
System.out.println("轮廓面积:" + contArea);
if (contArea > 1200) {// 此处是根据轮廓面积
// 红线画出识别的轮廓
Core.rectangle(image, new Point(r.x, r.y), new Point(r.x + r.width, r.y
+ r.height), new Scalar(0, 0, 255), 2);
pageSize++;
}
}

String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "page0.png";
Highgui.imwrite(destPath, image);
System.out.println("页码为:" + pageSize);
return pageSize + "";
}

/**
* 使用模板匹配识别页码
* @Author 王嵩
* @param filePath
* @return String
* @Date 2018年4月8日
* 更新日志
* 2018年4月8日 王嵩 首次创建
*/
public String getPageNoByTemplate(String filePath) {
String pageSize = "";
Mat source = Highgui.imread(filePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
// 二值化反转
Mat bininv = new Mat(source.rows(), source.cols(), source.type());
Imgproc.threshold(source, bininv, 170, 255, Imgproc.THRESH_BINARY_INV);
Vector<MatOfPoint> contours1 = OpenCVUtil.findContours(bininv);
MatOfPoint mop = contours1.get(0);
Rect rect = Imgproc.boundingRect(mop);
Mat matchtemp = source.submat(rect.y, rect.y + rect.height, rect.x, rect.x + rect.width);
String page_temp = Constants.PATH + Constants.DEST_IMAGE_PATH + "page_temp.png";
Highgui.imwrite(page_temp, matchtemp);
String pagePath = Constants.PATH + Constants.SOURCE_IMAGE_PATH + "shuzi.png";
Mat pageimage = Highgui.imread(pagePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
int result_cols = pageimage.cols() - matchtemp.cols() + 1;
int result_rows = pageimage.rows() - matchtemp.rows() + 1;
Mat destination = new Mat(result_rows, result_cols, CvType.CV_32FC1);

Imgproc.matchTemplate(pageimage, matchtemp, destination, Imgproc.TM_CCOEFF);
// 矩阵归一化处理
Core.normalize(destination, destination, 0, 255, Core.NORM_MINMAX, -1, new Mat());
MinMaxLocResult minmaxLoc = Core.minMaxLoc(destination);
Point matchLoc = minmaxLoc.maxLoc;
Core.rectangle(pageimage, matchLoc, new Point(matchLoc.x + matchtemp.cols(), matchLoc.y + matchtemp.rows()),
new Scalar(0), 2);
System.out.println(matchLoc.x + " " + matchLoc.y);
pageSize = getPage(matchLoc.x) + "";
String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "page1.png";
Highgui.imwrite(destPath, pageimage);
return pageSize;
}


/**
* 根据横坐标返回页码
* @Author 王嵩
* @param x
* @return int
* @Date 2018年4月8日
* 更新日志
* 2018年4月8日 王嵩 首次创建
*
*/
public int getPage(double x) {
// 减去2像素,是因为shuzi.png外边框是预留了2像素的,因此匹配结果坐标为:2,2;72,2;142,2
// Math.floor 返回不大于的最大整数
return (int) Math.floor((x - 2) / 70) + 1;
}
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat markmat1 = Highgui.imread("D:\\test\\abc\\1.png", Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat markmat2 = Highgui.imread("D:\\test\\abc\\2.png", Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Vector<MatOfPoint> contours1 = OpenCVUtil.findContours(markmat1);
Vector<MatOfPoint> contours2 = OpenCVUtil.findContours(markmat2);
Mat mat1 = getSimMark("D:\\test\\abc\\1.png");
Mat mat2 = getSimMark("D:\\test\\abc\\2.png");
double result1 = Imgproc.matchShapes(contours1.get(0), contours2.get(0), Imgproc.CV_CONTOURS_MATCH_I1, 0);
double result2 = Imgproc.matchShapes(mat1, mat2, Imgproc.CV_CONTOURS_MATCH_I1, 0);
System.out.println(result1);
System.out.println(result2);
}

private static MatOfPoint getSimMark(String path) {
Mat markmat = Highgui.imread(path, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
// Imgproc.threshold(markmat, markmat, 190, 255, Imgproc.THRESH_BINARY_INV);
Vector<MatOfPoint> contours = new Vector<MatOfPoint>();
Mat rsmat = new Mat();
Imgproc.findContours(markmat, contours, rsmat, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point());
MatOfPoint markMop = new MatOfPoint();
Mat result = new Mat(markmat.size(), CvType.CV_8U, new Scalar(255));
Imgproc.drawContours(result, contours, 0, new Scalar(0), 1);
String image1 = "d:\\test\\abc\\t.jpg";
Highgui.imwrite(image1, result);
for (int i = 0; i < contours.size(); i++) {
markMop = contours.get(0);
// MatOfPoint2f mat2f = new MatOfPoint2f();
// MatOfPoint2f dstmat2f = new MatOfPoint2f();
// markMop.convertTo(mat2f, CvType.CV_32FC1);
// // 多边形逼近算法,减少轮廓的顶点,便于对比
// Imgproc.approxPolyDP(mat2f, dstmat2f, markMop.total() * 0.02, true);
// dstmat2f.convertTo(markMop, CvType.CV_32S);
}
return markMop;
}
}

+ 174
- 0
src/main/java/com/acts/opencv/base/RealTestController.java View File

@@ -0,0 +1,174 @@
package com.acts.opencv.base;

import java.io.IOException;
import java.util.Date;

import javax.servlet.http.HttpServletResponse;

import org.opencv.core.Core;
import org.opencv.core.Core.MinMaxLocResult;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.acts.opencv.common.utils.Constants;
import com.acts.opencv.common.utils.OpenCVUtil;
import com.acts.opencv.common.web.BaseController;
import com.acts.opencv.demo.DemoController;


@Controller
@RequestMapping(value = "real")
public class RealTestController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);

/**
* 图像矫正透视变换
* 创建者 Songer
* 创建时间 2018年4月10日
*/
@RequestMapping(value = "test")
public void rectification(HttpServletResponse response, String imagefile, Integer markType) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 图像矫正透视变换");

String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
// 加载为灰度图显示
Mat source1 = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
Mat source2 = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
long time1 = new Date().getTime();
Point anchor01 = new Point();
Point anchor02 = new Point();
Point anchor03 = new Point();
Point anchor04 = new Point();
if (markType == 1) {// 模板匹配识别定位点
String matchPath = Constants.PATH + Constants.SOURCE_IMAGE_PATH + "z1_temp.png";
Mat mattmp = Highgui.imread(matchPath, Highgui.CV_LOAD_IMAGE_COLOR);
fetchAnchorPoints1(source1, mattmp, anchor01, anchor02, anchor03, anchor04);
} else if (markType == 2) {// 霍夫圆检测识别定位点
// fetchAnchorPoints2(sourcePath, anchor01, anchor02, anchor03, anchor04);
}
MatOfPoint mop = new MatOfPoint(anchor01, anchor02, anchor03, anchor04);
MatOfPoint2f mat2f = new MatOfPoint2f();
MatOfPoint2f refmat2f = new MatOfPoint2f();
mop.convertTo(mat2f, CvType.CV_32FC1);

// List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
// contours.add(mop);
// Core.polylines(source2, contours, true, new Scalar(0, 0, 255), 1);
// String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect1.png";
// Highgui.imwrite(destPath, source2);
Point point11 = new Point(99, 200);
Point point12 = new Point(2317, 200);
Point point13 = new Point(99, 3300);
Point point14 = new Point(2317, 3300);

Mat dst_vertices = new MatOfPoint(point11, point12, point13, point14);
dst_vertices.convertTo(refmat2f, CvType.CV_32FC1);
Mat warpMatrix = Imgproc.getPerspectiveTransform(mat2f, refmat2f);

Mat dst = new Mat(source1.rows(), source1.cols(), source1.type());
System.out.println(source1.rows() + " " + source1.cols());
Imgproc.warpPerspective(source1, dst, warpMatrix, dst.size(), Imgproc.INTER_LINEAR, 0,
new Scalar(255, 255, 255));
// destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect2.png";
// Highgui.imwrite(destPath, dst);
long time2 = new Date().getTime();
logger.info("耗时(ms):==============" + (time2 - time1));
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(dst);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 获得锚点(定位点)
* 方法1,通过模板匹配圆心,应该换成正方形也可以,之前模板匹配不行是因为模板图形不是最小的
* @Author 王嵩
* @param src
* @param mattmp
* @param anchor01
* @param anchor02
* @param anchor03
* @param anchor04 void
* @Date 2018年2月7日
* 更新日志
* 2018年2月7日 王嵩 首次创建
*
*/
public static void fetchAnchorPoints1(Mat grayImage, Mat mattmp, Point anchor01, Point anchor02,
Point anchor03,
Point anchor04) {
long t1 = new Date().getTime();
Mat imagematch = new Mat();
Point maxLoc01, maxLoc02, maxLoc03, maxLoc04;
int srcRows = grayImage.rows();
int srcCols = grayImage.cols();
Mat src01 = grayImage.submat(new Rect(0, 0, srcCols / 2, srcRows / 2));
Mat src02 = grayImage.submat(new Rect(srcCols / 2, 0, srcCols / 2, srcRows / 2));
Mat src03 = grayImage.submat(new Rect(0, srcRows / 2, srcCols / 2, srcRows / 2));
Mat src04 = grayImage.submat(new Rect(srcCols / 2, srcRows / 2, srcCols / 2, srcRows / 2));

Imgproc.matchTemplate(mattmp, src01, imagematch, Imgproc.TM_CCOEFF_NORMED);
MinMaxLocResult minmaxLoc1 = Core.minMaxLoc(imagematch);
// System.out.println("minmaxLoc1.maxVal:" + minmaxLoc1.maxVal);
maxLoc01 = minmaxLoc1.maxLoc;
anchor01.x = maxLoc01.x;
anchor01.y = maxLoc01.y;
// Core.circle(grayImage, maxLoc01, 3, new Scalar(0, 0, 255), 3);
// String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_c1.png";
// Highgui.imwrite(destPath, grayImage);
long t2 = new Date().getTime();
System.out.println("第1坐标耗时:"+(t2-t1));
Imgproc.matchTemplate(mattmp, src02, imagematch, Imgproc.TM_CCOEFF_NORMED);
MinMaxLocResult minmaxLoc2 = Core.minMaxLoc(imagematch);
// System.out.println("minmaxLoc2.maxVal:" + minmaxLoc2.maxVal);
maxLoc02 = minmaxLoc2.maxLoc;
anchor02.x = maxLoc02.x + srcCols / 2;
anchor02.y = maxLoc02.y;
// Core.circle(grayImage, anchor02, 3, new Scalar(0, 0, 255), 3);
// destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_c2.png";
// Highgui.imwrite(destPath, grayImage);
long t3 = new Date().getTime();
System.out.println("第2坐标耗时:"+(t3-t2));
Imgproc.matchTemplate(mattmp, src03, imagematch, Imgproc.TM_CCOEFF_NORMED);
MinMaxLocResult minmaxLoc3 = Core.minMaxLoc(imagematch);
// System.out.println("minmaxLoc3.maxVal:" + minmaxLoc3.maxVal);
maxLoc03 = minmaxLoc3.maxLoc;
anchor03.x = maxLoc03.x;
anchor03.y = maxLoc03.y + srcRows / 2;
// Core.circle(grayImage, anchor03, 3, new Scalar(0, 0, 255), 3);
// destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_c3.png";
// Highgui.imwrite(destPath, grayImage);
long t4 = new Date().getTime();
System.out.println("第3坐标耗时:"+(t4-t3));
Imgproc.matchTemplate(mattmp, src04, imagematch, Imgproc.TM_CCOEFF_NORMED);
MinMaxLocResult minmaxLoc4 = Core.minMaxLoc(imagematch);
// System.out.println("minmaxLoc4.maxVal:" + minmaxLoc4.maxVal);
maxLoc04 = minmaxLoc4.maxLoc;
anchor04.x = maxLoc04.x + srcCols / 2;
anchor04.y = maxLoc04.y + srcRows / 2;
long t5 = new Date().getTime();
System.out.println("第4坐标耗时:"+(t5-t4));
// Core.circle(grayImage, anchor04, 3, new Scalar(0, 0, 255), 3);
// destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_c4.png";
// Highgui.imwrite(destPath, grayImage);

}



}

+ 279
- 0
src/main/java/com/acts/opencv/base/RectificationController.java View File

@@ -0,0 +1,279 @@
package com.acts.opencv.base;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.opencv.core.Core;
import org.opencv.core.Core.MinMaxLocResult;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.acts.opencv.common.utils.Constants;
import com.acts.opencv.common.utils.OpenCVUtil;
import com.acts.opencv.common.web.BaseController;
import com.acts.opencv.demo.DemoController;


@Controller
@RequestMapping(value = "rect")
public class RectificationController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);

/**
* 图像矫正透视变换
* 创建者 Songer
* 创建时间 2018年4月10日
*/
@RequestMapping(value = "rectification")
public void rectification(HttpServletResponse response, String imagefile, Integer markType) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\n 图像矫正透视变换");

String sourcePath = Constants.PATH + imagefile;
logger.info("url==============" + sourcePath);
// 加载为灰度图显示
Mat source1 = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
Mat source2 = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Point anchor01 = new Point();
Point anchor02 = new Point();
Point anchor03 = new Point();
Point anchor04 = new Point();
if (markType == 1) {// 模板匹配识别定位点
String matchPath = Constants.PATH + Constants.SOURCE_IMAGE_PATH + "z1_temp.png";
fetchAnchorPoints1(sourcePath, matchPath, anchor01, anchor02, anchor03, anchor04);
} else if (markType == 2) {// 霍夫圆检测识别定位点
fetchAnchorPoints2(sourcePath, anchor01, anchor02, anchor03, anchor04);
}
MatOfPoint mop = new MatOfPoint(anchor01, anchor02, anchor03, anchor04);
MatOfPoint2f mat2f = new MatOfPoint2f();
MatOfPoint2f refmat2f = new MatOfPoint2f();
mop.convertTo(mat2f, CvType.CV_32FC1);

List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
contours.add(mop);
Core.polylines(source2, contours, true, new Scalar(0, 0, 255), 1);
String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect1.png";
Highgui.imwrite(destPath, source2);
// Point point11 = anchor01;
// Point point12 = new Point(anchor02.x, anchor01.y);
// Point point13 = new Point(anchor01.x, anchor03.y);
// Point point14 = new Point(anchor02.x, anchor03.y);
Point point11 = new Point(99, 200);
Point point12 = new Point(2317, 200);
Point point13 = new Point(99, 3300);
Point point14 = new Point(2317, 3300);

Mat dst_vertices = new MatOfPoint(point11, point12, point13, point14);
dst_vertices.convertTo(refmat2f, CvType.CV_32FC1);
Mat warpMatrix = Imgproc.getPerspectiveTransform(mat2f, refmat2f);

Mat dst = new Mat(source1.rows(), source1.cols(), source1.type());
System.out.println(source1.rows() + " " + source1.cols());
Imgproc.warpPerspective(source1, dst, warpMatrix, dst.size(), Imgproc.INTER_LINEAR, 0,
new Scalar(255, 255, 255));
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect2.png";
Highgui.imwrite(destPath, dst);
try {
byte[] imgebyte = OpenCVUtil.covertMat2Byte1(dst);
renderImage(response, imgebyte);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 获得锚点(定位点)
* 方法1,通过模板匹配圆心,应该换成正方形也可以,之前模板匹配不行是因为模板图形不是最小的
* @Author 王嵩
* @param src
* @param mattmp
* @param anchor01
* @param anchor02
* @param anchor03
* @param anchor04 void
* @Date 2018年2月7日
* 更新日志
* 2018年2月7日 王嵩 首次创建
*
*/
public static void fetchAnchorPoints1(String sourcePath, String matchPath, Point anchor01, Point anchor02,
Point anchor03,
Point anchor04) {
Mat imagematch = new Mat();
Mat colorimage = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
Point maxLoc01, maxLoc02, maxLoc03, maxLoc04;
int srcRows = colorimage.rows();
int srcCols = colorimage.cols();
Mat src01 = colorimage.submat(new Rect(0, 0, srcCols / 2, srcRows / 2));
Mat src02 = colorimage.submat(new Rect(srcCols / 2, 0, srcCols / 2, srcRows / 2));
Mat src03 = colorimage.submat(new Rect(0, srcRows / 2, srcCols / 2, srcRows / 2));
Mat src04 = colorimage.submat(new Rect(srcCols / 2, srcRows / 2, srcCols / 2, srcRows / 2));
// Highgui.imwrite("D://ttt/t1.jpg", src01);
// Highgui.imwrite("D://ttt/t2.jpg", src02);
// Highgui.imwrite("D://ttt/t3.jpg", src03);
// Highgui.imwrite("D://ttt/t4.jpg", src04);
Mat mattmp = Highgui.imread(matchPath, Highgui.CV_LOAD_IMAGE_COLOR);
Imgproc.matchTemplate(mattmp, src01, imagematch, Imgproc.TM_CCOEFF_NORMED);
// Core.normalize(imagematch, imagematch, 0, 1, Core.NORM_MINMAX, -1, new Mat());
MinMaxLocResult minmaxLoc1 = Core.minMaxLoc(imagematch);
System.out.println("minmaxLoc1.maxVal:" + minmaxLoc1.maxVal);
maxLoc01 = minmaxLoc1.maxLoc;
anchor01.x = maxLoc01.x;
anchor01.y = maxLoc01.y;
Core.circle(colorimage, maxLoc01, 3, new Scalar(0, 0, 255), 3);
String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_c1.png";
Highgui.imwrite(destPath, colorimage);

Imgproc.matchTemplate(mattmp, src02, imagematch, Imgproc.TM_CCOEFF_NORMED);
// Core.normalize(imagematch, imagematch, 0, 1, Core.NORM_MINMAX, -1, new Mat());
MinMaxLocResult minmaxLoc2 = Core.minMaxLoc(imagematch);
System.out.println("minmaxLoc2.maxVal:" + minmaxLoc2.maxVal);
maxLoc02 = minmaxLoc2.maxLoc;
anchor02.x = maxLoc02.x + srcCols / 2;
anchor02.y = maxLoc02.y;
Core.circle(colorimage, anchor02, 3, new Scalar(0, 0, 255), 3);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_c2.png";
Highgui.imwrite(destPath, colorimage);

Imgproc.matchTemplate(mattmp, src03, imagematch, Imgproc.TM_CCOEFF_NORMED);
// Core.normalize(imagematch, imagematch, 0, 1, Core.NORM_MINMAX, -1, new Mat());
MinMaxLocResult minmaxLoc3 = Core.minMaxLoc(imagematch);
System.out.println("minmaxLoc3.maxVal:" + minmaxLoc3.maxVal);
maxLoc03 = minmaxLoc3.maxLoc;
anchor03.x = maxLoc03.x;
anchor03.y = maxLoc03.y + srcRows / 2;
Core.circle(colorimage, anchor03, 3, new Scalar(0, 0, 255), 3);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_c3.png";
Highgui.imwrite(destPath, colorimage);

Imgproc.matchTemplate(mattmp, src04, imagematch, Imgproc.TM_CCOEFF_NORMED);
// Core.normalize(imagematch, imagematch, 0, 1, Core.NORM_MINMAX, -1, new Mat());
MinMaxLocResult minmaxLoc4 = Core.minMaxLoc(imagematch);
System.out.println("minmaxLoc4.maxVal:" + minmaxLoc4.maxVal);
maxLoc04 = minmaxLoc4.maxLoc;
anchor04.x = maxLoc04.x + srcCols / 2;
anchor04.y = maxLoc04.y + srcRows / 2;
Core.circle(colorimage, anchor04, 3, new Scalar(0, 0, 255), 3);
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_c4.png";
Highgui.imwrite(destPath, colorimage);

}

/**
* 获得锚点(定位点)
* 方法2,霍夫曼圆变换查找定位点
* @Author 王嵩
* @param src
* @param mattmp
* @param anchor01
* @param anchor02
* @param anchor03
* @param anchor04 void
* @Date 2018年2月7日
* 更新日志
* 2018年2月7日 王嵩 首次创建
*
*/
public static void fetchAnchorPoints2(String sourcePath, Point anchor01, Point anchor02, Point anchor03,
Point anchor04) {
Mat src = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat colorimage = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_COLOR);
int srcRows = src.rows();
int srcCols = src.cols();
Mat source1 = src.submat(new Rect(0, 0, srcRows / 2, srcRows / 2));
Mat source2 = src.submat(new Rect(srcCols / 2, 0, srcCols / 2, srcRows / 2));
Mat source3 = src.submat(new Rect(0, srcRows / 2, srcCols / 2, srcRows / 2));
Mat source4 = src.submat(new Rect(srcCols / 2, srcRows / 2, srcCols / 2, srcRows / 2));

Mat src01 = colorimage.submat(new Rect(0, 0, srcRows / 2, srcRows / 2));
Mat src02 = colorimage.submat(new Rect(srcCols / 2, 0, srcCols / 2, srcRows / 2));
Mat src03 = colorimage.submat(new Rect(0, srcRows / 2, srcCols / 2, srcRows / 2));
Mat src04 = colorimage.submat(new Rect(srcCols / 2, srcRows / 2, srcCols / 2, srcRows / 2));

// Mat rrr = OpenCVUtil.imageBinary(src01);
Mat circles = new Mat();// 声明一个向量,保存检测出的圆的圆心坐标和半径
Imgproc.HoughCircles(source1, circles, Imgproc.CV_HOUGH_GRADIENT, 1.0, 300 / 8, 200, 90, 10, 50);// 霍夫变换检测圆
System.out.println("图片高 宽:" + src.rows() + " " + src.cols());
System.out.println(circles.cols());
int cols = circles.cols();
if (cols > 0) {
for (int i = 0; i < circles.cols(); i++) {
double vCircle[] = circles.get(0, i);
Point center = new Point(vCircle[0], vCircle[1]);
int radius = (int) Math.round(vCircle[2]);
Core.circle(src01, center, 3, new Scalar(0, 255, 0), -1, 8, 0);
Core.circle(src01, center, radius, new Scalar(0, 0, 255), 3, 8, 0);
anchor01.x = vCircle[0];
anchor01.y = vCircle[1];

}
}
String destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_cc1.png";
Highgui.imwrite(destPath, src01);

Imgproc.HoughCircles(source2, circles, Imgproc.CV_HOUGH_GRADIENT, 1.0, 300 / 8, 200, 90, 10, 50);// 霍夫变换检测圆
System.out.println(circles.cols());
if (circles.cols() > 0) {
for (int i = 0; i < circles.cols(); i++) {
double vCircle[] = circles.get(0, i);
Point center = new Point(vCircle[0], vCircle[1]);
int radius = (int) Math.round(vCircle[2]);
Core.circle(src02, center, 3, new Scalar(0, 255, 0), -1, 8, 0);
Core.circle(src02, center, radius, new Scalar(0, 0, 255), 3, 8, 0);
anchor02.x = vCircle[0] + srcCols / 2;
anchor02.y = vCircle[1];
}
}
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_cc2.png";
Highgui.imwrite(destPath, src02);

Imgproc.HoughCircles(source3, circles, Imgproc.CV_HOUGH_GRADIENT, 1.0, 300 / 8, 200, 90, 10, 50);// 霍夫变换检测圆
System.out.println(circles.cols());
if (circles.cols() > 0) {
for (int i = 0; i < circles.cols(); i++) {
double vCircle[] = circles.get(0, i);
Point center = new Point(vCircle[0], vCircle[1]);
int radius = (int) Math.round(vCircle[2]);
Core.circle(src03, center, 3, new Scalar(0, 255, 0), -1, 8, 0);
Core.circle(src03, center, radius, new Scalar(0, 0, 255), 3, 8, 0);
anchor03.x = vCircle[0];
anchor03.y = vCircle[1] + srcRows / 2;
}
}
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_cc3.png";
Highgui.imwrite(destPath, src03);

Imgproc.HoughCircles(source4, circles, Imgproc.CV_HOUGH_GRADIENT, 1.0, 300 / 8, 200, 90, 10, 50);// 霍夫变换检测圆
System.out.println(circles.cols());
if (circles.cols() > 0) {
for (int i = 0; i < circles.cols(); i++) {
double vCircle[] = circles.get(0, i);
Point center = new Point(vCircle[0], vCircle[1]);
int radius = (int) Math.round(vCircle[2]);
Core.circle(src04, center, 3, new Scalar(0, 255, 0), -1, 8, 0);
Core.circle(src04, center, radius, new Scalar(0, 0, 255), 3, 8, 0);
anchor04.x = vCircle[0] + srcCols / 2;
anchor04.y = vCircle[1] + srcRows / 2;
}
}
destPath = Constants.PATH + Constants.DEST_IMAGE_PATH + "rect_cc4.png";
Highgui.imwrite(destPath, src04);

}


}

+ 50
- 0
src/main/java/com/acts/opencv/common/mapper/BeanMapper.java View File

@@ -0,0 +1,50 @@
package com.acts.opencv.common.mapper;

import java.util.Collection;
import java.util.List;

import org.dozer.DozerBeanMapper;

import com.google.common.collect.Lists;
/**
* 简单封装Dozer, 实现深度转换Bean<->Bean的Mapper.实现:
* 1. 持有Mapper的单例.
* 2. 返回值类型转换.
* 3. 批量转换Collection中的所有对象.
* 4. 区分创建新的B对象与将对象A值复制到已存在的B对象两种函数.
* 创建时间 2017年9月28日
*/
public class BeanMapper {

/**
* 持有Dozer单例, 避免重复创建DozerMapper消耗资源.
*/
private static DozerBeanMapper dozer = new DozerBeanMapper();

/**
* 基于Dozer转换对象的类型.
*/
public static <T> T map(Object source, Class<T> destinationClass) {
return dozer.map(source, destinationClass);
}

/**
* 基于Dozer转换Collection中对象的类型.
*/
@SuppressWarnings("rawtypes")
public static <T> List<T> mapList(Collection sourceList, Class<T> destinationClass) {
List<T> destinationList = Lists.newArrayList();
for (Object sourceObject : sourceList) {
T destinationObject = dozer.map(sourceObject, destinationClass);
destinationList.add(destinationObject);
}
return destinationList;
}

/**
* 基于Dozer将对象A的值拷贝到对象B中.
*/
public static void copy(Object source, Object destinationObject) {
dozer.map(source, destinationObject);
}
}

+ 164
- 0
src/main/java/com/acts/opencv/common/mapper/JaxbMapper.java View File

@@ -0,0 +1,164 @@
package com.acts.opencv.common.mapper;

import java.io.StringReader;
import java.io.StringWriter;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.namespace.QName;

import org.apache.commons.lang3.StringUtils;
import org.springframework.http.converter.HttpMessageConversionException;
import org.springframework.util.Assert;

import com.acts.opencv.common.utils.Exceptions;
import com.acts.opencv.common.utils.Reflections;

/**
* 使用Jaxb2.0实现XML<->Java Object的Mapper.
* 在创建时需要设定所有需要序列化的Root对象的Class.
* 特别支持Root对象是Collection的情形.
* 创建时间 2017年9月28日
*
*/
@SuppressWarnings("rawtypes")
public class JaxbMapper {

private static ConcurrentMap<Class, JAXBContext> jaxbContexts = new ConcurrentHashMap<Class, JAXBContext>();

/**
* Java Object->Xml without encoding.
*/
public static String toXml(Object root) {
Class clazz = Reflections.getUserClass(root);
return toXml(root, clazz, null);
}

/**
* Java Object->Xml with encoding.
*/
public static String toXml(Object root, String encoding) {
Class clazz = Reflections.getUserClass(root);
return toXml(root, clazz, encoding);
}

/**
* Java Object->Xml with encoding.
*/
public static String toXml(Object root, Class clazz, String encoding) {
try {
StringWriter writer = new StringWriter();
createMarshaller(clazz, encoding).marshal(root, writer);
return writer.toString();
} catch (JAXBException e) {
throw Exceptions.unchecked(e);
}
}

/**
* Java Collection->Xml without encoding, 特别支持Root Element是Collection的情形.
*/
public static String toXml(Collection<?> root, String rootName, Class clazz) {
return toXml(root, rootName, clazz, null);
}

/**
* Java Collection->Xml with encoding, 特别支持Root Element是Collection的情形.
*/
public static String toXml(Collection<?> root, String rootName, Class clazz, String encoding) {
try {
CollectionWrapper wrapper = new CollectionWrapper();
wrapper.collection = root;

JAXBElement<CollectionWrapper> wrapperElement = new JAXBElement<CollectionWrapper>(new QName(rootName),
CollectionWrapper.class, wrapper);

StringWriter writer = new StringWriter();
createMarshaller(clazz, encoding).marshal(wrapperElement, writer);

return writer.toString();
} catch (JAXBException e) {
throw Exceptions.unchecked(e);
}
}

/**
* Xml->Java Object.
*/
@SuppressWarnings("unchecked")
public static <T> T fromXml(String xml, Class<T> clazz) {
try {
StringReader reader = new StringReader(xml);
return (T) createUnmarshaller(clazz).unmarshal(reader);
} catch (JAXBException e) {
throw Exceptions.unchecked(e);
}
}

/**
* 创建Marshaller并设定encoding(可为null).
* 线程不安全,需要每次创建或pooling。
*/
public static Marshaller createMarshaller(Class clazz, String encoding) {
try {
JAXBContext jaxbContext = getJaxbContext(clazz);

Marshaller marshaller = jaxbContext.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

if (StringUtils.isNotBlank(encoding)) {
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
}

return marshaller;
} catch (JAXBException e) {
throw Exceptions.unchecked(e);
}
}

/**
* 创建UnMarshaller.
* 线程不安全,需要每次创建或pooling。
*/
public static Unmarshaller createUnmarshaller(Class clazz) {
try {
JAXBContext jaxbContext = getJaxbContext(clazz);
return jaxbContext.createUnmarshaller();
} catch (JAXBException e) {
throw Exceptions.unchecked(e);
}
}

protected static JAXBContext getJaxbContext(Class clazz) {
Assert.notNull(clazz, "'clazz' must not be null");
JAXBContext jaxbContext = jaxbContexts.get(clazz);
if (jaxbContext == null) {
try {
jaxbContext = JAXBContext.newInstance(clazz, CollectionWrapper.class);
jaxbContexts.putIfAbsent(clazz, jaxbContext);
} catch (JAXBException ex) {
throw new HttpMessageConversionException("Could not instantiate JAXBContext for class [" + clazz
+ "]: " + ex.getMessage(), ex);
}
}
return jaxbContext;
}

/**
* 封装Root Element 是 Collection的情况.
*/
public static class CollectionWrapper {

@XmlAnyElement
protected Collection<?> collection;
}

}

+ 302
- 0
src/main/java/com/acts/opencv/common/mapper/JsonMapper.java View File

@@ -0,0 +1,302 @@
package com.acts.opencv.common.mapper;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;

import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
/**
* 简单封装Jackson,实现JSON String<->Java Object的Mapper. 封装不同的输出风格,
* 使用不同的builder函数创建实例.
* 创建时间 2017年9月28日
*
*/
public class JsonMapper extends ObjectMapper {

private static final long serialVersionUID = 1L;

private static Logger logger = LoggerFactory.getLogger(JsonMapper.class);

private static JsonMapper mapper;

public JsonMapper() {
this(Include.NON_NULL);
}

public JsonMapper(Include include) {
// 设置输出时包含属性的风格
if (include != null) {
this.setSerializationInclusion(include);
}
// 允许单引号、允许不带引号的字段名称
this.enableSimple();
// 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性
this.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 空值处理为空串
this.getSerializerProvider().setNullValueSerializer(
new JsonSerializer<Object>() {
@Override
public void serialize(Object value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
jgen.writeString("");
}
});
// 统一默认Date类型转换格式。如果设置,Bean中的@JsonFormat将无效
final String dataFormat = "yyyy-MM-dd HH:mm:ss";
final SimpleDateFormat sdf = new SimpleDateFormat(dataFormat);
if (StringUtils.isNotBlank(dataFormat)) {
this.registerModule(new SimpleModule().addSerializer(Date.class,
new JsonSerializer<Date>() {
@Override
public void serialize(Date value, JsonGenerator jgen,
SerializerProvider provider)
throws IOException, JsonProcessingException {
if (value != null) {
jgen.writeString(sdf.format(value));
}
}
}));
}
// 进行HTML解码。
this.registerModule(new SimpleModule().addSerializer(String.class,
new JsonSerializer<String>() {
@Override
public void serialize(String value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
if (value != null) {
jgen.writeString(StringEscapeUtils
.unescapeHtml4(value));
}
}
}));
// 设置时区
this.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
}

/**
* 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper,建议在外部接口中使用.
*/
public static JsonMapper getInstance() {
if (mapper == null) {
mapper = new JsonMapper().enableSimple();
}
return mapper;
}

/**
* 创建只输出初始值被改变的属性到Json字符串的Mapper, 最节约的存储方式,建议在内部接口中使用。
*/
public static JsonMapper nonDefaultMapper() {
if (mapper == null) {
mapper = new JsonMapper(Include.NON_DEFAULT);
}
return mapper;
}

/**
* Object可以是POJO,也可以是Collection或数组。 如果对象为Null, 返回"null". 如果集合为空集合, 返回"[]".
*/
public String toJson(Object object) {
try {
return this.writeValueAsString(object);
} catch (IOException e) {
logger.warn("write to json string error:" + object, e);
return null;
}
}

/**
* 反序列化POJO或简单Collection如List<String>.
*
* 如果JSON字符串为Null或"null"字符串, 返回Null. 如果JSON字符串为"[]", 返回空集合.
*
* 如需反序列化复杂Collection如List<MyBean>, 请使用fromJson(String,JavaType)
*
* @see #fromJson(String, JavaType)
*/
public <T> T fromJson(String jsonString, Class<T> clazz) {
if (StringUtils.isEmpty(jsonString)) {
return null;
}
try {
return this.readValue(jsonString, clazz);
} catch (IOException e) {
logger.warn("parse json string error:" + jsonString, e);
return null;
}
}

/**
* 反序列化复杂Collection如List<Bean>, 先使用函數createCollectionType构造类型,然后调用本函数.
*
* @see #createCollectionType(Class, Class...)
*/
@SuppressWarnings("unchecked")
public <T> T fromJson(String jsonString, JavaType javaType) {
if (StringUtils.isEmpty(jsonString)) {
return null;
}
try {
return (T) this.readValue(jsonString, javaType);
} catch (IOException e) {
logger.warn("parse json string error:" + jsonString, e);
return null;
}
}

/**
* 構造泛型的Collection Type如: ArrayList<MyBean>,
* 则调用constructCollectionType(ArrayList.class,MyBean.class)
* HashMap<String,MyBean>, 则调用(HashMap.class,String.class, MyBean.class)
*/
public JavaType createCollectionType(Class<?> collectionClass,
Class<?>... elementClasses) {
return this.getTypeFactory().constructParametricType(collectionClass,
elementClasses);
}

/**
* 當JSON裡只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性.
*/
@SuppressWarnings("unchecked")
public <T> T update(String jsonString, T object) {
try {
return (T) this.readerForUpdating(object).readValue(jsonString);
} catch (JsonProcessingException e) {
logger.warn("update json string:" + jsonString + " to object:"
+ object + " error.", e);
} catch (IOException e) {
logger.warn("update json string:" + jsonString + " to object:"
+ object + " error.", e);
}
return null;
}

/**
* 輸出JSONP格式數據.
*/
public String toJsonP(String functionName, Object object) {
return toJson(new JSONPObject(functionName, object));
}

/**
* 設定是否使用Enum的toString函數來讀寫Enum, 為False時時使用Enum的name()函數來讀寫Enum, 默認為False.
* 注意本函數一定要在Mapper創建後, 所有的讀寫動作之前調用.
*/
public JsonMapper enableEnumUseToString() {
this.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
this.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
return this;
}

/**
* 支持使用Jaxb的Annotation,使得POJO上的annotation不用与Jackson耦合。
* 默认会先查找jaxb的annotation,如果找不到再找jackson的。
*/
public JsonMapper enableJaxbAnnotation() {
JaxbAnnotationModule module = new JaxbAnnotationModule();
this.registerModule(module);
return this;
}

/**
* 允许单引号 允许不带引号的字段名称
*/
public JsonMapper enableSimple() {
this.configure(Feature.ALLOW_SINGLE_QUOTES, true);
this.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
return this;
}

/**
* 取出Mapper做进一步的设置或使用其他序列化API.
*/
public ObjectMapper getMapper() {
return this;
}

/**
* 对象转换为JSON字符串
*
* @param object
* @return
*/
public static String toJsonString(Object object) {
return JsonMapper.getInstance().toJson(object);
}

/**
* 对象转换为JSONP字符串
*
* @param object
* @return
*/
public static String toJsonPString(String functionName, Object object) {
return JsonMapper.getInstance().toJsonP(functionName, object);
}

/**
* JSON字符串转换为对象
*
* @param jsonString
* @param clazz
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T fromJsonString(String jsonString, Class<?> clazz) {
return (T) JsonMapper.getInstance().fromJson(jsonString, clazz);
}

/**
* 测试
*/
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 1);
map.put("pId", -1);
map.put("name", "根节点");
list.add(map);
map = new HashMap<String, Object>();
map.put("id", 2);
map.put("pId", 1);
map.put("name", "你好");
map.put("open", true);
list.add(map);
String json = JsonMapper.toJsonString(list);
System.out.println(json);
Map<String, Object> map2 = JsonMapper
.fromJsonString(
"{extendS1:{title:'站牌号',sort:1,type:'text',maxlength:0,maxlength:30}, "
+ "extendS2:{title:'规模分类',sort:2,type:'dict',dictType:'scope_category'}}",
Map.class);
System.out.println(map2);

String aaString = "返回值";
System.out.println(JsonMapper.toJsonString(aaString));
}

}

+ 30
- 0
src/main/java/com/acts/opencv/common/mapper/adapters/MapAdapter.java View File

@@ -0,0 +1,30 @@
package com.acts.opencv.common.mapper.adapters;

import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class MapAdapter extends XmlAdapter<MapConvertor, Map<String, Object>> {
@Override
public MapConvertor marshal(Map<String, Object> map) throws Exception {
MapConvertor convertor = new MapConvertor();
for (Map.Entry<String, Object> entry : map.entrySet()) {
MapConvertor.MapEntry e = new MapConvertor.MapEntry(entry);
convertor.addEntry(e);
}
return convertor;
}
@Override
public Map<String, Object> unmarshal(MapConvertor map) throws Exception {
Map<String, Object> result = new HashMap<String, Object>();
for (MapConvertor.MapEntry e : map.getEntries()) {
result.put(e.getKey(), e.getValue());
}
return result;
}
}


+ 63
- 0
src/main/java/com/acts/opencv/common/mapper/adapters/MapConvertor.java View File

@@ -0,0 +1,63 @@
package com.acts.opencv.common.mapper.adapters;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;

@XmlType(name = "MapConvertor")
@XmlAccessorType(XmlAccessType.FIELD)
public class MapConvertor {
private final List<MapEntry> entries = new ArrayList<MapEntry>();
public void addEntry(MapEntry entry) {
entries.add(entry);
}
public List<MapEntry> getEntries() {
return entries;
}
public static class MapEntry {
private String key;
private Object value;
public MapEntry() {
super();
}
public MapEntry(Map.Entry<String, Object> entry) {
super();
this.key = entry.getKey();
this.value = entry.getValue();
}
public MapEntry(String key, Object value) {
super();
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
}

+ 202
- 0
src/main/java/com/acts/opencv/common/utils/CommonUtil.java View File

@@ -0,0 +1,202 @@
package com.acts.opencv.common.utils;

import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.ResourceBundle;
import java.util.UUID;

import org.apache.commons.lang.StringUtils;
public class CommonUtil {

/**
* 除法
*/
public static BigDecimal divide(String arg1, String arg2) {
if (StringUtils.isEmpty(arg1)) {
arg1 = "0.0";
}
if (StringUtils.isEmpty(arg2)) {
arg2 = "0.0";
}
BigDecimal big3 = new BigDecimal("0.00");
if (Double.parseDouble(arg2)!=0) {
BigDecimal big1 = new BigDecimal(arg1);
BigDecimal big2 = new BigDecimal(arg2);
big3 = big1.divide(big2, 6, BigDecimal.ROUND_HALF_EVEN);
}
return big3;
}

/**
* 乘法
*/
public static String mul(String arg1, String arg2) {
if (StringUtils.isEmpty(arg1)) {
arg1 = "0.0";
}
if (StringUtils.isEmpty(arg2)) {
arg2 = "0.0";
}
BigDecimal big1 = new BigDecimal(arg1);
BigDecimal big2 = new BigDecimal(arg2);
BigDecimal big3 = big1.multiply(big2);
return big3.toString();
}

/**
* 减法
*/
public static BigDecimal sub(String arg1, String arg2) {
if (StringUtils.isEmpty(arg1)) {
arg1 = "0.0";
}
if (StringUtils.isEmpty(arg2)) {
arg2 = "0.0";
}
BigDecimal big1 = new BigDecimal(arg1);
BigDecimal big2 = new BigDecimal(arg2);
BigDecimal big3 = big1.subtract(big2);
return big3;
}

/**
* 加法
*/
public static String add(String arg1, String arg2) {
if (StringUtils.isEmpty(arg1)) {
arg1 = "0.0";
}
if (StringUtils.isEmpty(arg2)) {
arg2 = "0.0";
}
BigDecimal big1 = new BigDecimal(arg1);
BigDecimal big2 = new BigDecimal(arg2);
BigDecimal big3 = big1.add(big2);
return big3.toString();
}
/**
* 加法
*/
public static String add2(String arg1, String arg2) {
if (StringUtils.isEmpty(arg1)) {
arg1 = "0.0";
}
if (StringUtils.isEmpty(arg2)) {
arg2 = "0.0";
}
BigDecimal big1 = new BigDecimal(arg1);
BigDecimal big2 = new BigDecimal(arg2);
BigDecimal big3 = big1.add(big2);
return big3.toString();
}

/**
* 四舍五入保留N位小数 先四舍五入在使用double值自动去零
*
* @param arg
* @param scare
* 保留位数
* @return
*/
public static String setScare(BigDecimal arg, int scare) {
BigDecimal bl = arg.setScale(scare, BigDecimal.ROUND_HALF_UP);
return String.valueOf(bl.doubleValue());
}

/**
* 四舍五入保留两位小数 先四舍五入在使用double值自动去零
*
* @param arg
* @return
*/
public static String setDifScare(String arg) {
BigDecimal bd = new BigDecimal(arg);
BigDecimal bl = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
return bl.toString();
}

/**
* 四舍五入保留N位小数 先四舍五入在使用double值自动去零(传参String类型)
*
* @param arg
* @return
*/
public static String setScare(String arg, int i) {
BigDecimal bd = new BigDecimal(arg);
BigDecimal bl = bd.setScale(i, BigDecimal.ROUND_HALF_UP);
return bl.toString();
}

/**
* 判空
*
* @param obj
* @return boolean true为空,false不为空
*/
public static boolean isMissing(Object obj) {
if (null == obj || obj.toString().trim().equals("")) {
return true;
} else {
if (obj instanceof String) {
obj = obj.toString().trim();
}
return false;
}
}


/**
* 获取配置文件参数
* @Author Songer
* @param key
* @return String
* @Date 2017-11-12
* 更新日志
* 2015年3月3日 张志朋 首次创建
*
*/
public static String getPropertiesValue(String key){
ResourceBundle resource = ResourceBundle.getBundle("config");
return resource.getString(key);
}
public static String get32UUID() {
String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
return uuid;
}

/**
*@Function: 判断字符串是否是整数
*@Author: Songer
*@param value
*@return boolean
*@Date: 2017-11-12
*@Modifications:
*@Modifier Name; Date; The Reason for Modifying
*
*/
public static boolean isInteger(String value){
try {
Integer.parseInt(value);
return true;
}catch (NumberFormatException e){
return false;
}
}


/**
* 去除小数末尾可删除的0 1.0->1 1.50->1.5
* @Author Songer
* @return String
* @Date 2017-5-12
* 更新日志
* 2017-12-1 Songer 首次创建
*/
private static NumberFormat removeZero = NumberFormat.getInstance();
public static String removeZero(String num){
return removeZero(Double.valueOf(num));
}
public static String removeZero(Double num){
return removeZero.format(num);
}
}

+ 65
- 0
src/main/java/com/acts/opencv/common/utils/Constants.java View File

@@ -0,0 +1,65 @@
package com.acts.opencv.common.utils;

import org.springframework.web.context.ContextLoader;

/**
* 常量 创建者 Songer 创建时间 2018年3月09日
*
*/
public class Constants {
public static final String CURRENT_USER = "UserInfo";
public static final String WECHAT_USER = "weChatUserInfo";
public static final String REFERENCE_CODE = "referenceCode";

public static final String SUCCESS = "success";
public static final String ERROR = "error";

public static final String SF_FILE_SEPARATOR = System.getProperty("file.separator");// 文件分隔符
public static final String SF_LINE_SEPARATOR = System.getProperty("line.separator");// 行分隔符
public static final String SF_PATH_SEPARATOR = System.getProperty("path.separator");// 路径分隔符


public static final String PATH = ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/");
/**
* 文件
*/
public static final String SOURCE_IMAGE_PATH = Constants.SF_FILE_SEPARATOR + "statics"
+ Constants.SF_FILE_SEPARATOR + "sourceimage" + Constants.SF_FILE_SEPARATOR;// 图片原地址
public static final String DEST_IMAGE_PATH = Constants.SF_FILE_SEPARATOR + "statics" + Constants.SF_FILE_SEPARATOR
+ "destimage" + Constants.SF_FILE_SEPARATOR;// 图片生成地址


/**
* 返回参数规范
*/
/** 区分类型 1 -- 无错误,Code重复 */
public static final String CODE_DUPLICATE = "1";
/** 区分类型 2 -- 无错误,名称重复 */
public static final String NAME_DUPLICATE = "2";
/** 区分类型 3 -- 数量超出 */
public static final String NUMBER_OVER = "3";
/** 区分类型 0 -- 无错误,程序正常执行 */
public static final String NO_ERROR = "0";
/** 区分类型 -1 -- 无错误,返回结果为空 */
public static final String NULL_POINTER = "-1";
/** 区分类型 -2 -- 错误,参数不正确 */
public static final String INCORRECT_PARAMETER = "-2";
/** 区分类型 -3 -- 错误,程序执行错误 */
public static final String PROGRAM_EXECUTION_ERROR = "-3";
/** 区分类型 -5 -- 错误,数据已删除 */
public static final String DATA_DELETED = "-5";
/** 区分类型 -6 -- 错误,参数不一致(验证码) */
public static final String DATA_NOT_SAME = "-6";
/**json文件缺失 */
public static final String NO_JSON_FILE = "-7";


/**
* 分页中可能用到的常量
*/
public static final Integer PAGE_SIZE=10;//一页共有十条内容




}

+ 67
- 0
src/main/java/com/acts/opencv/common/utils/Exceptions.java View File

@@ -0,0 +1,67 @@
package com.acts.opencv.common.utils;
import java.io.PrintWriter;
import java.io.StringWriter;

import javax.servlet.http.HttpServletRequest;
/**
* 关于异常的工具类
* 创建时间 2016年7月21日
*/
public class Exceptions {

/**
* 将CheckedException转换为UncheckedException.
*/
public static RuntimeException unchecked(Exception e) {
if (e instanceof RuntimeException) {
return (RuntimeException) e;
} else {
return new RuntimeException(e);
}
}

/**
* 将ErrorStack转化为String.
*/
public static String getStackTraceAsString(Throwable e) {
if (e == null){
return "";
}
StringWriter stringWriter = new StringWriter();
e.printStackTrace(new PrintWriter(stringWriter));
return stringWriter.toString();
}

/**
* 判断异常是否由某些底层的异常引起.
*/
@SuppressWarnings("unchecked")
public static boolean isCausedBy(Exception ex, Class<? extends Exception>... causeExceptionClasses) {
Throwable cause = ex.getCause();
while (cause != null) {
for (Class<? extends Exception> causeClass : causeExceptionClasses) {
if (causeClass.isInstance(cause)) {
return true;
}
}
cause = cause.getCause();
}
return false;
}

/**
* 在request中获取异常类
* @param request
* @return
*/
public static Throwable getThrowable(HttpServletRequest request){
Throwable ex = null;
if (request.getAttribute("exception") != null) {
ex = (Throwable) request.getAttribute("exception");
} else if (request.getAttribute("javax.servlet.error.exception") != null) {
ex = (Throwable) request.getAttribute("javax.servlet.error.exception");
}
return ex;
}
}

+ 142
- 0
src/main/java/com/acts/opencv/common/utils/OpenCVUtil.java View File

@@ -0,0 +1,142 @@
package com.acts.opencv.common.utils;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;

import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class OpenCVUtil {
public static BufferedImage covertMat2Buffer(Mat mat) throws IOException {
long time1 = new Date().getTime();
// Mat 转byte数组
BufferedImage originalB = (BufferedImage) toBufferedImage(mat);
long time3 = new Date().getTime();
System.out.println("保存读取方法2转=" + (time3 - time1));
return originalB;
// ImageIO.write(originalB, "jpg", new File("D:\\test\\testImge\\ws2.jpg"));
}

public static byte[] covertMat2Byte(Mat mat) throws IOException {
long time1 = new Date().getTime();
// Mat 转byte数组
byte[] return_buff = new byte[(int) (mat.total() * mat.channels())];
Mat mat1 = new Mat();
mat1.get(0, 0, return_buff);
long time3 = new Date().getTime();
System.out.println(mat.total() * mat.channels());
System.out.println("保存读取方法2转=" + (time3 - time1));
return return_buff;
}

public static byte[] covertMat2Byte1(Mat mat) throws IOException {
long time1 = new Date().getTime();
MatOfByte mob = new MatOfByte();
Highgui.imencode(".jpg", mat, mob);
long time3 = new Date().getTime();
// System.out.println(mat.total() * mat.channels());
System.out.println("Mat转byte[] 耗时=" + (time3 - time1));
return mob.toArray();
}

public static Image toBufferedImage(Mat m) {
int type = BufferedImage.TYPE_BYTE_GRAY;
if (m.channels() > 1) {
type = BufferedImage.TYPE_3BYTE_BGR;
}
int bufferSize = m.channels() * m.cols() * m.rows();
byte[] b = new byte[bufferSize];
m.get(0, 0, b); // get all the pixels
BufferedImage image = new BufferedImage(m.cols(), m.rows(), type);
final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
System.arraycopy(b, 0, targetPixels, 0, b.length);
return image;
}

/**
* 腐蚀膨胀是针对于白色区域来说的,腐蚀即腐蚀白色区域
* 腐蚀算法(黑色区域变大)
* @param source
* @return
*/
public static Mat eroding(Mat source) {
return eroding(source, 1);
}

public static Mat eroding(Mat source, double erosion_size) {
Mat resultMat = new Mat(source.rows(), source.cols(), source.type());
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2 * erosion_size + 1,
2 * erosion_size + 1));
Imgproc.erode(source, resultMat, element);
return resultMat;
}

/**
* 腐蚀膨胀是针对于白色区域来说的,膨胀是膨胀白色区域
* 膨胀算法(白色区域变大)
* @param source
* @return
*/
public static Mat dilation(Mat source) {
return dilation(source, 1);
}

/**
* 腐蚀膨胀是针对于白色区域来说的,膨胀是膨胀白色区域
* @Author 王嵩
* @param source
* @param dilationSize 膨胀因子2*x+1 里的x
* @return Mat
* @Date 2018年2月5日
* 更新日志
* 2018年2月5日 王嵩 首次创建
*
*/
public static Mat dilation(Mat source, double dilation_size) {
Mat resultMat = new Mat(source.rows(), source.cols(), source.type());
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2 * dilation_size + 1,
2 * dilation_size + 1));
Imgproc.dilate(source, resultMat, element);
return resultMat;
}

/**
* 轮廓识别,使用最外轮廓发抽取轮廓RETR_EXTERNAL,轮廓识别方法为CHAIN_APPROX_SIMPLE
* @param source 传入进来的图片Mat对象
* @return 返回轮廓结果集
*/
public static Vector<MatOfPoint> findContours(Mat source) {
Mat rs = new Mat();
/**
* 定义轮廓抽取模式
*RETR_EXTERNAL:只检索最外面的轮廓;
*RETR_LIST:检索所有的轮廓,并将其放入list中;
*RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
*RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
*/
int mode = Imgproc.RETR_EXTERNAL;
// int mode = Imgproc.RETR_TREE;
/**
* 定义轮廓识别方法
* 边缘近似方法(除了RETR_RUNS使用内置的近似,其他模式均使用此设定的近似算法)。可取值如下:
*CV_CHAIN_CODE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
*CHAIN_APPROX_NONE:将所有的连码点,转换成点。
*CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
*CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法的一种。
*LINK_RUNS:通过连接水平段的1,使用完全不同的边缘提取算法。使用CV_RETR_LIST检索模式能使用此方法。
*/
int method = Imgproc.CHAIN_APPROX_SIMPLE;
Vector<MatOfPoint> contours = new Vector<MatOfPoint>();
Imgproc.findContours(source, contours, rs, mode, method, new Point());
return contours;
}
}

+ 57
- 0
src/main/java/com/acts/opencv/common/utils/RectComp.java View File

@@ -0,0 +1,57 @@
package com.acts.opencv.common.utils;

import org.opencv.core.Rect;

public class RectComp implements Comparable<Object> {
private Rect rm;

public Rect getRm() {
return rm;
}

public void setRm(Rect rm) {
this.rm = rm;
}

public RectComp() {
super();
}

public RectComp(Rect rm) {
super();
this.rm = rm;
}

// @Override
// public int compareTo(Object object) {
// if(this == object){
// return 0;
// } else if (object != null && object instanceof RectComp) {
// RectComp rect = (RectComp) object;
// if (rm.x <= rect.rm.x) {
// return -1;
// }else{
// return 1;
// }
// }else{
// return -1;
// }
// }
@Override
// 按面积排序,最大的放第一个
public int compareTo(Object object) {
if(this == object){
return 0;
} else if (object != null && object instanceof RectComp) {
RectComp rect = (RectComp) object;
if (rm.area() >= rect.rm.area()) {
return -1;
} else {
return 1;
}
} else {
return -1;
}
}

}

+ 301
- 0
src/main/java/com/acts/opencv/common/utils/Reflections.java View File

@@ -0,0 +1,301 @@
package com.acts.opencv.common.utils;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;

/**
* 反射工具类.
* 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.
* 创建者 Songer
* 创建时间 2016年8月1日
*
*/
@SuppressWarnings("rawtypes")
public class Reflections {

private static final String SETTER_PREFIX = "set";

private static final String GETTER_PREFIX = "get";

private static final String CGLIB_CLASS_SEPARATOR = "$$";

private static Logger logger = LoggerFactory.getLogger(Reflections.class);

/**
* 调用Getter方法.
* 支持多级,如:对象名.对象名.方法
*/
public static Object invokeGetter(Object obj, String propertyName) {
Object object = obj;
for (String name : StringUtils.split(propertyName, ".")){
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name);
object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {});
}
return object;
}

/**
* 调用Setter方法, 仅匹配方法名。
* 支持多级,如:对象名.对象名.方法
*/
public static void invokeSetter(Object obj, String propertyName, Object value) {
Object object = obj;
String[] names = StringUtils.split(propertyName, ".");
for (int i=0; i<names.length; i++){
if(i<names.length-1){
String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]);
object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {});
}else{
String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]);
invokeMethodByName(object, setterMethodName, new Object[] { value });
}
}
}

/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
*/
public static Object getFieldValue(final Object obj, final String fieldName) {
Field field = getAccessibleField(obj, fieldName);

if (field == null) {
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
}

Object result = null;
try {
result = field.get(obj);
} catch (IllegalAccessException e) {
logger.error("不可能抛出的异常{}", e.getMessage());
}
return result;
}

/**
* 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
*/
public static void setFieldValue(final Object obj, final String fieldName, final Object value) {
Field field = getAccessibleField(obj, fieldName);

if (field == null) {
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
}

try {
field.set(obj, value);
} catch (IllegalAccessException e) {
logger.error("不可能抛出的异常:{}", e.getMessage());
}
}

/**
* 直接调用对象方法, 无视private/protected修饰符.
* 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
* 同时匹配方法名+参数类型,
*/
public static Object invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes,
final Object[] args) {
Method method = getAccessibleMethod(obj, methodName, parameterTypes);
if (method == null) {
throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + obj + "]");
}

try {
return method.invoke(obj, args);
} catch (Exception e) {
throw convertReflectionExceptionToUnchecked(e);
}
}

/**
* 直接调用对象方法, 无视private/protected修饰符,
* 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
* 只匹配函数名,如果有多个同名函数调用第一个。
*/
public static Object invokeMethodByName(final Object obj, final String methodName, final Object[] args) {
Method method = getAccessibleMethodByName(obj, methodName);
if (method == null) {
throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + obj + "]");
}

try {
return method.invoke(obj, args);
} catch (Exception e) {
throw convertReflectionExceptionToUnchecked(e);
}
}

/**
* 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问.
*
* 如向上转型到Object仍无法找到, 返回null.
*/
public static Field getAccessibleField(final Object obj, final String fieldName) {
Validate.notNull(obj, "object can't be null");
Validate.notBlank(fieldName, "fieldName can't be blank");
for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {
try {
Field field = superClass.getDeclaredField(fieldName);
makeAccessible(field);
return field;
} catch (NoSuchFieldException e) {//NOSONAR
// Field不在当前类定义,继续向上转型
continue;// new add
}
}
return null;
}

/**
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
* 如向上转型到Object仍无法找到, 返回null.
* 匹配函数名+参数类型。
*
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
*/
public static Method getAccessibleMethod(final Object obj, final String methodName,
final Class<?>... parameterTypes) {
Validate.notNull(obj, "object can't be null");
Validate.notBlank(methodName, "methodName can't be blank");

for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
try {
Method method = searchType.getDeclaredMethod(methodName, parameterTypes);
makeAccessible(method);
return method;
} catch (NoSuchMethodException e) {
// Method不在当前类定义,继续向上转型
continue;// new add
}
}
return null;
}

/**
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
* 如向上转型到Object仍无法找到, 返回null.
* 只匹配函数名。
*
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
*/
public static Method getAccessibleMethodByName(final Object obj, final String methodName) {
Validate.notNull(obj, "object can't be null");
Validate.notBlank(methodName, "methodName can't be blank");

for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
Method[] methods = searchType.getDeclaredMethods();
for (Method method : methods) {
if (method.getName().equals(methodName)) {
makeAccessible(method);
return method;
}
}
}
return null;
}

/**
* 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
*/
public static void makeAccessible(Method method) {
if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers()))
&& !method.isAccessible()) {
method.setAccessible(true);
}
}

/**
* 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
*/
public static void makeAccessible(Field field) {
if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) || Modifier
.isFinal(field.getModifiers())) && !field.isAccessible()) {
field.setAccessible(true);
}
}

/**
* 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处
* 如无法找到, 返回Object.class.
* eg.
* public UserDao extends HibernateDao<User>
*
* @param clazz The class to introspect
* @return the first generic declaration, or Object.class if cannot be determined
*/
@SuppressWarnings("unchecked")
public static <T> Class<T> getClassGenricType(final Class clazz) {
return getClassGenricType(clazz, 0);
}

/**
* 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
* 如无法找到, 返回Object.class.
*
* 如public UserDao extends HibernateDao<User,Long>
*
* @param clazz clazz The class to introspect
* @param index the Index of the generic ddeclaration,start from 0.
* @return the index generic declaration, or Object.class if cannot be determined
*/
public static Class getClassGenricType(final Class clazz, final int index) {

Type genType = clazz.getGenericSuperclass();

if (!(genType instanceof ParameterizedType)) {
logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
return Object.class;
}

Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

if (index >= params.length || index < 0) {
logger.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
+ params.length);
return Object.class;
}
if (!(params[index] instanceof Class)) {
logger.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
return Object.class;
}

return (Class) params[index];
}

public static Class<?> getUserClass(Object instance) {
Assert.notNull(instance, "Instance must not be null");
Class clazz = instance.getClass();
if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) {
Class<?> superClass = clazz.getSuperclass();
if (superClass != null && !Object.class.equals(superClass)) {
return superClass;
}
}
return clazz;

}

/**
* 将反射时的checked exception转换为unchecked exception.
*/
public static RuntimeException convertReflectionExceptionToUnchecked(Exception e) {
if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException
|| e instanceof NoSuchMethodException) {
return new IllegalArgumentException(e);
} else if (e instanceof InvocationTargetException) {
return new RuntimeException(((InvocationTargetException) e).getTargetException());
} else if (e instanceof RuntimeException) {
return (RuntimeException) e;
}
return new RuntimeException("Unexpected Checked Exception.", e);
}
}

+ 150
- 0
src/main/java/com/acts/opencv/common/web/BaseController.java View File

@@ -0,0 +1,150 @@
/**
* Copyright &copy; 2016-2020 公众学业 All rights reserved.
*/
package com.acts.opencv.common.web;

import java.beans.PropertyEditorSupport;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringEscapeUtils;
import org.springframework.http.MediaType;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.acts.opencv.common.mapper.JsonMapper;
import com.acts.opencv.common.utils.Constants;

/**
* 控制器支持类
* 创建者 Songer
* 创建时间 2016年7月21日
*
*/
public abstract class BaseController{

/**
* 添加Model消息
* @param message
*/
protected void addMessage(Model model, String... messages) {
StringBuilder sb = new StringBuilder();
for (String message : messages){
sb.append(message).append(messages.length>1?"<br/>":"");
}
model.addAttribute("message", sb.toString());
}

/**
* 添加Flash消息
* @param message
*/
protected void addMessage(RedirectAttributes redirectAttributes, String... messages) {
StringBuilder sb = new StringBuilder();
for (String message : messages){
sb.append(message).append(messages.length>1?"<br/>":"");
}
redirectAttributes.addFlashAttribute("message", sb.toString());
}


/**
* 客户端返回JSON字符串
* @param response
* @param string
* @return
*/
protected void renderString(HttpServletResponse response, Object object) {
try {
response.reset();
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
response.setHeader("Cache-Control", "no-cache, must-revalidate");
PrintWriter writer = response.getWriter();
writer.write(JsonMapper.toJsonString(object));
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 客户端返回图片类型
* @param response
* @param object void
* @throws IOException
* @Date 2018年3月13日
* 更新日志
* 2018年3月13日 Songer 首次创建
*
*/
protected void renderImage(HttpServletResponse response, byte[] object) {
try {
response.reset();
response.setContentType("image/*");
ServletOutputStream output = response.getOutputStream();
output.flush();
output.write(object);
output.close();
// ServletOutputStream output = response.getOutputStream();
// FileInputStream fis = new FileInputStream("E:\\tomcat7\\webapps\\java_opencv\\statics\\distimage\\lena.png");
// byte[] buffer = new byte[1024];
// int i = -1;
// while ((i = fis.read(buffer)) != -1) {
// output.write(buffer, 0, i);
// }
// output.flush();
// output.close();
// fis.close();
} catch (IOException e) {
// 如果是ClientAbortException异常,可以不用管,原因是页面参数变化太快,response请求被中断
try {
// response.reset();
PrintWriter writer = response.getWriter();
response.setContentType("text/html;charset=utf-8");
writer.write("无法打开图片!");
writer.close();
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}

/**
* 客户端返回字符串
* @param response
* @param string
* @return
*/
protected void renderString(HttpServletResponse response) {
renderString(response, Constants.SUCCESS);
}

/**
* 初始化数据绑定
* 1. 将所有传递进来的String进行HTML编码,防止XSS攻击
* 2. 将字段中Date类型转换为String类型
*/
@InitBinder
protected void initBinder(WebDataBinder binder) {
// String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击
binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) {
setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
}
@Override
public String getAsText() {
Object value = getValue();
return value != null ? value.toString() : "";
}
});
}

}

+ 67
- 0
src/main/java/com/acts/opencv/demo/DemoController.java View File

@@ -0,0 +1,67 @@
package com.acts.opencv.demo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.acts.opencv.common.utils.Constants;
import com.acts.opencv.common.web.BaseController;

/**
* OpenCV人脸识别demo
* 创建者 Songer
* 创建时间 2018年3月9日
*/
@Controller
@RequestMapping(value = "demo")
public class DemoController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);

@RequestMapping(value = "detectFace")
public void detectFace(HttpServletResponse response, HttpServletRequest request, String url) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
logger.info("\nRunning DetectFaceDemo");
String resourcePath = getClass().getResource("/lbpcascade_frontalface.xml").getPath().substring(1);
logger.info("resourcePath============" + resourcePath);

CascadeClassifier faceDetector = new CascadeClassifier(resourcePath);
logger.info("url==============" + Constants.PATH + url);
Mat image = Highgui.imread(Constants.PATH + url);
// Detect faces in the image.
// MatOfRect is a special container class for Rect.
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);

logger.info(String.format("Detected %s faces", faceDetections.toArray().length));
// Draw a bounding box around each face.
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0));
}

// Save the visualized detection.
String filename = url.substring(url.lastIndexOf("/"), url.length());
System.out.println(String.format("Writing %s", Constants.PATH + Constants.DEST_IMAGE_PATH + filename));
Highgui.imwrite(Constants.PATH + Constants.DEST_IMAGE_PATH + filename, image);
renderString(response, Constants.SUCCESS);
}

public static void main(String[] args) {
System.out.println("Hello, OpenCV");
// Load the native library.
System.loadLibrary("opencv_java2413");

}
}

BIN
src/main/resources/WEB-INF/lib/opencv-2413.jar View File


BIN
src/main/resources/WEB-INF/lib/x64/opencv_java2413.dll View File


BIN
src/main/resources/WEB-INF/lib/x86/opencv_java2413.dll View File


+ 22
- 0
src/main/resources/config.properties View File

@@ -0,0 +1,22 @@
#产品信息设置
version=V1.0.0
#分页配置
page.pageSize=10
#索引页路径
web.view.index=/index.jsp
#视图文件存放路径
web.view.prefix=/WEB-INF/views/

web.view.suffix=.jsp

#静态文件后缀
web.staticFile=.css,.js,.png,.jpg,.gif,.jpeg,.bmp,.ico,.swf,.psd,.htc,.crx,.xpi,.exe,.ipa,.apk

#缓存配置
ehcache.configFile=cache/ehcache-local.xml

#测试模式:发送短信验证消息
demoMode=false

#日志队列
redis.log=false

+ 19
- 0
src/main/resources/database.properties View File

@@ -0,0 +1,19 @@
driverClassName = com.mysql.jdbc.Driver
#url=jdbc:mysql://192.168.1.61:3306/acts_java_opencv?characterEncoding=UTF-8&useSSL=false
#username = root
#password = root
initialSize = 10
maxActive = 15
minIdle = 3
maxWait = 60000
removeAbandoned = true
removeAbandonedTimeout = 180
timeBetweenEvictionRunsMillis =20000
minEvictableIdleTimeMillis = 3600000
validationQuery = SELECT 1 FROM DUAL
testWhileIdle = true
testOnBorrow = false
testOnReturn = false
poolPreparedStatements = true
maxPoolPreparedStatementPerConnectionSize = 50
filters =stat

+ 1505
- 0
src/main/resources/lbpcascade_frontalface.xml
File diff suppressed because it is too large
View File


+ 138
- 0
src/main/resources/logback.xml View File

@@ -0,0 +1,138 @@
<!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 动态日志级别 -->
<jmxConfigurator />
<!-- 定义日志文件 输出位置 -->
<property name="log_dir" value="${catalina.home}/log" />
<!-- 日志最大的历史 30天 -->
<property name="maxHistory" value="30" />

<!-- ConsoleAppender 控制台输出日志 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
<!-- 设置日志输出格式 -->
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>

<!-- ERROR级别日志 -->
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,只记录WARN级别的日志 -->
<!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置过滤级别 -->
<level>ERROR</level>
<!-- 用于配置符合过滤条件的操作 -->
<onMatch>ACCEPT</onMatch>
<!-- 用于配置不符合过滤条件的操作 -->
<onMismatch>DENY</onMismatch>
</filter>
<!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志输出位置 可相对、和绝对路径 -->
<fileNamePattern>
${log_dir}/%d{yyyy-MM-dd}/error-log.log
</fileNamePattern>
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6, 则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 -->
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>
<!-- 设置日志输出格式 -->
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>

<!-- WARN级别日志 appender -->
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,只记录WARN级别的日志 -->
<!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置过滤级别 -->
<level>WARN</level>
<!-- 用于配置符合过滤条件的操作 -->
<onMatch>ACCEPT</onMatch>
<!-- 用于配置不符合过滤条件的操作 -->
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志输出位置 可相对、和绝对路径 -->
<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/warn-log.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
</encoder>
</appender>

<!-- INFO级别日志 appender -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/info-log.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
</encoder>
</appender>

<!-- DEBUG级别日志 appender -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/debug-log.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
</encoder>
</appender>

<!-- TRACE级别日志 appender -->
<appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/trace-log.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
</encoder>
</appender>

<!-- root级别 DEBUG -->
<root>
<!-- 打印INFO级别日志及以上级别日志 -->
<level value="INFO" />
<!-- 控制台输出 -->
<appender-ref ref="console" />
<!-- 文件输出 -->
<appender-ref ref="ERROR" />
<appender-ref ref="INFO" />
<appender-ref ref="WARN" />
<appender-ref ref="DEBUG" />
<appender-ref ref="TRACE" />
</root>
</configuration>

+ 9
- 0
src/main/resources/redis.properties View File

@@ -0,0 +1,9 @@
#redis \u914d\u7f6e\u4e2d\u5fc3
redis.host=192.168.1.180
redis.port=6379
redis.password=123456
redis.maxIdle=100
redis.maxActive=300
redis.maxWait=1000
redis.testOnBorrow=true
redis.timeout=100000

+ 140
- 0
src/main/resources/spring-context.xml View File

@@ -0,0 +1,140 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

<description>Spring Configuration</description>
<!-- 用于扫描 注解 -->
<context:component-scan base-package="com.acts.opencv"/>
<!-- 加载配置文件 可以是多个 -->
<bean id="properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:database.properties</value>
<value>classpath:config.properties</value>
<!-- <value>classpath:redis.properties</value> -->
</list>
</property>
</bean>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties" ref="properties"/>
</bean>

<!--dataSource-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<!-- 数据库基本信息配置 -->
<property name="driverClassName" value="${driverClassName}" />
<property name="Url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 初始化连接数量 -->
<property name="initialSize" value="${initialSize}" />
<!-- 最大并发连接数 -->
<property name="maxActive" value="${maxActive}" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="${minIdle}" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${maxWait}" />
<!-- 超过时间限制是否回收 -->
<property name="removeAbandoned" value="${removeAbandoned}" />
<!-- 超过时间限制多长; -->
<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
<!-- 用来检测连接是否有效的sql,要求是一个查询语句 ||抛弃此种方式的连接检查-->
<!-- <property name="validationQuery" value="${validationQuery}" /> -->
<!-- 申请连接的时候检测 -->
<property name="testWhileIdle" value="${testWhileIdle}" />
<!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
<property name="testOnBorrow" value="${testOnBorrow}" />
<!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
<property name="testOnReturn" value="${testOnReturn}" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="${poolPreparedStatements}" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="${maxPoolPreparedStatementPerConnectionSize}" />
<!--属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
监控统计用的filter:stat
日志用的filter:log4j
防御SQL注入的filter:wall -->
<property name="filters" value="${filters}" />
</bean>
<!-- Hibernate对Jpa的实现 -->
<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
<!-- 配置 JPA 的 EntityManagerFactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!-- 指定数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 指定Jpa持久化实现厂商类,这里以Hibernate为例 -->
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
<!-- 指定Entity实体类包路径 -->
<property name="packagesToScan" value="com.acts.opencv"></property>
<!-- 指定JPA属性;如Hibernate中指定是否显示SQL的是否显示、方言等 -->
<property name="jpaProperties">
<props>
<!-- <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop> -->
<!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
</props>
</property>
<property name="sharedCacheMode" value="ENABLE_SELECTIVE"></property>
</bean>
<!-- 定义事务 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 配置 SpringData -->
<jpa:repositories base-package="com.acts.opencv" entity-manager-factory-ref="entityManagerFactory"/>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- redis 配置
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" />

<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}" />
<property name="port" value="${redis.port}" />
<property name="password" value="${redis.password}" />
<property name="timeout" value="${redis.timeout}" />
<property name="poolConfig" ref="jedisPoolConfig" />
<property name="usePool" value="true" />
</bean>

<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>
将session放入redis
<context:annotation-config />
<bean id="redisHttpSessionConfiguration"
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="1800" />
</bean> -->
</beans>

+ 69
- 0
src/main/resources/spring-mvc.xml View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<description>Spring MVC Configuration</description>
<!-- 加载配置属性文件 -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:config.properties" />
<!-- 使用Annotation自动注册Bean,只扫描@Controller -->
<context:component-scan base-package="com.acts.opencv" use-default-filters="false"><!-- base-package 如果多个,用“,”分隔 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 默认的注解映射的支持,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping -->
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
<mvc:message-converters register-defaults="true">
<!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
<!-- 将Jackson2HttpMessageConverter的默认格式化输出为false -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list><value>application/json;charset=UTF-8</value></list>
</property>
<property name="prettyPrint" value="false"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--启动Spring MVC的注解功能,设置编码方式,防止乱码-->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class = "org.springframework.http.converter.StringHttpMessageConverter">
<property name = "supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
<!-- REST中根据URL后缀自动判定Content-Type及相应的View -->
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="mediaTypes" >
<map>
<entry key="xml" value="application/xml"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="ignoreAcceptHeader" value="true"/>
<property name="favorPathExtension" value="true"/>
</bean>
<!-- 定义视图文件解析 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="${web.view.prefix}"/>
<property name="suffix" value="${web.view.suffix}"/>
</bean>
<!-- 对静态资源文件的访问, 将无法mapping到Controller的path交给default servlet handler处理 -->
<mvc:default-servlet-handler />
<!-- 静态资源映射 SpringMVC会自动给静态资源Response添加缓存头Cache-Control和Expires值 cache-period="31536000"-->
<!-- <mvc:resources mapping="/static/**" location="/static/" /> -->
<!-- 定义无Controller的path<->view直接映射 -->
<mvc:view-controller path="/" view-name="redirect:${web.view.index}"/>
</beans>

BIN
src/main/resources/tessdata/chi_sim.traineddata View File


BIN
src/main/resources/tessdata/eng.traineddata View File


BIN
src/main/resources/tessdata/normal.traineddata View File


BIN
src/main/resources/tessdata/num.traineddata View File


+ 42
- 0
src/main/webapp/WEB-INF/tags/header.tag View File

@@ -0,0 +1,42 @@
<%@ tag language="java" pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%>
<%@ include file="/module/include/common.jsp"%>
<%@ attribute name="title" type="java.lang.String" required="true" description="页面标题"%>
<%@ attribute name="extLibs" type="java.lang.String" required="false" description="扩展库(laydate、laypage、form、cookie、combo)"%>
<c:set var="extLibs" value=",${extLibs}," />
<c:if test="${!fn:contains(extLibs, ',notHeader,')}">
<title>${title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="renderer" content="webkit" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
</c:if>
<link rel="stylesheet" href="${ctxStatic}/css/bootstrap.min.css">
<link rel="stylesheet" href="${ctxStatic}/bower_components/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="${ctxStatic}/css/ionicons.min.css">
<link rel="stylesheet" href="${ctxStatic}/css/AdminLTE.min.css">

<script type="text/javascript">var baseUrl = "${ctxPath}";</script>

<%--layui 动态加载组件 --%>
<c:if test="${fn:contains(extLibs, 'element')}">
<script type="text/javascript">
//注意:选项卡 依赖 element 模块,否则无法进行功能性操作
layui.use('element', function(){
var element = layui.element();
//…
});
</script>
</c:if>

<%-- JS全局变量/常量定义 --%>
<script type="text/javascript">var ctxPath = '${ctxPath}';</script>
<!-- 此功能 为了防止后台页面不刷新导致的间歇性 异常情况 不会影响其他静态请求 -->
<%response.setHeader("Cache-Control", "No-store");%>


<script src="${ctxStatic}/js/jquery.min.js?t=${version}"></script>
<script src="${ctxStatic}/js/bootstrap.min.js?t=${version}"></script>
<script src="${ctxStatic}/plugins/layer/layer.js?t=${version}"></script>
<script src="${ctxStatic}/js/common.js?t=${version}"></script>
<script src="${ctxStatic}/js/form.js?t=${version}"></script>

+ 51
- 0
src/main/webapp/WEB-INF/web.xml View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" id="WebApp_ID" version="2.4">
<display-name>acts_service_rmp</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-context*.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/spring-mvc*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>loginUsername</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>loginPassword</param-name>
<param-value>adminacts</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

+ 221
- 0
src/main/webapp/index.jsp View File

@@ -0,0 +1,221 @@
<!DOCTYPE html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!--
This is a starter template page. Use this page to start your new project from
scratch. This page gets rid of all links and provides the needed markup only.
-->
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>OPENCV - 学习</title>
<!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<link rel="stylesheet" href="statics/css/bootstrap.min.css">
<!-- Font Awesome -->
<link rel="stylesheet" href="statics/bower_components/font-awesome/css/font-awesome.min.css">
<!-- Ionicons -->
<link rel="stylesheet" href="statics/css/ionicons.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="statics/css/AdminLTE.min.css">
<!-- AdminLTE Skins. We have chosen the skin-blue for this starter
page. However, you can choose any other skin. Make sure you
apply the skin class to the body tag so the changes take effect. -->
<link rel="stylesheet" href="statics/css/skins/skin-blue.min.css">
<link rel="stylesheet" href="statics/css/common.css">

<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->

<!-- Google Font -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic">
</head>
<!--
BODY TAG OPTIONS:
=================
Apply one or more of the following classes to get the
desired effect
|---------------------------------------------------------|
| SKINS | skin-blue |
| | skin-black |
| | skin-purple |
| | skin-yellow |
| | skin-red |
| | skin-green |
|---------------------------------------------------------|
|LAYOUT OPTIONS | fixed |
| | layout-boxed |
| | layout-top-nav |
| | sidebar-collapse |
| | sidebar-mini |
|---------------------------------------------------------|
-->
<body class="hold-transition skin-blue sidebar-mini">
<div class="wrapper">
<header class="main-header">
<a href="javascript:void(0);" class="logo">
<span class="logo-mini">
<b>OCL</b>
</span>
<span class="logo-lg">
<b>OpenCV</b>_Learn
</span>
</a>
<nav class="navbar navbar-static-top" role="navigation">
<a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
<span class="sr-only">Toggle navigation</span>
</a>
<div style="float: left; color: #fff; padding: 15px 10px;">欢迎ADMIN</div>
<div class="navbar-custom-menu">
<ul class="nav navbar-nav">
<li><a href="index.jsp"><i class="fa fa-home"></i> &nbsp;首页</a></li>
<li><a href="javascript:;"><i class="fa fa-lock"></i> &nbsp;修改密码</a></li>
<li><a href="javascript:;"><i class="fa fa-sign-out"></i> &nbsp;退出系统</a></li>
</ul>
</div>
</nav>
</header>
<!-- Left side column. contains the logo and sidebar -->
<!-- 导航菜单 -->
<aside class="main-sidebar">

<!-- sidebar: style can be found in sidebar.less -->
<section class="sidebar">
<!-- Sidebar Menu -->
<ul class="sidebar-menu" data-widget="tree">
<li class="header">导航菜单</li>
<!-- Optionally, you can add icons to the links -->
<li class="treeview">
<a href="#index" class="menu1">
<i class="fa fa-question-circle"></i><span>初识OpenCV</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
<li><a href="#view/index/introduce.jsp"><i class="fa fa-circle-o"></i>OpenCV介绍</a></li>
<li><a href="#view/index/setting.jsp"><i class="fa fa-circle-o"></i>JAVA集成OpenCV</a></li>
</ul>
</li>
<li class="treeview">
<a href="#demo" class="menu1">
<i class="fa fa-calendar-o"></i> <span>简单DEMO</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
<li><a href="#view/demo/helloword.jsp"><i class="fa fa-circle-o"></i>Hello Word</a></li>
<li><a href="#view/demo/mat.jsp"><i class="fa fa-circle-o"></i>Mat对象</a></li>
</ul>
</li>
<li class="treeview">
<a href="#base" class="menu1">
<i class="fa fa-list"></i> <span>基础功能</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
<li><a href="#view/base/binary.jsp"><i class="fa fa-circle-o"></i>二值化</a></li>
<li><a href="#view/base/adaptiveBinary.jsp"><i class="fa fa-circle-o"></i>自适用二值化</a></li>
<li><a href="#view/base/gaussian.jsp"><i class="fa fa-circle-o"></i> 模糊</a></li>
<li><a href="#view/base/resize.jsp"><i class="fa fa-circle-o"></i> 缩放</a></li>
<li><a href="#view/base/erosion_dilation.jsp"><i class="fa fa-circle-o"></i>腐蚀膨胀</a></li>
<li><a href="#view/base/morphologyEx.jsp"><i class="fa fa-circle-o"></i>腐蚀膨胀进阶</a></li>
<li><a href="#view/base/canny.jsp"><i class="fa fa-circle-o"></i>边缘检测</a></li>
<li><a href="#view/base/houghline.jsp"><i class="fa fa-circle-o"></i>检测直线</a></li>
<li><a href="#view/base/houghcircle.jsp"><i class="fa fa-circle-o"></i>检测圆</a></li>
<li><a href="#view/base/findcolor.jsp"><i class="fa fa-circle-o"></i>检测颜色</a></li>
<li><a href="#view/base/contours.jsp"><i class="fa fa-circle-o"></i>轮廓</a></li>
<li><a href="#view/base/findtemplate.jsp"><i class="fa fa-circle-o"></i>模板查找</a></li>
<li><a href="#view/base/grayHistogram.jsp"><i class="fa fa-circle-o"></i>灰度直方图</a></li>
</ul>
</li>
<li class="treeview">
<a href="#card" class="menu1">
<i class="fa fa-picture-o"></i><span>答题卡demo</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
<li><a href="#view/card/recognition.jsp"><i class="fa fa-circle-o"></i>检测填涂</a></li>
<li><a href="#view/card/cardPlus.jsp"><i class="fa fa-circle-o"></i>答题卡识别</a></li>
<li><a href="#view/card/pagecheck.jsp"><i class="fa fa-circle-o"></i>页码识别</a></li>
<!-- <li><a href="#view/card/marktest.jsp"><i class="fa fa-circle-o"></i>定位点优化</a></li> -->
<li><a href="#view/card/rectification.jsp"><i class="fa fa-circle-o"></i>图像矫正</a></li>
<!--<li><a href="#view/card/realTest.jsp"><i class="fa fa-circle-o"></i>校正真实测试</a></li> -->
</ul>
</li>
<li>
<a href="#view/index/todo.jsp"><i class="fa fa-hand-peace-o"></i><span>持续更新中</span></a>
</li>
</ul>
<!-- /.sidebar-menu -->
</section>
<!-- /.sidebar -->
</aside>
<!-- 路径导航 -->
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<section class="content-header">
<h1 id = "currentpage">介绍</h1>
<ol class="breadcrumb">
<li><a href="index.jsp"><i class="fa fa-dashboard"></i>首页</a></li>
<li id = "pagehead2">首页</li>
<li class="active" id = "pagehead3">介绍</li>
</ol>
</section>
<!-- Main content -->
<section class="content">
<iframe scrolling="yes" frameborder="0"
style="width: 100%; min-height: 200px; overflow: visible; background: #fff;"
src="main.jsp" id="mainFrame" name="mainFrame"></iframe>
<!--------------------------
| Your Page Content Here |
-------------------------->

</section>
<!-- /.content -->
</div>
<!-- /.content-wrapper -->

<!-- Main Footer -->
<footer class="main-footer">
<div class="pull-right hidden-xs">
<b>Version</b> 1.0.0
</div>
<strong>Copyright &copy; 2017 <a href="#">ACTS Songer</a>.</strong> All rights reserved.
</footer>
</div>
<!-- REQUIRED JS SCRIPTS -->

<!-- jQuery 3 -->
<script src="statics/js/jquery.min.js"></script>
<!-- Bootstrap 3.3.7 -->
<script src="statics/js/bootstrap.min.js"></script>
<script src="statics/plugins/layer/layer.js"></script>
<!-- AdminLTE App -->
<script src="statics/js/adminlte.min.js"></script>
<script src="statics/js/index.js?t=${version}"></script>
<script src="statics/js/common.js"></script>
<!-- Optionally, you can add Slimscroll and FastClick plugins.
Both of these plugins are recommended to enhance the
user experience. -->
</body>
</html>

+ 23
- 0
src/main/webapp/main.jsp View File

@@ -0,0 +1,23 @@
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@include file="/module/include/common.jsp"%>
<!DOCTYPE html>
<html>
<head>
<sys:header title="首页" extLibs=""></sys:header>
<script type="text/javascript">
</script>
</head>
<body>
<div class="panel panel-default">
<div class="panel-heading">首页</div>
<div>
<h4>&nbsp;&nbsp;&nbsp;&nbsp;本平台将从环境搭建开始,一步一步学习OpenCV的相关知识,直至最终一个完整DEMO的实现。
在整个过程中,记录和学习所涉及到的关于java中使用OpenCV进行图像处理的操作。<br> &nbsp;&nbsp;&nbsp;&nbsp;做成web方式的原因主要是因为平时使用过程中的调试十分不便
。尤其是针对于那种参数为变化因子的方法。很多时候都是执行完后看图片效果,更换参数后再试。因此想实现实时展现的效果。便于后续调试,也会完善此项目,将其变成一个对
OpenCV的初学者十分有帮助的便于查询和验证各种算法的一个工具类平台。</h4>
</div>
</div>
</body>
</html>

+ 19
- 0
src/main/webapp/module/execute.jsp View File

@@ -0,0 +1,19 @@
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@include file="/module/include/common.jsp"%>
<!DOCTYPE html>
<html>
<head>
<sys:header title="首页" extLibs=""></sys:header>
</head>
<body>
<div class="panel panel-default">
<div class="panel-heading">执行任务</div>
<div>
<h3>&nbsp;&nbsp;&nbsp;同步试卷试题Kn表统计维度相关字段</h3>
<ul>
<a class="btn btn-primary" href="https://adminlte.io/download/AdminLTE-dist"><i class="fa fa-download"></i> Execute</a>
</ul>
</div>
</div>
</body>
</html>

+ 10
- 0
src/main/webapp/module/include/common.jsp View File

@@ -0,0 +1,10 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- <%@ taglib prefix="s" uri="/struts-tags" %> --%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%--自定义tag标签 --%>
<%@ taglib prefix="sys" tagdir="/WEB-INF/tags" %>

<c:set var="ctxPath" value="${pageContext.request.contextPath}"/>
<c:set var="ctxStatic" value="${ctxPath}/statics"/>
<c:set var="ctxView" value="${ctxPath}/view"/>
<c:set var="version" value="201803141"/>

+ 4
- 0
src/main/webapp/statics/bower_components/font-awesome/css/font-awesome.min.css
File diff suppressed because it is too large
View File


BIN
src/main/webapp/statics/bower_components/font-awesome/fonts/FontAwesome.otf View File


BIN
src/main/webapp/statics/bower_components/font-awesome/fonts/fontawesome-webfont.eot View File


+ 2671
- 0
src/main/webapp/statics/bower_components/font-awesome/fonts/fontawesome-webfont.svg
File diff suppressed because it is too large
View File


BIN
src/main/webapp/statics/bower_components/font-awesome/fonts/fontawesome-webfont.ttf View File


BIN
src/main/webapp/statics/bower_components/font-awesome/fonts/fontawesome-webfont.woff View File


BIN
src/main/webapp/statics/bower_components/font-awesome/fonts/fontawesome-webfont.woff2 View File


+ 7
- 0
src/main/webapp/statics/css/AdminLTE.min.css
File diff suppressed because it is too large
View File


+ 760
- 0
src/main/webapp/statics/css/alt/AdminLTE-bootstrap-social.css View File

@@ -0,0 +1,760 @@
/*
* Social Buttons for Bootstrap
*
* Copyright 2013-2015 Panayiotis Lipiridis
* Licensed under the MIT License
*
* https://github.com/lipis/bootstrap-social
*/
.btn-social {
position: relative;
padding-left: 44px;
text-align: left;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.btn-social > :first-child {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 32px;
line-height: 34px;
font-size: 1.6em;
text-align: center;
border-right: 1px solid rgba(0, 0, 0, 0.2);
}
.btn-social.btn-lg {
padding-left: 61px;
}
.btn-social.btn-lg > :first-child {
line-height: 45px;
width: 45px;
font-size: 1.8em;
}
.btn-social.btn-sm {
padding-left: 38px;
}
.btn-social.btn-sm > :first-child {
line-height: 28px;
width: 28px;
font-size: 1.4em;
}
.btn-social.btn-xs {
padding-left: 30px;
}
.btn-social.btn-xs > :first-child {
line-height: 20px;
width: 20px;
font-size: 1.2em;
}
.btn-social-icon {
position: relative;
padding-left: 44px;
text-align: left;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
height: 34px;
width: 34px;
padding: 0;
}
.btn-social-icon > :first-child {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 32px;
line-height: 34px;
font-size: 1.6em;
text-align: center;
border-right: 1px solid rgba(0, 0, 0, 0.2);
}
.btn-social-icon.btn-lg {
padding-left: 61px;
}
.btn-social-icon.btn-lg > :first-child {
line-height: 45px;
width: 45px;
font-size: 1.8em;
}
.btn-social-icon.btn-sm {
padding-left: 38px;
}
.btn-social-icon.btn-sm > :first-child {
line-height: 28px;
width: 28px;
font-size: 1.4em;
}
.btn-social-icon.btn-xs {
padding-left: 30px;
}
.btn-social-icon.btn-xs > :first-child {
line-height: 20px;
width: 20px;
font-size: 1.2em;
}
.btn-social-icon > :first-child {
border: none;
text-align: center;
width: 100%;
}
.btn-social-icon.btn-lg {
height: 45px;
width: 45px;
padding-left: 0;
padding-right: 0;
}
.btn-social-icon.btn-sm {
height: 30px;
width: 30px;
padding-left: 0;
padding-right: 0;
}
.btn-social-icon.btn-xs {
height: 22px;
width: 22px;
padding-left: 0;
padding-right: 0;
}
.btn-adn {
color: #ffffff;
background-color: #d87a68;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-adn:focus,
.btn-adn.focus {
color: #ffffff;
background-color: #ce563f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-adn:hover {
color: #ffffff;
background-color: #ce563f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-adn:active,
.btn-adn.active,
.open > .dropdown-toggle.btn-adn {
color: #ffffff;
background-color: #ce563f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-adn:active,
.btn-adn.active,
.open > .dropdown-toggle.btn-adn {
background-image: none;
}
.btn-adn .badge {
color: #d87a68;
background-color: #ffffff;
}
.btn-bitbucket {
color: #ffffff;
background-color: #205081;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-bitbucket:focus,
.btn-bitbucket.focus {
color: #ffffff;
background-color: #163758;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-bitbucket:hover {
color: #ffffff;
background-color: #163758;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-bitbucket:active,
.btn-bitbucket.active,
.open > .dropdown-toggle.btn-bitbucket {
color: #ffffff;
background-color: #163758;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-bitbucket:active,
.btn-bitbucket.active,
.open > .dropdown-toggle.btn-bitbucket {
background-image: none;
}
.btn-bitbucket .badge {
color: #205081;
background-color: #ffffff;
}
.btn-dropbox {
color: #ffffff;
background-color: #1087dd;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-dropbox:focus,
.btn-dropbox.focus {
color: #ffffff;
background-color: #0d6aad;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-dropbox:hover {
color: #ffffff;
background-color: #0d6aad;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-dropbox:active,
.btn-dropbox.active,
.open > .dropdown-toggle.btn-dropbox {
color: #ffffff;
background-color: #0d6aad;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-dropbox:active,
.btn-dropbox.active,
.open > .dropdown-toggle.btn-dropbox {
background-image: none;
}
.btn-dropbox .badge {
color: #1087dd;
background-color: #ffffff;
}
.btn-facebook {
color: #ffffff;
background-color: #3b5998;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-facebook:focus,
.btn-facebook.focus {
color: #ffffff;
background-color: #2d4373;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-facebook:hover {
color: #ffffff;
background-color: #2d4373;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-facebook:active,
.btn-facebook.active,
.open > .dropdown-toggle.btn-facebook {
color: #ffffff;
background-color: #2d4373;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-facebook:active,
.btn-facebook.active,
.open > .dropdown-toggle.btn-facebook {
background-image: none;
}
.btn-facebook .badge {
color: #3b5998;
background-color: #ffffff;
}
.btn-flickr {
color: #ffffff;
background-color: #ff0084;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-flickr:focus,
.btn-flickr.focus {
color: #ffffff;
background-color: #cc006a;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-flickr:hover {
color: #ffffff;
background-color: #cc006a;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-flickr:active,
.btn-flickr.active,
.open > .dropdown-toggle.btn-flickr {
color: #ffffff;
background-color: #cc006a;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-flickr:active,
.btn-flickr.active,
.open > .dropdown-toggle.btn-flickr {
background-image: none;
}
.btn-flickr .badge {
color: #ff0084;
background-color: #ffffff;
}
.btn-foursquare {
color: #ffffff;
background-color: #f94877;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-foursquare:focus,
.btn-foursquare.focus {
color: #ffffff;
background-color: #f71752;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-foursquare:hover {
color: #ffffff;
background-color: #f71752;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-foursquare:active,
.btn-foursquare.active,
.open > .dropdown-toggle.btn-foursquare {
color: #ffffff;
background-color: #f71752;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-foursquare:active,
.btn-foursquare.active,
.open > .dropdown-toggle.btn-foursquare {
background-image: none;
}
.btn-foursquare .badge {
color: #f94877;
background-color: #ffffff;
}
.btn-github {
color: #ffffff;
background-color: #444444;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-github:focus,
.btn-github.focus {
color: #ffffff;
background-color: #2b2b2b;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-github:hover {
color: #ffffff;
background-color: #2b2b2b;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-github:active,
.btn-github.active,
.open > .dropdown-toggle.btn-github {
color: #ffffff;
background-color: #2b2b2b;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-github:active,
.btn-github.active,
.open > .dropdown-toggle.btn-github {
background-image: none;
}
.btn-github .badge {
color: #444444;
background-color: #ffffff;
}
.btn-google {
color: #ffffff;
background-color: #dd4b39;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-google:focus,
.btn-google.focus {
color: #ffffff;
background-color: #c23321;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-google:hover {
color: #ffffff;
background-color: #c23321;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-google:active,
.btn-google.active,
.open > .dropdown-toggle.btn-google {
color: #ffffff;
background-color: #c23321;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-google:active,
.btn-google.active,
.open > .dropdown-toggle.btn-google {
background-image: none;
}
.btn-google .badge {
color: #dd4b39;
background-color: #ffffff;
}
.btn-instagram {
color: #ffffff;
background-color: #3f729b;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-instagram:focus,
.btn-instagram.focus {
color: #ffffff;
background-color: #305777;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-instagram:hover {
color: #ffffff;
background-color: #305777;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-instagram:active,
.btn-instagram.active,
.open > .dropdown-toggle.btn-instagram {
color: #ffffff;
background-color: #305777;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-instagram:active,
.btn-instagram.active,
.open > .dropdown-toggle.btn-instagram {
background-image: none;
}
.btn-instagram .badge {
color: #3f729b;
background-color: #ffffff;
}
.btn-linkedin {
color: #ffffff;
background-color: #007bb6;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-linkedin:focus,
.btn-linkedin.focus {
color: #ffffff;
background-color: #005983;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-linkedin:hover {
color: #ffffff;
background-color: #005983;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-linkedin:active,
.btn-linkedin.active,
.open > .dropdown-toggle.btn-linkedin {
color: #ffffff;
background-color: #005983;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-linkedin:active,
.btn-linkedin.active,
.open > .dropdown-toggle.btn-linkedin {
background-image: none;
}
.btn-linkedin .badge {
color: #007bb6;
background-color: #ffffff;
}
.btn-microsoft {
color: #ffffff;
background-color: #2672ec;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-microsoft:focus,
.btn-microsoft.focus {
color: #ffffff;
background-color: #125acd;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-microsoft:hover {
color: #ffffff;
background-color: #125acd;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-microsoft:active,
.btn-microsoft.active,
.open > .dropdown-toggle.btn-microsoft {
color: #ffffff;
background-color: #125acd;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-microsoft:active,
.btn-microsoft.active,
.open > .dropdown-toggle.btn-microsoft {
background-image: none;
}
.btn-microsoft .badge {
color: #2672ec;
background-color: #ffffff;
}
.btn-openid {
color: #ffffff;
background-color: #f7931e;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-openid:focus,
.btn-openid.focus {
color: #ffffff;
background-color: #da7908;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-openid:hover {
color: #ffffff;
background-color: #da7908;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-openid:active,
.btn-openid.active,
.open > .dropdown-toggle.btn-openid {
color: #ffffff;
background-color: #da7908;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-openid:active,
.btn-openid.active,
.open > .dropdown-toggle.btn-openid {
background-image: none;
}
.btn-openid .badge {
color: #f7931e;
background-color: #ffffff;
}
.btn-pinterest {
color: #ffffff;
background-color: #cb2027;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-pinterest:focus,
.btn-pinterest.focus {
color: #ffffff;
background-color: #9f191f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-pinterest:hover {
color: #ffffff;
background-color: #9f191f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-pinterest:active,
.btn-pinterest.active,
.open > .dropdown-toggle.btn-pinterest {
color: #ffffff;
background-color: #9f191f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-pinterest:active,
.btn-pinterest.active,
.open > .dropdown-toggle.btn-pinterest {
background-image: none;
}
.btn-pinterest .badge {
color: #cb2027;
background-color: #ffffff;
}
.btn-reddit {
color: #000000;
background-color: #eff7ff;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-reddit:focus,
.btn-reddit.focus {
color: #000000;
background-color: #bcddff;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-reddit:hover {
color: #000000;
background-color: #bcddff;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-reddit:active,
.btn-reddit.active,
.open > .dropdown-toggle.btn-reddit {
color: #000000;
background-color: #bcddff;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-reddit:active,
.btn-reddit.active,
.open > .dropdown-toggle.btn-reddit {
background-image: none;
}
.btn-reddit .badge {
color: #eff7ff;
background-color: #000000;
}
.btn-soundcloud {
color: #ffffff;
background-color: #ff5500;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-soundcloud:focus,
.btn-soundcloud.focus {
color: #ffffff;
background-color: #cc4400;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-soundcloud:hover {
color: #ffffff;
background-color: #cc4400;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-soundcloud:active,
.btn-soundcloud.active,
.open > .dropdown-toggle.btn-soundcloud {
color: #ffffff;
background-color: #cc4400;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-soundcloud:active,
.btn-soundcloud.active,
.open > .dropdown-toggle.btn-soundcloud {
background-image: none;
}
.btn-soundcloud .badge {
color: #ff5500;
background-color: #ffffff;
}
.btn-tumblr {
color: #ffffff;
background-color: #2c4762;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-tumblr:focus,
.btn-tumblr.focus {
color: #ffffff;
background-color: #1c2d3f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-tumblr:hover {
color: #ffffff;
background-color: #1c2d3f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-tumblr:active,
.btn-tumblr.active,
.open > .dropdown-toggle.btn-tumblr {
color: #ffffff;
background-color: #1c2d3f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-tumblr:active,
.btn-tumblr.active,
.open > .dropdown-toggle.btn-tumblr {
background-image: none;
}
.btn-tumblr .badge {
color: #2c4762;
background-color: #ffffff;
}
.btn-twitter {
color: #ffffff;
background-color: #55acee;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-twitter:focus,
.btn-twitter.focus {
color: #ffffff;
background-color: #2795e9;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-twitter:hover {
color: #ffffff;
background-color: #2795e9;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-twitter:active,
.btn-twitter.active,
.open > .dropdown-toggle.btn-twitter {
color: #ffffff;
background-color: #2795e9;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-twitter:active,
.btn-twitter.active,
.open > .dropdown-toggle.btn-twitter {
background-image: none;
}
.btn-twitter .badge {
color: #55acee;
background-color: #ffffff;
}
.btn-vimeo {
color: #ffffff;
background-color: #1ab7ea;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-vimeo:focus,
.btn-vimeo.focus {
color: #ffffff;
background-color: #1295bf;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-vimeo:hover {
color: #ffffff;
background-color: #1295bf;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-vimeo:active,
.btn-vimeo.active,
.open > .dropdown-toggle.btn-vimeo {
color: #ffffff;
background-color: #1295bf;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-vimeo:active,
.btn-vimeo.active,
.open > .dropdown-toggle.btn-vimeo {
background-image: none;
}
.btn-vimeo .badge {
color: #1ab7ea;
background-color: #ffffff;
}
.btn-vk {
color: #ffffff;
background-color: #587ea3;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-vk:focus,
.btn-vk.focus {
color: #ffffff;
background-color: #466482;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-vk:hover {
color: #ffffff;
background-color: #466482;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-vk:active,
.btn-vk.active,
.open > .dropdown-toggle.btn-vk {
color: #ffffff;
background-color: #466482;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-vk:active,
.btn-vk.active,
.open > .dropdown-toggle.btn-vk {
background-image: none;
}
.btn-vk .badge {
color: #587ea3;
background-color: #ffffff;
}
.btn-yahoo {
color: #ffffff;
background-color: #720e9e;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-yahoo:focus,
.btn-yahoo.focus {
color: #ffffff;
background-color: #500a6f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-yahoo:hover {
color: #ffffff;
background-color: #500a6f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-yahoo:active,
.btn-yahoo.active,
.open > .dropdown-toggle.btn-yahoo {
color: #ffffff;
background-color: #500a6f;
border-color: rgba(0, 0, 0, 0.2);
}
.btn-yahoo:active,
.btn-yahoo.active,
.open > .dropdown-toggle.btn-yahoo {
background-image: none;
}
.btn-yahoo .badge {
color: #720e9e;
background-color: #ffffff;
}

+ 1
- 0
src/main/webapp/statics/css/alt/AdminLTE-bootstrap-social.min.css
File diff suppressed because it is too large
View File


+ 93
- 0
src/main/webapp/statics/css/alt/AdminLTE-fullcalendar.css View File

@@ -0,0 +1,93 @@
/*
* Plugin: Full Calendar
* ---------------------
*/
.fc-button {
background: #f4f4f4;
background-image: none;
color: #444;
border-color: #ddd;
border-bottom-color: #ddd;
}
.fc-button:hover,
.fc-button:active,
.fc-button.hover {
background-color: #e9e9e9;
}
.fc-header-title h2 {
font-size: 15px;
line-height: 1.6em;
color: #666;
margin-left: 10px;
}
.fc-header-right {
padding-right: 10px;
}
.fc-header-left {
padding-left: 10px;
}
.fc-widget-header {
background: #fafafa;
}
.fc-grid {
width: 100%;
border: 0;
}
.fc-widget-header:first-of-type,
.fc-widget-content:first-of-type {
border-left: 0;
border-right: 0;
}
.fc-widget-header:last-of-type,
.fc-widget-content:last-of-type {
border-right: 0;
}
.fc-toolbar {
padding: 10px;
margin: 0;
}
.fc-day-number {
font-size: 20px;
font-weight: 300;
padding-right: 10px;
}
.fc-color-picker {
list-style: none;
margin: 0;
padding: 0;
}
.fc-color-picker > li {
float: left;
font-size: 30px;
margin-right: 5px;
line-height: 30px;
}
.fc-color-picker > li .fa {
-webkit-transition: -webkit-transform linear 0.3s;
-moz-transition: -moz-transform linear 0.3s;
-o-transition: -o-transform linear 0.3s;
transition: transform linear 0.3s;
}
.fc-color-picker > li .fa:hover {
-webkit-transform: rotate(30deg);
-ms-transform: rotate(30deg);
-o-transform: rotate(30deg);
transform: rotate(30deg);
}
#add-new-event {
-webkit-transition: all linear 0.3s;
-o-transition: all linear 0.3s;
transition: all linear 0.3s;
}
.external-event {
padding: 5px 10px;
font-weight: bold;
margin-bottom: 4px;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
border-radius: 3px;
cursor: move;
}
.external-event:hover {
box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2);
}

+ 1
- 0
src/main/webapp/statics/css/alt/AdminLTE-fullcalendar.min.css View File

@@ -0,0 +1 @@
.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}

+ 100
- 0
src/main/webapp/statics/css/alt/AdminLTE-select2.css View File

@@ -0,0 +1,100 @@
/*
* Plugin: Select2
* ---------------
*/
.select2-container--default.select2-container--focus,
.select2-selection.select2-container--focus,
.select2-container--default:focus,
.select2-selection:focus,
.select2-container--default:active,
.select2-selection:active {
outline: none;
}
.select2-container--default .select2-selection--single,
.select2-selection .select2-selection--single {
border: 1px solid #d2d6de;
border-radius: 0;
padding: 6px 12px;
height: 34px;
}
.select2-container--default.select2-container--open {
border-color: #3c8dbc;
}
.select2-dropdown {
border: 1px solid #d2d6de;
border-radius: 0;
}
.select2-container--default .select2-results__option--highlighted[aria-selected] {
background-color: #3c8dbc;
color: white;
}
.select2-results__option {
padding: 6px 12px;
user-select: none;
-webkit-user-select: none;
}
.select2-container .select2-selection--single .select2-selection__rendered {
padding-left: 0;
padding-right: 0;
height: auto;
margin-top: -4px;
}
.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
padding-right: 6px;
padding-left: 20px;
}
.select2-container--default .select2-selection--single .select2-selection__arrow {
height: 28px;
right: 3px;
}
.select2-container--default .select2-selection--single .select2-selection__arrow b {
margin-top: 0;
}
.select2-dropdown .select2-search__field,
.select2-search--inline .select2-search__field {
border: 1px solid #d2d6de;
}
.select2-dropdown .select2-search__field:focus,
.select2-search--inline .select2-search__field:focus {
outline: none;
}
.select2-container--default.select2-container--focus .select2-selection--multiple,
.select2-container--default .select2-search--dropdown .select2-search__field {
border-color: #3c8dbc !important;
}
.select2-container--default .select2-results__option[aria-disabled=true] {
color: #999;
}
.select2-container--default .select2-results__option[aria-selected=true] {
background-color: #ddd;
}
.select2-container--default .select2-results__option[aria-selected=true],
.select2-container--default .select2-results__option[aria-selected=true]:hover {
color: #444;
}
.select2-container--default .select2-selection--multiple {
border: 1px solid #d2d6de;
border-radius: 0;
}
.select2-container--default .select2-selection--multiple:focus {
border-color: #3c8dbc;
}
.select2-container--default.select2-container--focus .select2-selection--multiple {
border-color: #d2d6de;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
background-color: #3c8dbc;
border-color: #367fa9;
padding: 1px 10px;
color: #fff;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
margin-right: 5px;
color: rgba(255, 255, 255, 0.7);
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #fff;
}
.select2-container .select2-selection--single .select2-selection__rendered {
padding-right: 10px;
}

+ 1
- 0
src/main/webapp/statics/css/alt/AdminLTE-select2.min.css View File

@@ -0,0 +1 @@
.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none}.select2-container--default.select2-container--focus .select2-selection--multiple,.select2-container--default .select2-search--dropdown .select2-search__field{border-color:#3c8dbc !important}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}

+ 4002
- 0
src/main/webapp/statics/css/alt/AdminLTE-without-plugins.css
File diff suppressed because it is too large
View File


+ 7
- 0
src/main/webapp/statics/css/alt/AdminLTE-without-plugins.min.css
File diff suppressed because it is too large
View File


+ 6
- 0
src/main/webapp/statics/css/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 2
- 0
src/main/webapp/statics/css/common.css View File

@@ -0,0 +1,2 @@
.content {
padding: 10px 10px 10px 10px; }

+ 11
- 0
src/main/webapp/statics/css/ionicons.min.css
File diff suppressed because it is too large
View File


+ 1781
- 0
src/main/webapp/statics/css/skins/_all-skins.css
File diff suppressed because it is too large
View File


+ 1
- 0
src/main/webapp/statics/css/skins/_all-skins.min.css
File diff suppressed because it is too large
View File


+ 171
- 0
src/main/webapp/statics/css/skins/skin-black-light.css View File

@@ -0,0 +1,171 @@
/*
* Skin: Black
* -----------
*/
/* skin-black navbar */
.skin-black-light .main-header {
border-bottom: 1px solid #d2d6de;
}
.skin-black-light .main-header .navbar-toggle {
color: #333;
}
.skin-black-light .main-header .navbar-brand {
color: #333;
border-right: 1px solid #d2d6de;
}
.skin-black-light .main-header .navbar {
background-color: #ffffff;
}
.skin-black-light .main-header .navbar .nav > li > a {
color: #333333;
}
.skin-black-light .main-header .navbar .nav > li > a:hover,
.skin-black-light .main-header .navbar .nav > li > a:active,
.skin-black-light .main-header .navbar .nav > li > a:focus,
.skin-black-light .main-header .navbar .nav .open > a,
.skin-black-light .main-header .navbar .nav .open > a:hover,
.skin-black-light .main-header .navbar .nav .open > a:focus,
.skin-black-light .main-header .navbar .nav > .active > a {
background: #ffffff;
color: #999999;
}
.skin-black-light .main-header .navbar .sidebar-toggle {
color: #333333;
}
.skin-black-light .main-header .navbar .sidebar-toggle:hover {
color: #999999;
background: #ffffff;
}
.skin-black-light .main-header .navbar > .sidebar-toggle {
color: #333;
border-right: 1px solid #d2d6de;
}
.skin-black-light .main-header .navbar .navbar-nav > li > a {
border-right: 1px solid #d2d6de;
}
.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav > li > a,
.skin-black-light .main-header .navbar .navbar-right > li > a {
border-left: 1px solid #d2d6de;
border-right-width: 0;
}
.skin-black-light .main-header > .logo {
background-color: #ffffff;
color: #333333;
border-bottom: 0 solid transparent;
border-right: 1px solid #d2d6de;
}
.skin-black-light .main-header > .logo:hover {
background-color: #fcfcfc;
}
@media (max-width: 767px) {
.skin-black-light .main-header > .logo {
background-color: #222222;
color: #ffffff;
border-bottom: 0 solid transparent;
border-right: none;
}
.skin-black-light .main-header > .logo:hover {
background-color: #1f1f1f;
}
}
.skin-black-light .main-header li.user-header {
background-color: #222;
}
.skin-black-light .content-header {
background: transparent;
box-shadow: none;
}
.skin-black-light .wrapper,
.skin-black-light .main-sidebar,
.skin-black-light .left-side {
background-color: #f9fafc;
}
.skin-black-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-black-light .user-panel > .info,
.skin-black-light .user-panel > .info > a {
color: #444444;
}
.skin-black-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-black-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-black-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-black-light .sidebar-menu > li:hover > a,
.skin-black-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-black-light .sidebar-menu > li.active {
border-left-color: #ffffff;
}
.skin-black-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-black-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-black-light .sidebar a {
color: #444444;
}
.skin-black-light .sidebar a:hover {
text-decoration: none;
}
.skin-black-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-black-light .sidebar-menu .treeview-menu > li.active > a,
.skin-black-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-black-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-black-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-black-light .sidebar-form input[type="text"],
.skin-black-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-black-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-black-light .sidebar-form input[type="text"]:focus,
.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-black-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-black-light.min.css View File

@@ -0,0 +1 @@
.skin-black-light .main-header{border-bottom:1px solid #d2d6de}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar{background-color:#fff}.skin-black-light .main-header .navbar .nav>li>a{color:#333}.skin-black-light .main-header .navbar .nav>li>a:hover,.skin-black-light .main-header .navbar .nav>li>a:active,.skin-black-light .main-header .navbar .nav>li>a:focus,.skin-black-light .main-header .navbar .nav .open>a,.skin-black-light .main-header .navbar .nav .open>a:hover,.skin-black-light .main-header .navbar .nav .open>a:focus,.skin-black-light .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header .navbar .sidebar-toggle{color:#333}.skin-black-light .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-nav>li>a{border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header .navbar .navbar-right>li>a{border-left:1px solid #d2d6de;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #d2d6de}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .main-sidebar{border-right:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-black-light .sidebar-menu .treeview-menu>li.active>a,.skin-black-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-black-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}

+ 161
- 0
src/main/webapp/statics/css/skins/skin-black.css View File

@@ -0,0 +1,161 @@
/*
* Skin: Black
* -----------
*/
/* skin-black navbar */
.skin-black .main-header {
-webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05);
}
.skin-black .main-header .navbar-toggle {
color: #333;
}
.skin-black .main-header .navbar-brand {
color: #333;
border-right: 1px solid #eee;
}
.skin-black .main-header .navbar {
background-color: #ffffff;
}
.skin-black .main-header .navbar .nav > li > a {
color: #333333;
}
.skin-black .main-header .navbar .nav > li > a:hover,
.skin-black .main-header .navbar .nav > li > a:active,
.skin-black .main-header .navbar .nav > li > a:focus,
.skin-black .main-header .navbar .nav .open > a,
.skin-black .main-header .navbar .nav .open > a:hover,
.skin-black .main-header .navbar .nav .open > a:focus,
.skin-black .main-header .navbar .nav > .active > a {
background: #ffffff;
color: #999999;
}
.skin-black .main-header .navbar .sidebar-toggle {
color: #333333;
}
.skin-black .main-header .navbar .sidebar-toggle:hover {
color: #999999;
background: #ffffff;
}
.skin-black .main-header .navbar > .sidebar-toggle {
color: #333;
border-right: 1px solid #eee;
}
.skin-black .main-header .navbar .navbar-nav > li > a {
border-right: 1px solid #eee;
}
.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav > li > a,
.skin-black .main-header .navbar .navbar-right > li > a {
border-left: 1px solid #eee;
border-right-width: 0;
}
.skin-black .main-header > .logo {
background-color: #ffffff;
color: #333333;
border-bottom: 0 solid transparent;
border-right: 1px solid #eee;
}
.skin-black .main-header > .logo:hover {
background-color: #fcfcfc;
}
@media (max-width: 767px) {
.skin-black .main-header > .logo {
background-color: #222222;
color: #ffffff;
border-bottom: 0 solid transparent;
border-right: none;
}
.skin-black .main-header > .logo:hover {
background-color: #1f1f1f;
}
}
.skin-black .main-header li.user-header {
background-color: #222;
}
.skin-black .content-header {
background: transparent;
box-shadow: none;
}
.skin-black .wrapper,
.skin-black .main-sidebar,
.skin-black .left-side {
background-color: #222d32;
}
.skin-black .user-panel > .info,
.skin-black .user-panel > .info > a {
color: #fff;
}
.skin-black .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-black .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-black .sidebar-menu > li:hover > a,
.skin-black .sidebar-menu > li.active > a,
.skin-black .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-black .sidebar-menu > li.active > a {
border-left-color: #ffffff;
}
.skin-black .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-black .sidebar a {
color: #b8c7ce;
}
.skin-black .sidebar a:hover {
text-decoration: none;
}
.skin-black .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-black .sidebar-menu .treeview-menu > li.active > a,
.skin-black .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-black .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-black .sidebar-form input[type="text"],
.skin-black .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-black .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-black .sidebar-form input[type="text"]:focus,
.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-black .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
.skin-black .pace .pace-progress {
background: #222;
}
.skin-black .pace .pace-activity {
border-top-color: #222;
border-left-color: #222;
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-black.min.css View File

@@ -0,0 +1 @@
.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav>li>a:hover,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a,.skin-black .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-black .sidebar-menu>li.active>a{border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-black .sidebar-menu .treeview-menu>li.active>a,.skin-black .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222}

+ 163
- 0
src/main/webapp/statics/css/skins/skin-blue-light.css View File

@@ -0,0 +1,163 @@
/*
* Skin: Blue
* ----------
*/
.skin-blue-light .main-header .navbar {
background-color: #3c8dbc;
}
.skin-blue-light .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-blue-light .main-header .navbar .nav > li > a:hover,
.skin-blue-light .main-header .navbar .nav > li > a:active,
.skin-blue-light .main-header .navbar .nav > li > a:focus,
.skin-blue-light .main-header .navbar .nav .open > a,
.skin-blue-light .main-header .navbar .nav .open > a:hover,
.skin-blue-light .main-header .navbar .nav .open > a:focus,
.skin-blue-light .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-blue-light .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-blue-light .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-blue-light .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-blue-light .main-header .navbar .sidebar-toggle:hover {
background-color: #367fa9;
}
@media (max-width: 767px) {
.skin-blue-light .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-blue-light .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-blue-light .main-header .navbar .dropdown-menu li a:hover {
background: #367fa9;
}
}
.skin-blue-light .main-header .logo {
background-color: #3c8dbc;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-blue-light .main-header .logo:hover {
background-color: #3b8ab8;
}
.skin-blue-light .main-header li.user-header {
background-color: #3c8dbc;
}
.skin-blue-light .content-header {
background: transparent;
}
.skin-blue-light .wrapper,
.skin-blue-light .main-sidebar,
.skin-blue-light .left-side {
background-color: #f9fafc;
}
.skin-blue-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-blue-light .user-panel > .info,
.skin-blue-light .user-panel > .info > a {
color: #444444;
}
.skin-blue-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-blue-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-blue-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-blue-light .sidebar-menu > li:hover > a,
.skin-blue-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-blue-light .sidebar-menu > li.active {
border-left-color: #3c8dbc;
}
.skin-blue-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-blue-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-blue-light .sidebar a {
color: #444444;
}
.skin-blue-light .sidebar a:hover {
text-decoration: none;
}
.skin-blue-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-blue-light .sidebar-menu .treeview-menu > li.active > a,
.skin-blue-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-blue-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-blue-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-blue-light .sidebar-form input[type="text"],
.skin-blue-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-blue-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-blue-light .sidebar-form input[type="text"]:focus,
.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-blue-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}
.skin-blue-light .main-footer {
border-top-color: #d2d6de;
}
.skin-blue.layout-top-nav .main-header > .logo {
background-color: #3c8dbc;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-blue.layout-top-nav .main-header > .logo:hover {
background-color: #3b8ab8;
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-blue-light.min.css View File

@@ -0,0 +1 @@
.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .main-sidebar{border-right:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a,.skin-blue-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}

+ 142
- 0
src/main/webapp/statics/css/skins/skin-blue.css View File

@@ -0,0 +1,142 @@
/*
* Skin: Blue
* ----------
*/
.skin-blue .main-header .navbar {
background-color: #3c8dbc;
}
.skin-blue .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-blue .main-header .navbar .nav > li > a:hover,
.skin-blue .main-header .navbar .nav > li > a:active,
.skin-blue .main-header .navbar .nav > li > a:focus,
.skin-blue .main-header .navbar .nav .open > a,
.skin-blue .main-header .navbar .nav .open > a:hover,
.skin-blue .main-header .navbar .nav .open > a:focus,
.skin-blue .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-blue .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-blue .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-blue .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-blue .main-header .navbar .sidebar-toggle:hover {
background-color: #367fa9;
}
@media (max-width: 767px) {
.skin-blue .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-blue .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-blue .main-header .navbar .dropdown-menu li a:hover {
background: #367fa9;
}
}
.skin-blue .main-header .logo {
background-color: #367fa9;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-blue .main-header .logo:hover {
background-color: #357ca5;
}
.skin-blue .main-header li.user-header {
background-color: #3c8dbc;
}
.skin-blue .content-header {
background: transparent;
}
.skin-blue .wrapper,
.skin-blue .main-sidebar,
.skin-blue .left-side {
background-color: #222d32;
}
.skin-blue .user-panel > .info,
.skin-blue .user-panel > .info > a {
color: #fff;
}
.skin-blue .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-blue .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-blue .sidebar-menu > li:hover > a,
.skin-blue .sidebar-menu > li.active > a,
.skin-blue .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-blue .sidebar-menu > li.active > a {
border-left-color: #3c8dbc;
}
.skin-blue .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-blue .sidebar a {
color: #b8c7ce;
}
.skin-blue .sidebar a:hover {
text-decoration: none;
}
.skin-blue .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-blue .sidebar-menu .treeview-menu > li.active > a,
.skin-blue .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-blue .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-blue .sidebar-form input[type="text"],
.skin-blue .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-blue .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-blue .sidebar-form input[type="text"]:focus,
.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-blue .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
.skin-blue.layout-top-nav .main-header > .logo {
background-color: #3c8dbc;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-blue.layout-top-nav .main-header > .logo:hover {
background-color: #3b8ab8;
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-blue.min.css View File

@@ -0,0 +1 @@
.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-blue .sidebar-menu>li.active>a{border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-blue .sidebar-menu .treeview-menu>li.active>a,.skin-blue .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}

+ 152
- 0
src/main/webapp/statics/css/skins/skin-green-light.css View File

@@ -0,0 +1,152 @@
/*
* Skin: Green
* -----------
*/
.skin-green-light .main-header .navbar {
background-color: #00a65a;
}
.skin-green-light .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-green-light .main-header .navbar .nav > li > a:hover,
.skin-green-light .main-header .navbar .nav > li > a:active,
.skin-green-light .main-header .navbar .nav > li > a:focus,
.skin-green-light .main-header .navbar .nav .open > a,
.skin-green-light .main-header .navbar .nav .open > a:hover,
.skin-green-light .main-header .navbar .nav .open > a:focus,
.skin-green-light .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-green-light .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-green-light .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-green-light .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-green-light .main-header .navbar .sidebar-toggle:hover {
background-color: #008d4c;
}
@media (max-width: 767px) {
.skin-green-light .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-green-light .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-green-light .main-header .navbar .dropdown-menu li a:hover {
background: #008d4c;
}
}
.skin-green-light .main-header .logo {
background-color: #00a65a;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-green-light .main-header .logo:hover {
background-color: #00a157;
}
.skin-green-light .main-header li.user-header {
background-color: #00a65a;
}
.skin-green-light .content-header {
background: transparent;
}
.skin-green-light .wrapper,
.skin-green-light .main-sidebar,
.skin-green-light .left-side {
background-color: #f9fafc;
}
.skin-green-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-green-light .user-panel > .info,
.skin-green-light .user-panel > .info > a {
color: #444444;
}
.skin-green-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-green-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-green-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-green-light .sidebar-menu > li:hover > a,
.skin-green-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-green-light .sidebar-menu > li.active {
border-left-color: #00a65a;
}
.skin-green-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-green-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-green-light .sidebar a {
color: #444444;
}
.skin-green-light .sidebar a:hover {
text-decoration: none;
}
.skin-green-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-green-light .sidebar-menu .treeview-menu > li.active > a,
.skin-green-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-green-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-green-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-green-light .sidebar-form input[type="text"],
.skin-green-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-green-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-green-light .sidebar-form input[type="text"]:focus,
.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-green-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-green-light.min.css View File

@@ -0,0 +1 @@
.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .main-sidebar{border-right:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-green-light .sidebar-menu .treeview-menu>li.active>a,.skin-green-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-green-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}

+ 134
- 0
src/main/webapp/statics/css/skins/skin-green.css View File

@@ -0,0 +1,134 @@
/*
* Skin: Green
* -----------
*/
.skin-green .main-header .navbar {
background-color: #00a65a;
}
.skin-green .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-green .main-header .navbar .nav > li > a:hover,
.skin-green .main-header .navbar .nav > li > a:active,
.skin-green .main-header .navbar .nav > li > a:focus,
.skin-green .main-header .navbar .nav .open > a,
.skin-green .main-header .navbar .nav .open > a:hover,
.skin-green .main-header .navbar .nav .open > a:focus,
.skin-green .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-green .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-green .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-green .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-green .main-header .navbar .sidebar-toggle:hover {
background-color: #008d4c;
}
@media (max-width: 767px) {
.skin-green .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-green .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-green .main-header .navbar .dropdown-menu li a:hover {
background: #008d4c;
}
}
.skin-green .main-header .logo {
background-color: #008d4c;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-green .main-header .logo:hover {
background-color: #008749;
}
.skin-green .main-header li.user-header {
background-color: #00a65a;
}
.skin-green .content-header {
background: transparent;
}
.skin-green .wrapper,
.skin-green .main-sidebar,
.skin-green .left-side {
background-color: #222d32;
}
.skin-green .user-panel > .info,
.skin-green .user-panel > .info > a {
color: #fff;
}
.skin-green .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-green .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-green .sidebar-menu > li:hover > a,
.skin-green .sidebar-menu > li.active > a,
.skin-green .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-green .sidebar-menu > li.active > a {
border-left-color: #00a65a;
}
.skin-green .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-green .sidebar a {
color: #b8c7ce;
}
.skin-green .sidebar a:hover {
text-decoration: none;
}
.skin-green .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-green .sidebar-menu .treeview-menu > li.active > a,
.skin-green .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-green .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-green .sidebar-form input[type="text"],
.skin-green .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-green .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-green .sidebar-form input[type="text"]:focus,
.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-green .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-green.min.css View File

@@ -0,0 +1 @@
.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a,.skin-green .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-green .sidebar-menu>li.active>a{border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-green .sidebar-menu .treeview-menu>li.active>a,.skin-green .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}

+ 152
- 0
src/main/webapp/statics/css/skins/skin-purple-light.css View File

@@ -0,0 +1,152 @@
/*
* Skin: Purple
* ------------
*/
.skin-purple-light .main-header .navbar {
background-color: #605ca8;
}
.skin-purple-light .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-purple-light .main-header .navbar .nav > li > a:hover,
.skin-purple-light .main-header .navbar .nav > li > a:active,
.skin-purple-light .main-header .navbar .nav > li > a:focus,
.skin-purple-light .main-header .navbar .nav .open > a,
.skin-purple-light .main-header .navbar .nav .open > a:hover,
.skin-purple-light .main-header .navbar .nav .open > a:focus,
.skin-purple-light .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-purple-light .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-purple-light .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-purple-light .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-purple-light .main-header .navbar .sidebar-toggle:hover {
background-color: #555299;
}
@media (max-width: 767px) {
.skin-purple-light .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-purple-light .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-purple-light .main-header .navbar .dropdown-menu li a:hover {
background: #555299;
}
}
.skin-purple-light .main-header .logo {
background-color: #605ca8;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-purple-light .main-header .logo:hover {
background-color: #5d59a6;
}
.skin-purple-light .main-header li.user-header {
background-color: #605ca8;
}
.skin-purple-light .content-header {
background: transparent;
}
.skin-purple-light .wrapper,
.skin-purple-light .main-sidebar,
.skin-purple-light .left-side {
background-color: #f9fafc;
}
.skin-purple-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-purple-light .user-panel > .info,
.skin-purple-light .user-panel > .info > a {
color: #444444;
}
.skin-purple-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-purple-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-purple-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-purple-light .sidebar-menu > li:hover > a,
.skin-purple-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-purple-light .sidebar-menu > li.active {
border-left-color: #605ca8;
}
.skin-purple-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-purple-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-purple-light .sidebar a {
color: #444444;
}
.skin-purple-light .sidebar a:hover {
text-decoration: none;
}
.skin-purple-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-purple-light .sidebar-menu .treeview-menu > li.active > a,
.skin-purple-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-purple-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-purple-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-purple-light .sidebar-form input[type="text"],
.skin-purple-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-purple-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-purple-light .sidebar-form input[type="text"]:focus,
.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-purple-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-purple-light.min.css View File

@@ -0,0 +1 @@
.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .main-sidebar{border-right:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a,.skin-purple-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}

+ 134
- 0
src/main/webapp/statics/css/skins/skin-purple.css View File

@@ -0,0 +1,134 @@
/*
* Skin: Purple
* ------------
*/
.skin-purple .main-header .navbar {
background-color: #605ca8;
}
.skin-purple .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-purple .main-header .navbar .nav > li > a:hover,
.skin-purple .main-header .navbar .nav > li > a:active,
.skin-purple .main-header .navbar .nav > li > a:focus,
.skin-purple .main-header .navbar .nav .open > a,
.skin-purple .main-header .navbar .nav .open > a:hover,
.skin-purple .main-header .navbar .nav .open > a:focus,
.skin-purple .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-purple .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-purple .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-purple .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-purple .main-header .navbar .sidebar-toggle:hover {
background-color: #555299;
}
@media (max-width: 767px) {
.skin-purple .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-purple .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-purple .main-header .navbar .dropdown-menu li a:hover {
background: #555299;
}
}
.skin-purple .main-header .logo {
background-color: #555299;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-purple .main-header .logo:hover {
background-color: #545096;
}
.skin-purple .main-header li.user-header {
background-color: #605ca8;
}
.skin-purple .content-header {
background: transparent;
}
.skin-purple .wrapper,
.skin-purple .main-sidebar,
.skin-purple .left-side {
background-color: #222d32;
}
.skin-purple .user-panel > .info,
.skin-purple .user-panel > .info > a {
color: #fff;
}
.skin-purple .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-purple .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-purple .sidebar-menu > li:hover > a,
.skin-purple .sidebar-menu > li.active > a,
.skin-purple .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-purple .sidebar-menu > li.active > a {
border-left-color: #605ca8;
}
.skin-purple .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-purple .sidebar a {
color: #b8c7ce;
}
.skin-purple .sidebar a:hover {
text-decoration: none;
}
.skin-purple .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-purple .sidebar-menu .treeview-menu > li.active > a,
.skin-purple .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-purple .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-purple .sidebar-form input[type="text"],
.skin-purple .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-purple .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-purple .sidebar-form input[type="text"]:focus,
.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-purple .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-purple.min.css View File

@@ -0,0 +1 @@
.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a,.skin-purple .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-purple .sidebar-menu>li.active>a{border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-purple .sidebar-menu .treeview-menu>li.active>a,.skin-purple .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}

+ 152
- 0
src/main/webapp/statics/css/skins/skin-red-light.css View File

@@ -0,0 +1,152 @@
/*
* Skin: Red
* ---------
*/
.skin-red-light .main-header .navbar {
background-color: #dd4b39;
}
.skin-red-light .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-red-light .main-header .navbar .nav > li > a:hover,
.skin-red-light .main-header .navbar .nav > li > a:active,
.skin-red-light .main-header .navbar .nav > li > a:focus,
.skin-red-light .main-header .navbar .nav .open > a,
.skin-red-light .main-header .navbar .nav .open > a:hover,
.skin-red-light .main-header .navbar .nav .open > a:focus,
.skin-red-light .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-red-light .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-red-light .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-red-light .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-red-light .main-header .navbar .sidebar-toggle:hover {
background-color: #d73925;
}
@media (max-width: 767px) {
.skin-red-light .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-red-light .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-red-light .main-header .navbar .dropdown-menu li a:hover {
background: #d73925;
}
}
.skin-red-light .main-header .logo {
background-color: #dd4b39;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-red-light .main-header .logo:hover {
background-color: #dc4735;
}
.skin-red-light .main-header li.user-header {
background-color: #dd4b39;
}
.skin-red-light .content-header {
background: transparent;
}
.skin-red-light .wrapper,
.skin-red-light .main-sidebar,
.skin-red-light .left-side {
background-color: #f9fafc;
}
.skin-red-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-red-light .user-panel > .info,
.skin-red-light .user-panel > .info > a {
color: #444444;
}
.skin-red-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-red-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-red-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-red-light .sidebar-menu > li:hover > a,
.skin-red-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-red-light .sidebar-menu > li.active {
border-left-color: #dd4b39;
}
.skin-red-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-red-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-red-light .sidebar a {
color: #444444;
}
.skin-red-light .sidebar a:hover {
text-decoration: none;
}
.skin-red-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-red-light .sidebar-menu .treeview-menu > li.active > a,
.skin-red-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-red-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-red-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-red-light .sidebar-form input[type="text"],
.skin-red-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-red-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-red-light .sidebar-form input[type="text"]:focus,
.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-red-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-red-light.min.css View File

@@ -0,0 +1 @@
.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .main-sidebar{border-right:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-red-light .sidebar-menu .treeview-menu>li.active>a,.skin-red-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-red-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}

+ 134
- 0
src/main/webapp/statics/css/skins/skin-red.css View File

@@ -0,0 +1,134 @@
/*
* Skin: Red
* ---------
*/
.skin-red .main-header .navbar {
background-color: #dd4b39;
}
.skin-red .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-red .main-header .navbar .nav > li > a:hover,
.skin-red .main-header .navbar .nav > li > a:active,
.skin-red .main-header .navbar .nav > li > a:focus,
.skin-red .main-header .navbar .nav .open > a,
.skin-red .main-header .navbar .nav .open > a:hover,
.skin-red .main-header .navbar .nav .open > a:focus,
.skin-red .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-red .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-red .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-red .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-red .main-header .navbar .sidebar-toggle:hover {
background-color: #d73925;
}
@media (max-width: 767px) {
.skin-red .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-red .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-red .main-header .navbar .dropdown-menu li a:hover {
background: #d73925;
}
}
.skin-red .main-header .logo {
background-color: #d73925;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-red .main-header .logo:hover {
background-color: #d33724;
}
.skin-red .main-header li.user-header {
background-color: #dd4b39;
}
.skin-red .content-header {
background: transparent;
}
.skin-red .wrapper,
.skin-red .main-sidebar,
.skin-red .left-side {
background-color: #222d32;
}
.skin-red .user-panel > .info,
.skin-red .user-panel > .info > a {
color: #fff;
}
.skin-red .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-red .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-red .sidebar-menu > li:hover > a,
.skin-red .sidebar-menu > li.active > a,
.skin-red .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-red .sidebar-menu > li.active > a {
border-left-color: #dd4b39;
}
.skin-red .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-red .sidebar a {
color: #b8c7ce;
}
.skin-red .sidebar a:hover {
text-decoration: none;
}
.skin-red .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-red .sidebar-menu .treeview-menu > li.active > a,
.skin-red .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-red .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-red .sidebar-form input[type="text"],
.skin-red .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-red .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-red .sidebar-form input[type="text"]:focus,
.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-red .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-red.min.css View File

@@ -0,0 +1 @@
.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a,.skin-red .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-red .sidebar-menu>li.active>a{border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-red .sidebar-menu .treeview-menu>li.active>a,.skin-red .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}

+ 152
- 0
src/main/webapp/statics/css/skins/skin-yellow-light.css View File

@@ -0,0 +1,152 @@
/*
* Skin: Yellow
* ------------
*/
.skin-yellow-light .main-header .navbar {
background-color: #f39c12;
}
.skin-yellow-light .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-yellow-light .main-header .navbar .nav > li > a:hover,
.skin-yellow-light .main-header .navbar .nav > li > a:active,
.skin-yellow-light .main-header .navbar .nav > li > a:focus,
.skin-yellow-light .main-header .navbar .nav .open > a,
.skin-yellow-light .main-header .navbar .nav .open > a:hover,
.skin-yellow-light .main-header .navbar .nav .open > a:focus,
.skin-yellow-light .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-yellow-light .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-yellow-light .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-yellow-light .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-yellow-light .main-header .navbar .sidebar-toggle:hover {
background-color: #e08e0b;
}
@media (max-width: 767px) {
.skin-yellow-light .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-yellow-light .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover {
background: #e08e0b;
}
}
.skin-yellow-light .main-header .logo {
background-color: #f39c12;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-yellow-light .main-header .logo:hover {
background-color: #f39a0d;
}
.skin-yellow-light .main-header li.user-header {
background-color: #f39c12;
}
.skin-yellow-light .content-header {
background: transparent;
}
.skin-yellow-light .wrapper,
.skin-yellow-light .main-sidebar,
.skin-yellow-light .left-side {
background-color: #f9fafc;
}
.skin-yellow-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-yellow-light .user-panel > .info,
.skin-yellow-light .user-panel > .info > a {
color: #444444;
}
.skin-yellow-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-yellow-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-yellow-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-yellow-light .sidebar-menu > li:hover > a,
.skin-yellow-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-yellow-light .sidebar-menu > li.active {
border-left-color: #f39c12;
}
.skin-yellow-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-yellow-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-yellow-light .sidebar a {
color: #444444;
}
.skin-yellow-light .sidebar a:hover {
text-decoration: none;
}
.skin-yellow-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-yellow-light .sidebar-menu .treeview-menu > li.active > a,
.skin-yellow-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-yellow-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-yellow-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-yellow-light .sidebar-form input[type="text"],
.skin-yellow-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-yellow-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-yellow-light .sidebar-form input[type="text"]:focus,
.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-yellow-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-yellow-light.min.css View File

@@ -0,0 +1 @@
.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .main-sidebar{border-right:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a,.skin-yellow-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}

+ 134
- 0
src/main/webapp/statics/css/skins/skin-yellow.css View File

@@ -0,0 +1,134 @@
/*
* Skin: Yellow
* ------------
*/
.skin-yellow .main-header .navbar {
background-color: #f39c12;
}
.skin-yellow .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-yellow .main-header .navbar .nav > li > a:hover,
.skin-yellow .main-header .navbar .nav > li > a:active,
.skin-yellow .main-header .navbar .nav > li > a:focus,
.skin-yellow .main-header .navbar .nav .open > a,
.skin-yellow .main-header .navbar .nav .open > a:hover,
.skin-yellow .main-header .navbar .nav .open > a:focus,
.skin-yellow .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-yellow .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-yellow .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-yellow .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-yellow .main-header .navbar .sidebar-toggle:hover {
background-color: #e08e0b;
}
@media (max-width: 767px) {
.skin-yellow .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-yellow .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-yellow .main-header .navbar .dropdown-menu li a:hover {
background: #e08e0b;
}
}
.skin-yellow .main-header .logo {
background-color: #e08e0b;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-yellow .main-header .logo:hover {
background-color: #db8b0b;
}
.skin-yellow .main-header li.user-header {
background-color: #f39c12;
}
.skin-yellow .content-header {
background: transparent;
}
.skin-yellow .wrapper,
.skin-yellow .main-sidebar,
.skin-yellow .left-side {
background-color: #222d32;
}
.skin-yellow .user-panel > .info,
.skin-yellow .user-panel > .info > a {
color: #fff;
}
.skin-yellow .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-yellow .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-yellow .sidebar-menu > li:hover > a,
.skin-yellow .sidebar-menu > li.active > a,
.skin-yellow .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-yellow .sidebar-menu > li.active > a {
border-left-color: #f39c12;
}
.skin-yellow .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-yellow .sidebar a {
color: #b8c7ce;
}
.skin-yellow .sidebar a:hover {
text-decoration: none;
}
.skin-yellow .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-yellow .sidebar-menu .treeview-menu > li.active > a,
.skin-yellow .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-yellow .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-yellow .sidebar-form input[type="text"],
.skin-yellow .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-yellow .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-yellow .sidebar-form input[type="text"]:focus,
.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-yellow .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}

+ 1
- 0
src/main/webapp/statics/css/skins/skin-yellow.min.css View File

@@ -0,0 +1 @@
.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a,.skin-yellow .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-yellow .sidebar-menu>li.active>a{border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-yellow .sidebar-menu .treeview-menu>li.active>a,.skin-yellow .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}

+ 1083
- 0
src/main/webapp/statics/css/style.min.css
File diff suppressed because it is too large
View File


BIN
src/main/webapp/statics/images/MORPH_BLACKHAT.png View File

Before After
Width: 461  |  Height: 19  |  Size: 1.2 kB

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

Loading…
Cancel
Save