1. 程式人生 > >程式碼檢測工具箱——checkstyle、findbugs、pmd-cpd

程式碼檢測工具箱——checkstyle、findbugs、pmd-cpd

 寫在前面

好吧,我承認,我懶了,寫了一天文件,到這裡直接貼上了,希望大家能看懂,如果需要一份格式完整的文件,請去我的百度文庫下載,地址是:

下面,開始

一.目的:

最近要跟蹤一個專案的程式碼質量,保障專案質量。個人總是認為,質量保障這個東西要用資料說話的。程式碼走查是一個方面,但要能使用工具完成部分標準化的程式碼走查,發現部分錯誤,也不失為一種不錯的補充手段。結合之前自己用過、聽過的幾種開源工具,整合到一起,實現一個適合目前專案的簡單工具。

二.取捨:

首先是工具的選擇,經過多個工具的使用結合目前專案組成員的水平和狀態,決定從幾個方面進行檢查:

常規bug

編碼規範

重複程式碼

不想檢查太多,以前沒有開展過這方面的工作,領導是否支援,專案成員反響是否良好都很難說,如果大家都喜歡再完善更多的檢查也不晚。

其實還差一個依賴的檢測,但現在專案使用的是ssh的架構,現有依賴檢查的工具中,對spring的支援都不是很好,遂放棄。

對於工具的選擇,緊著自己熟悉的就選擇了checkstyle、findbugs和pmd的cpd工具。

三.期望結果:

使用ant指令碼,一步完成所有工作,針對專案直接產生檢查報告。

四.步驟:

1.準備工具

ant、checkstyle、findbugs、pmd下載。還要下載cvs和eclipse,因為指令碼中需要使用cvs更新程式碼,eclipse會讓ant指令碼的編輯和環境配置更加簡單。

2.指令碼規劃

規劃指令碼,整個指令碼分為幾個部分,如下:

<?xml version="1.0" encoding="utf-8"?>

<project name="myProject" default="start" >

    <!-- 變數定義 -->

    <!-- 環境初始化 -->

    <!-- checkout -->

    <!-- javac -->

    <!-- jar -->

    <!-- checkstyle -->

    <!-- findbugs -->

    <!-- pmd cpd -->

    <!-- run -->

    <target name="start">

    </target>

</project>

整個指令碼規劃描述了指令碼執行的過程,每個註釋都將新增具體的內容。系統執行start任務,這個任務通過依賴呼叫其他任務,任務間通過依賴定義過程。

l         首先“變數定義”中定義變數,便於將來多個專案複用。

l         “環境初始化”中初始化環境,所有環境清理和環境建立都在這裡完成。

l         “checkout”完成cvs的更新工作。

l         由於findbugs需要檢查二進位制程式碼,“javac”完成程式碼編譯工作。

l         同樣為findbugs需要,“jar”將程式碼打包。

l         “checkstyle”完成程式碼拼寫檢查。

l         “findbugs”完成bug檢查

l         “pmd cpd”使用pmd的cpd功能檢查重複程式碼。

3.checkout

變數定義和環境初始化部分,在需要時隨時新增,首先是checkout過程,將程式碼檢出cvs庫。

3.1指令碼編寫

checkout部分指令碼如下:

    <target name="checkoutlib" depends="mkDir">

       <cvs cvsroot="${cvsroot}" package="WorkingArea/Code/lib" />

    </target>

    <target name="checkoutsrc" depends="checkoutlib">

       <cvs cvsroot="${cvsroot}" package="WorkingArea/Code/project" />

    </target>

checkoutlib檢出公共庫,checkoutsrc檢出程式碼,同時在變數定義部分定義cvsroot變數,如下:

    <property name="cvsroot" value=":pserver:wangjianxuan:[email protected]:/repository/project" />

其中文字部分與我們常用的cvs寫法相同,可以參考eclipse中的cvs檢視的部分。

注意:上面指令碼中依賴的mkDir任務是初始化部分的,為了建立相關的目錄,後面有詳細描述。

3.2執行

eclipse中執行ant就是有這點好,缺少什麼不用去修改環境變數,eclipse內部就解決了。執行前有幾個地方需要確認:

指令碼上點右鍵-》Run As-》Ant Build…

注意,一定是帶有省略號的選單,這個選單才能配置環境,開啟介面如下圖:

這裡Targets可以選擇要執行的任務,執行時會連依賴的任務一起執行。ClassPath定義依賴的類庫,JRE用來定義JRE的版本,Environment標籤很重要,可以定義一些環境變數中未定義的變數,這裡我因為一直沒有找到cvs路徑,但命令列中能夠找到cvs,所以把Path環境變數複製定義到這裡了,如下圖:

指令碼執行後,會將程式碼檢出到工程目錄下的“WorkingArea/Code/project”位置。

注意:環境變數和類路徑等內容的設定在更改ant指令碼名稱後會丟失,需要重新設定。

3.3問題處理

ant呼叫cvs網上文章較少,問題的處理就更少了,也許是太簡單了吧,但我還是碰到了一些問題。

首先,如果path路徑中沒有增加cvs路徑,或者你沒有安裝cvs(windows系統需要安裝cvsnt),找不到cvs路徑,將報錯。所以保證命令列中任意路徑下呼叫“cvs”命令可以成功,如果還報錯,可以將“path”環境變數增加到eclipse中。

另外,按照ant的cvs任務說明,cvs密碼應該使用cvspass任務生成cvspass檔案,在cvs任務中使用cvspass標籤呼叫這個檔案。但是,我在eclipse中這麼做不會產生檔案,同時cvs checkout會報告訪問被拒絕(很明白,沒密碼)。處理辦法就是將密碼加在cvsroot屬性中,在使用者名稱後,“@”符號前增加“:密碼”即可。

4. javac

javac任務將剛剛檢出的程式碼進行編譯,編譯後的程式碼放到bin目錄下。

4.1指令碼

javac部分的指令碼如下:

    <target name="javac" depends="checkoutsrc">

       <javac srcdir="${srcdir}" destdir="${builddir}" source="1.6">

           <compilerarg value="-Xlint:unchecked" />

       </javac>

    </target>

其中,depends指定剛剛檢出指令碼,使指令碼執行時先執行檢出才會執行編譯。source指定編譯時使用的jdk版本,這裡指定了1.6版本。由於程式碼編譯需要,指定了一個編譯引數“-Xlint:unchecked”,根據實際情況,可指定任何引數,可多次使用,與命令列編譯對應。

在變數定義部分定義了兩個變數:“srcdir”指定原始碼路徑;“builddir”指定編譯後代碼路徑。指令碼如下:

    <property name="projdir" value="D:/work/quality_workspace/AntScript" />

    <property name="srcdir" value="${projdir}/WorkingArea/Code/cginfo/src/main" />

    <property name="builddir" value="${projdir}/WorkingArea/Code/cginfo/bin" />

srcdir和builddir變數共同以當前專案目錄為基礎,所以,又定義了一個變數“projdir”宣告專案目錄。

4.2執行

簡單執行javac指令碼可能會出現問題,需要使classpath包含類路徑。同樣,指令碼上右鍵-》Run As-》Ant Build…開啟視窗中選擇Classpath頁籤,如下:

這裡要注意,

1.       只有選擇“User Entries”節點時,新增jar包的按鈕才有效。

2.       不知道是不是我使用的問題,Add Folders新增目錄後,並不能把目錄下所有jar包都新增到類路徑來,只能將所有jar包攤在這裡。

編譯後就是打包了,見下節。

5.jar

與javac同樣,由於findbugs的需要,將javac編譯後的程式碼打包

5.1指令碼

    <target name="jar" depends="javac">

       <jar destfile="${packagedir}/app.jar" basedir="${builddir}" />

    </target>

指令碼destfile指定了編譯後的jar包路徑和檔名,basedir指定原始碼的路徑。

這裡在變數定義部分定義了變數packagedir用於指定jar包的路徑,指令碼如下:

<property name="package" value="WorkingArea/Code/commonMakeManage"/>

執行後會在destfile位置找到打好的jar包。

6.checkstyle

終於進入正題了,準備工作完成,可以開始檢查了,首先是checkstyle檢查並且生成報告。

6.1指令碼

檢查指令碼如下:

    <target name="checkstyle" depends="jar">

       <taskdef resource="checkstyletask.properties" />

       <checkstyle config="lib/check_rules.xml">

           <formatter type="xml" tofile="${checkstyledir}/checkstyle_report.xml" />

           <fileset dir="${srcdir}" includes="**/*.java" />

       </checkstyle>

       <style in="${checkstyledir}/checkstyle_report.xml" out="${checkstyledir}/checkstyle_report.html" style="lib/checkstyle-frames.xsl" />

    </target>

指令碼有點長,逐個解說:

首先,taskdef定義了checkstyle的ant task,以及聲明瞭屬性檔案,這就需要ant的類路徑中有checkstyle的jar包,這裡我用的是checkstyle-5.4-all.jar。

下面,checkstyle定義了檢查的各方面,“config”定義了檢查規則,規則可以自定義編寫,隨後說明。

formatter子元素定義了輸出格式以及輸出檔案的位置,這裡定義了xml格式,同時定義了“checkstyledir”變數,代表checkstyle報告目錄。後面說明具體變數定義。

fileset子元素定義了原始碼位置,dir指定了原始碼目錄,includes指定檔案型別,也可以使用excludes排除一些檔案,詳見checkstyle文件。

執行後生成xml報告檔案,使用style標籤結合checkstyle中自帶的xsl檔案將xml生成html,便於檢視,checkstyle自帶了很多xsl檔案,多嘗試一下,看看哪個適合。

注意:這裡使用的是框架樣式,生成的html,生成後有時會在“${checkstyledir}”的同級目錄生成files目錄,目錄中包含部分檢查結果。

6.2變數定義

指令碼如下:

    <property name="checkstyledir" value="${projdir}/checkstyle" />

6.3環境初始化指令碼

由於每次檢查程式碼前要將之前的檢查結果刪除,保證結果是最新的。同時要保證檔案目錄存在,否則寫報告時報錯。所以有如下指令碼:

    <target name="delDir">

       <delete dir="${builddir}" />

       <delete dir="${checkstyledir}" />

       <delete dir="${findbugsdir}" />

       <delete dir="${cpddir}" />

    </target>

    <target name="mkDir" depends="delDir">

       <mkdir dir="${builddir}" />

       <mkdir dir="${checkstyledir}" />

       <mkdir dir="${findbugsdir}" />

       <mkdir dir="${cpddir}" />

    </target>

這裡將所有需要刪除和建立的指令碼都寫出來了,包括編譯的目錄builddir;程式碼檢查結果目錄checkstyledir;bug檢查結果目錄findbugsdir以及程式碼重複檢查目錄cpddir。

6.3執行

指令碼執行後會在checkstyledir目錄下建立checkstyle_report.xml和checkstyle_report.html檔案

6.4自定義規則

checkstyle規則可以自定義,詳細規則可以參考checkstyle文件,這裡我只需要檢查很少的規則,從checkstyle規則中刪除不必要的規則,保留一部分需要的即可。規則如下:

<?xml version="1.0"?>

<!DOCTYPE module PUBLIC

          "-//Puppy Crawl//DTD Check Configuration 1.3//EN"

          "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<!--

  Checkstyle configuration that checks the sun coding conventions from:

    - the Java Language Specification at

      http://java.sun.com/docs/books/jls/second_edition/html/index.html

    - the Sun Code Conventions at http://java.sun.com/docs/codeconv/

    - the Javadoc guidelines at

      http://java.sun.com/j2se/javadoc/writingdoccomments/index.html

    - the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html

    - some best practices

  Checkstyle is very configurable. Be sure to read the documentation at

  http://checkstyle.sf.net (or in your downloaded distribution).

  Most Checks are configurable, be sure to consult the documentation.

  To completely disable a check, just comment it out or delete it from the file.

  Finally, it is worth reading the documentation.

-->

<module name="Checker">

    <!--

        If you set the basedir property below, then all reported file

        names will be relative to the specified directory. See

        http://checkstyle.sourceforge.net/5.x/config.html#Checker

        <property name="basedir" value="${basedir}"/>

    -->

    <!-- Checks that property files contain the same keys.         -->

    <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->

    <module name="Translation"/>

    <module name="TreeWalker">

        <!-- Checks for Javadoc comments.                     -->

        <!-- See http://checkstyle.sf.net/config_javadoc.html -->

        <module name="JavadocMethod"/>

        <module name="JavadocType"/>

        <module name="JavadocVariable"/>

        <!-- Checks for Naming Conventions.                  -->

        <!-- See http://checkstyle.sf.net/config_naming.html -->

        <module name="ConstantName"/>

        <module name="LocalFinalVariableName"/>

        <module name="LocalVariableName"/>

        <module name="MemberName"/>

        <module name="MethodName"/>

        <module name="PackageName"/>

        <module name="ParameterName"/>

        <module name="StaticVariableName"/>

        <module name="TypeName"/>

        <!-- Checks for Headers                                -->

        <!-- See http://checkstyle.sf.net/config_header.html   -->

        <!-- <module name="Header">                            -->

            <!-- The follow property value demonstrates the ability     -->

            <!-- to have access to ANT properties. In this case it uses -->

            <!-- the ${basedir} property to allow Checkstyle to be run  -->

            <!-- from any directory within a project. See property      -->

            <!-- expansion,                                             -->

            <!-- http://checkstyle.sf.net/config.html#properties        -->

            <!-- <property                                              -->

            <!--     name="headerFile"                                  -->

            <!--     value="${basedir}/java.header"/>                   -->

        <!-- </module> -->

        <!-- Following interprets the header file as regular expressions. -->

        <!-- <module name="RegexpHeader"/>                                -->

        <!-- Checks for imports                              -->

        <!-- See http://checkstyle.sf.net/config_import.html -->

        <module name="AvoidStarImport"/>

        <module name="IllegalImport"/> <!-- defaults to sun.* packages -->

        <module name="RedundantImport"/>

        <module name="UnusedImports"/>

        <!-- Checks for common coding problems               -->

        <!-- See http://checkstyle.sf.net/config_coding.html -->

        <module name="SimplifyBooleanExpression"/>

        <module name="SimplifyBooleanReturn"/>

    </module>

</module>

7.findbugs

使用findbugs檢查常見bug

7.1指令碼

指令碼如下:

<target name="findbugs" depends="checkstyle">

       <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />

       <findbugs home="${findbugs.home}" output="html" outputFile="${findbugsdir}/findbugs_report.html">

           <sourcePath path="${srcdir}" />

           <class location="${projdir}/WorkingArea/Code/cginfo/app.jar" />

       </findbugs>

    </target>

同樣,taskdef定義了findbugs的ant task,需要classpath中增加findbugs的jar包。一個findbugs-ant.jar基本就夠了。

findbugs標籤,home指定findbug安裝目錄。

output定義輸出樣式,一般輸出html形式,xml形式也可,但xml形式再用樣式轉html總是顯示不了bug,沒仔細查問題發生在哪裡。

outputFile指定報告的路徑和檔名。

sourcePath指定原始碼目錄

class指定jar包的目錄和檔名。

7.2執行

執行後檢視報告即可。但findbugs生成的報告與findbugs eclipse外掛檢查的結果有些出入,沒有檢視具體問題發生在哪裡。

8.cpd

cpd是pmd的一個元件,用來檢查重複程式碼。

8.1指令碼

指令碼如下:

    <target name="pmdcpd" depends="findbugs">

       <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" />

       <cpd minimumTokenCount="100" encoding="UTF-8" format="xml" outputFile="${cpddir}/cpd.xml">

           <fileset dir="${srcdir}">

              <include name="**/*.java" />

           </fileset>

       </cpd>

    </target>

taskdef定義了cpd的ant任務,這與pmd任務是分開的。classpath中需要增加pmd解壓目錄的lib目錄下的所有jar包。

cpd標籤的minimumTokenCount指定了最小重複行數,當重複函式大於這個量時產生報告。

encoding指定檔案編碼。

format指定輸出檔案格式。

outputFile指定輸出檔案路徑和檔名稱。

include指定檢查的檔案。可以使用exclude指定剔除的檔案。

8.2執行

執行後檢視輸出檔案,雖然是xml格式,但使用IE開啟很容易檢視,由於只能使用xslt結合xml形式生成html,且初步試驗,生成html檔案有點問題,就放棄了。

9.完整指令碼

完整指令碼如下:

<?xml version="1.0" encoding="utf-8"?>

<project name="myProject" default="start">

    <!-- 變數定義 -->

    <property name="cvsroot" value=":pserver:wangjianxuan:[email protected]:/repository/opermanage" />

    <property name="projdir" value="D:/work/quality_workspace/AntScript" />

    <property name="srcdir" value="${projdir}/WorkingArea/Code/cginfo/src/main" />

    <property name="builddir" value="${projdir}/WorkingArea/Code/cginfo/bin" />

    <property name="checkstyledir" value="${projdir}/checkstyle" />

    <property name="findbugsdir" value="${projdir}/findbugs" />

    <property name="findbugs.home" value="D:/work/quality_workspace/findbugs-1.3.9" />

    <property name="cpddir" value="${projdir}/cpd" />

    <!-- init -->

    <target name="delDir">

       <delete dir="${builddir}" />

       <delete dir="${checkstyledir}" />

       <delete dir="${findbugsdir}" />

       <delete dir="${cpddir}" />

    </target>

    <target name="mkDir" depends="delDir">

       <mkdir dir="${builddir}" />

       <mkdir dir="${checkstyledir}" />

       <mkdir dir="${findbugsdir}" />

       <mkdir dir="${cpddir}" />

    </target>

    <!-- checkout -->

    <target name="checkoutlib" depends="mkDir">

       <cvs cvsroot="${cvsroot}" package="WorkingArea/Code/lib" />

    </target>

    <target name="checkoutsrc" depends="checkoutlib">

       <cvs cvsroot="${cvsroot}" package="WorkingArea/Code/cginfo" />

    </target>

    <!-- javac -->

    <target name="javac" depends="checkoutsrc">

       <javac srcdir="${srcdir}" destdir="${builddir}" source="1.6">

           <compilerarg value="-Xlint:unchecked" />

       </javac>

    </target>

    <!-- jar -->

    <target name="jar" depends="javac">

       <jar destfile="${projdir}/WorkingArea/Code/cginfo/app.jar" basedir="${builddir}" />

    </target>

    <!-- checkstyle -->

    <target name="checkstyle" depends="jar">

       <taskdef resource="checkstyletask.properties" />

       <checkstyle config="lib/check_rules.xml" failureProperty="checkstyle.failure" failOnViolation="false">

           <formatter type="xml" tofile="checkstyle/checkstyle_report.xml" />

           <fileset dir="${srcdir}" includes="**/*.java" />

       </checkstyle>

       <style in="checkstyle/checkstyle_report.xml" out="checkstyle/checkstyle_report.html" style="lib/checkstyle-frames.xsl" />

    </target>

    <!-- findbugs -->

    <target name="findbugs" depends="checkstyle">

       <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />

       <findbugs home="${findbugs.home}" output="html" outputFile="${findbugsdir}/findbugs_report.html">

           <sourcePath path="${srcdir}" />

           <class location="${projdir}/WorkingArea/Code/cginfo/app.jar" />

       </findbugs>

    </target>

    <!-- pmd cpd -->

    <target name="pmdcpd" depends="findbugs">

       <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" />

       <cpd minimumTokenCount="100" encoding="UTF-8" format="xml" outputFile="${cpddir}/cpd.xml">

           <fileset dir="${srcdir}">

              <include name="**/*.java" />

           </fileset>

       </cpd>

    </target>

    <!-- run -->

    <target name="start" depends="pmdcpd">

    </target>

</project>


相關推薦

程式碼檢測工具箱——checkstylefindbugspmd-cpd

 寫在前面 好吧,我承認,我懶了,寫了一天文件,到這裡直接貼上了,希望大家能看懂,如果需要一份格式完整的文件,請去我的百度文庫下載,地址是: 下面,開始 一.目的: 最近要跟蹤一個專案的程式碼質量,保障專案質量。個人總是認為,質量保障這個東西要用資料說話的。程

idea,配置checkstyle 【提高程式碼質量,檢查程式碼規範的工具 】CheckstyleFindBugsPMD,Jtest

idea,配置checkstyle 【提高程式碼質量,檢查程式碼規範的工具 】Checkstyle,FindBugs,PMD,Jtest 2016年12月15日 14:19:02 common_util 閱讀數:18818更多 個人分類: 開發 版權宣告:本文為博主原創文章,可以轉載分

主流Java靜態檢查工具checkstylefindbugsPMD異同點

工作之中遇到了JAVA靜態檢查相關內容,在此以作總結。 目錄 靜態檢查概念 靜態檢查理論基礎和應用技術 主流Java靜態分析工具 三者區別 三者內建程式設計規範 簡單對比 總結 靜態檢查概念 靜態程式碼分析是指無需執行被測程式碼,僅通過分析或檢查源程式的語法

Intellij IDEA 使用checkstylepmdfindbugs檢查靜態程式碼質量

checkstye、pmd、findbugs的對比 在IDEA setting-plugins 下分別搜尋 checkstyle、pmd、findbugs 安裝,安裝後要重啟IDEA。 checkstyle 如上圖開啟checkstyle面板。 可以自己設

FindbugsPMDCheckStyles程式碼分析工具介紹

FindBugs、PMD和CheckStyle對比 1.     概要 工具 目的 檢查項 FindBugs 檢查.class 基於Bug Pattern

IDEAL葵花寶典:java程式碼開發規範外掛 checkstylevisualVMPMD 外掛

前言: visualVM: 執行java程式的時候啟動visualvm,方便檢視jvm的情況 比如堆記憶體大小的分配;某個物件佔用了多大的記憶體,jvm調優必備工具。 checkstyle: CheckStyle是SourceForge下的一個專案,提供了一個幫助JAVA開發人員遵守某些編碼規範的工具。   

FindBugsPMDCheckStyle對比

FindBugs、PMD和CheckStyle對比 1.     概要 工具 目的 檢查項 FindBugs 檢查.class 基於Bug Pattern

MyEclipse2014 安裝 checkstylePMDfindbugs 最簡便

近期由於實驗要求進行程式碼評審和程式效能優化,需要在MyEclipse下安裝一些外掛,但是因為現在的MyEclipse版本和大多數教程的不一樣了,一些安裝選項也已經改變,所以安裝起來很費事,通過不斷的嘗試,參考和剁教程並且自己實踐的基礎上,整理了一下關於checksty

如何更好地利用PmdFindbugsCheckStyle分析結果

這裡列出了很多Java靜態分析工具,每一種工具關注一個特定的能發揮自己特長的領域,我們可以列舉一下: 工具 目的 檢查項 FindBugs 檢查.class 基於Bug Patterns概念,查詢javabytecode(.class檔案)中

Java程式碼靜態檢查規範格式化和checkstyle檢查配置文件

<?xml version="1.0"?> <!DOCTYPE module PUBLIC           "-//Puppy Crawl//DTD Check Configuration 1.2//EN"           "http://www.puppycrawl.co

Jenkins+maven+git 實現自動構建許可權管理靜態程式碼檢測遠端部署傳送郵件功能

Jenkins配置 1. 使用者許可權設定 配置->Configure Global Security (注:想讓匿名使用者可以瀏覽jenkins網站 需勾選Overall 中的read 和 Job

阿里p3c是CheckStyleFindBugs的補充

        高階黑: P3C是老美的先進反潛偵察機,新聞裡經常能看到; 阿里將程式碼規範檢查外掛命名為p3c,大概就是取其先進、監測的意思吧。        阿里雲棲大會最新開源的Java程式碼規範檢查工具p3c, 作用類似於CheckStyle,  是《阿里巴巴Jav

【特徵工程】一種異常值檢測方法原理程式碼實現 (基於箱線圖)

先介紹使用到的方法原理,也就是一種異常檢測的方法。 首先要先了解箱線圖。 箱線圖 箱線圖(Boxplot)也稱箱須圖(Box-whisker Plot),是利用資料中的五個統計量:最小值、第一四分位數、中位數、第三四分位數與最大值來描述資料的一種方法,它也可以

影象特徵檢測描述(一):SIFTSURFORBHOGLBP特徵的原理概述及OpenCV程式碼實現

什麼叫特徵檢測?就是檢測影象中目標的特徵唄,所謂特徵,不管你怎麼旋轉目標,離目標遠近,它的特徵都應不變才對,這兩個特性稱為叫旋轉不變性和尺度不變性。當然還有其它特徵,如光照不一樣,也不應該變化嘛,只是旋轉不變性和尺度不變性是最基本的兩個要求。 對特徵的描述有很多種方法和運算

Java程式碼質量檢查checkstyle, pmd, cpd, p3c,findbugs, jacoco, sonarquebe以及和Jenkins整合

概述 又搞一邊質量掃描外掛,之前做過一遍,然後後面各種忽略,然後就放棄了,所以,應該尋找一種方法,循序漸進的實施。本次將實施一個基本的打包掃描方案,包含 checkstyle 固定團隊編碼風格,固定命名風格以及換行風格等,原型配置出資googlestyle, 修改縮排為4個字元(原型是2個) surefil

我收集的一些目標檢測跟蹤識別標準測試視頻集和圖像數據庫

ima detail track 分離 urb images data mic hang 一個網友收集的運動目標檢測,陰影檢測的標準測試視頻 http://blog.csdn.net/sunbaigui/article/details/6363390 很權威的c

adb命令檢測apk啟動時間內存CPU使用情況流量電池電量等——常用的adb命令

serial 信息 proc idg 情況 電量 pid art str ADB:Android Debug Bridge,是Android SDK裏一個可以直接操作安卓模擬器或真實設備的工具,頗為強大。 檢測APP: adb shell am start

OpenCV——邊緣檢測(sobel算子Laplacian算子scharr濾波器)

scale 變換 得到 疊加 操作 fault sch laplacian 技術 1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using nam

學習筆記-目標檢測定位識別(RCNN,Fast-RCNN, Faster-RCNN,Mask-RCNN,YOLO,SSD 系列)

0. 前言 說到深度學習的目標檢測,就要提到傳統的目標檢測方法。 傳統的目標檢測流程: 1)區域選擇(窮舉策略:採用滑動視窗,且設定不同的大小,不同的長寬比對影象進行遍歷,時間複雜度高) 2)特徵提取(SIFT、HOG等;形態多樣性、光照變化多樣性、背景多樣性使得特徵魯棒性差)

獲取省區的js程式碼控制

$(function() { // 初始化省市區 initAddress(); // 更改省份後的操作 $("select[name='province']").change(function() { var provCode = $("select