信息網(wǎng)站怎么做網(wǎng)絡(luò)零售的優(yōu)勢有哪些
Kotlin OpenCV 圖像圖像50 Haar 級聯(lián)分類器模型
- 1 OpenCV Haar 級聯(lián)分類器模型
- 2 Kotlin OpenCV Haar 測試代碼
1 OpenCV Haar 級聯(lián)分類器模型
Haar級聯(lián)分類器是一種用于對象檢測(如人臉檢測)的機(jī)器學(xué)習(xí)算法。它由Paul Viola和Michael Jones在2001年提出,通常用于實時檢測,因為它速度快且性能良好。
基本原理 | 解釋 |
---|---|
Haar特征 | Haar特征是從圖像中提取的簡單矩形特征,通過比較相鄰區(qū)域的像素值來描述圖像的局部特征。 常見的Haar特征有邊緣特征、線條特征和四邊形特征。 每個Haar特征值由區(qū)域內(nèi)像素的加權(quán)和計算得到,具體公式為特征值 = 黑色區(qū)域像素值總和 - 白色區(qū)域像素值總和。 |
積分圖(Integral Image) | 積分圖是一種圖像表示方法,方便快速計算矩形區(qū)域的像素和。 通過積分圖,可以在常數(shù)時間內(nèi)計算任意矩形區(qū)域的像素和。 |
級聯(lián)分類器(Cascade Classifier) | 級聯(lián)分類器由一系列弱分類器(如決策樹樁)組成,每個弱分類器使用一個或多個Haar特征進(jìn)行分類。 弱分類器按順序排列,每個分類器將圖像區(qū)域分為正例(目標(biāo)對象)和負(fù)例(非目標(biāo)對象)。 如果某個區(qū)域被認(rèn)為是負(fù)例,則立即停止檢測;如果被認(rèn)為是正例,則繼續(xù)傳遞到下一個分類器。 這種級聯(lián)結(jié)構(gòu)大大提高了檢測速度,因為大部分非目標(biāo)區(qū)域在早期就被排除。 |
文件夾 | 用途 | 特點 |
---|---|---|
lbpcascades | 包含基于局部二值模式 (Local Binary Patterns, LBP) 的級聯(lián)分類器文件。LBP 是一種有效的紋理特征描述符,在對象檢測中表現(xiàn)良好。 | 計算效率高: LBP 特征計算簡單,因此在對象檢測時速度較快。 魯棒性: 對光照變化和其他環(huán)境變化有較好的魯棒性。 常用分類器: 人臉檢測等。 |
hogcascades | 包含基于方向梯度直方圖 (Histogram of Oriented Gradients, HOG) 特征的級聯(lián)分類器文件。HOG 特征在檢測行人等對象時表現(xiàn)良好。 | 特征描述能力強(qiáng): HOG 特征能夠捕捉對象的形狀和外觀信息。 高檢測精度: 尤其在檢測行人方面有較高的精度。 |
haarcascades_cuda | 包含利用 CUDA 加速的 Haar 特征級聯(lián)分類器文件。這些分類器利用 GPU 進(jìn)行加速計算,提高檢測速度。 類似于 haarcascades 文件夾中的文件,是加速版本。 | 高性能: 利用 GPU 的并行計算能力,大幅提升檢測速度。 需要支持 CUDA 的 GPU: 需要系統(tǒng)安裝 CUDA 并支持相應(yīng)的 GPU 硬件。 |
haarcascades | 包含基于 Haar 特征的級聯(lián)分類器文件。這是 OpenCV 中最常用的對象檢測分類器之一。 | 歷史悠久: Haar 級聯(lián)分類器是最早用于人臉檢測的算法之一。 計算復(fù)雜度適中: 相比 LBP 更復(fù)雜,但特征描述能力也更強(qiáng)。 廣泛應(yīng)用: 用于人臉、眼睛、微笑等對象的檢測。 |
haarcascades_cuda 和 haarcascades 文件的主要區(qū)別在于它們是否利用 CUDA 加速進(jìn)行對象檢測。
haarcascades/haarcascades_cuda 文件夾 | 用途 |
---|---|
haarcascade_eye.xml | 用于檢測人眼。 |
haarcascade_eye_tree_eyeglasses.xml | 用于檢測戴眼鏡的人眼。 |
haarcascade_frontalcatface.xml | 用于檢測貓的正面臉部。 |
haarcascade_frontalcatface_extended.xml | 用于檢測貓的正面臉部(擴(kuò)展版本)。 |
haarcascade_frontalface_alt.xml | 用于檢測人臉的另一個版本。 |
haarcascade_frontalface_alt2.xml | 用于檢測人臉的另一個替代版本。 |
haarcascade_frontalface_alt_tree.xml | 用于檢測人臉的另一個替代版本(樹狀結(jié)構(gòu))。 |
haarcascade_frontalface_default.xml | 用于檢測人臉的默認(rèn)版本。 |
haarcascade_fullbody.xml | 用于檢測人體的完整體。 |
haarcascade_lefteye_2splits.xml | 用于檢測左眼(兩部分)。 |
haarcascade_license_plate_rus_16stages.xml | 用于檢測俄羅斯車牌(16階段)。 |
haarcascade_lowerbody.xml | 用于檢測人體的下半身。 |
haarcascade_profileface.xml | 用于檢測人臉的側(cè)面(側(cè)臉)。 |
haarcascade_righteye_2splits.xml | 用于檢測右眼(兩部分)。 |
haarcascade_russian_plate_number.xml | 用于檢測俄羅斯車牌號碼。 |
haarcascade_smile.xml | 用于檢測微笑。 |
haarcascade_upperbody.xml | 用于檢測人體的上半身。 |
hogcascades文件夾 | 用途 |
---|---|
hogcascade_pedestrians.xml | 用于在圖像或視頻中檢測行人。 |
lbpcascades文件夾 | 用途 |
---|---|
lbpcascade_frontalcatface.xml | 用于檢測貓的正面臉部。 |
lbpcascade_frontalface.xml | 用于檢測人臉的正面部分。 |
lbpcascade_frontalface_improved.xml | 用于檢測人臉的正面部分,改進(jìn)版本。 |
lbpcascade_profileface.xml | 用于檢測人臉的側(cè)面部分。 |
lbpcascade_silverware.xml | 用于檢測銀器(如刀、叉、勺等餐具)。 |
2 Kotlin OpenCV Haar 測試代碼
package com.xu.com.xu.imageimport org.opencv.core.MatOfRect
import org.opencv.core.Point
import org.opencv.core.Scalar
import org.opencv.highgui.HighGui
import org.opencv.imgcodecs.Imgcodecs
import org.opencv.imgproc.Imgproc
import org.opencv.objdetect.CascadeClassifier
import java.io.File
import java.util.*object FaceDetect {init {val os = System.getProperty("os.name")val type = System.getProperty("sun.arch.data.model")if (os.uppercase(Locale.getDefault()).contains("WINDOWS")) {val lib = if (type.endsWith("64")) {File("lib\\opencv\\x64\\" + System.mapLibraryName("opencv_java4100"))} else {File("lib\\opencv\\x86\\" + System.mapLibraryName("opencv_java4100"))}System.load(lib.absolutePath)}}@JvmStaticfun main(args: Array<String>) {face()}private fun face() {val facebook = CascadeClassifier("lib/opencv/data/haarcascades/haarcascade_frontalface_alt2.xml")val image = Imgcodecs.imread("C:\\Users\\hyacinth\\Desktop\\1.png")val face = MatOfRect()facebook.detectMultiScale(image, face)val reacts = face.toArray()println("匹配到 " + reacts.size + " 個人臉")for (i in reacts.indices) {Imgproc.rectangle(image,Point(reacts[i].x.toDouble(), reacts[i].y.toDouble()),Point((reacts[i].x + reacts[i].width).toDouble(), (reacts[i].y + reacts[i].height).toDouble()),Scalar(0.0, 0.0, 255.0), 2)Imgproc.putText(image,i.toString(),Point(reacts[i].x.toDouble(), reacts[i].y.toDouble()),Imgproc.FONT_HERSHEY_SCRIPT_SIMPLEX,1.0,Scalar(0.0, 0.0, 255.0),2,Imgproc.LINE_AA,false)}HighGui.imshow("人臉識別", image)HighGui.waitKey(0)}}