@@ -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> |
@@ -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> |
@@ -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> |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -0,0 +1,4 @@ | |||||
activeProfiles= | |||||
eclipse.preferences.version=1 | |||||
resolveWorkspaceProjects=true | |||||
version=1 |
@@ -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> |
@@ -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> |
@@ -0,0 +1 @@ | |||||
org.eclipse.wst.jsdt.launching.baseBrowserLibrary |
@@ -0,0 +1 @@ | |||||
Window |
@@ -0,0 +1,2 @@ | |||||
disabled=06target | |||||
eclipse.preferences.version=1 |
@@ -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> |
@@ -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 |
@@ -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(); | |||||
} | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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)); | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} | |||||
@@ -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; | |||||
} | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |
@@ -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;//一页共有十条内容 | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |
@@ -0,0 +1,150 @@ | |||||
/** | |||||
* Copyright © 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() : ""; | |||||
} | |||||
}); | |||||
} | |||||
} |
@@ -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"); | |||||
} | |||||
} |
@@ -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 |
@@ -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 |
@@ -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> |
@@ -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 |
@@ -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> |
@@ -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> |
@@ -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> | |||||
@@ -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> |
@@ -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> 首页</a></li> | |||||
<li><a href="javascript:;"><i class="fa fa-lock"></i> 修改密码</a></li> | |||||
<li><a href="javascript:;"><i class="fa fa-sign-out"></i> 退出系统</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 © 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> |
@@ -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> 本平台将从环境搭建开始,一步一步学习OpenCV的相关知识,直至最终一个完整DEMO的实现。 | |||||
在整个过程中,记录和学习所涉及到的关于java中使用OpenCV进行图像处理的操作。<br> 做成web方式的原因主要是因为平时使用过程中的调试十分不便 | |||||
。尤其是针对于那种参数为变化因子的方法。很多时候都是执行完后看图片效果,更换参数后再试。因此想实现实时展现的效果。便于后续调试,也会完善此项目,将其变成一个对 | |||||
OpenCV的初学者十分有帮助的便于查询和验证各种算法的一个工具类平台。</h4> | |||||
</div> | |||||
</div> | |||||
</body> | |||||
</html> |
@@ -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> 同步试卷试题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> |
@@ -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"/> |
@@ -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; | |||||
} |
@@ -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); | |||||
} |
@@ -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)} |
@@ -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; | |||||
} |
@@ -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} |
@@ -0,0 +1,2 @@ | |||||
.content { | |||||
padding: 10px 10px 10px 10px; } |
@@ -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; | |||||
} | |||||
} |
@@ -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}} |
@@ -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; | |||||
} |
@@ -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} |
@@ -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; | |||||
} |
@@ -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} |
@@ -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; | |||||
} |
@@ -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} |
@@ -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; | |||||
} | |||||
} |
@@ -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}} |
@@ -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; | |||||
} |
@@ -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} |
@@ -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; | |||||
} | |||||
} |
@@ -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}} |
@@ -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; | |||||
} |
@@ -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} |
@@ -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; | |||||
} | |||||
} |
@@ -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}} |
@@ -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; | |||||
} |
@@ -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} |
@@ -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; | |||||
} | |||||
} |
@@ -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}} |
@@ -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; | |||||
} |
@@ -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} |