openCV之HAAR特征(代码实现)

前言:今天是团队的集训日,自己选了HAAR特征的课题来研究,参考了很多博文,都没给出代码实现,遂贡献下自己的代码吧。关于HAAR特征网上已经有很多博文解释的很好了,我肯定是没他们写得好啦,所以我会在下面给出我看到最好的文章。而且最近在看机器学习的内容,博客更新的有点慢。
推荐参考博客连接:http://blog.csdn.net/jing_xin/article/details/17383161


关于积分图:图一是参考博客里的,图二是自己画的,可以帮助你们理解下我的代码
图一
图一
这里写图片描述
图二
这里写图片描述


关于代码:我只实现了横向的比较,就是下图两矩形类右边的那个,其他情况类似

这里写图片描述

import cv2 as cv

#积分图
def intergralMat(input = [],weigth = 0 ,height = 0):
    output = []
    output.clear()
    columnSum = [0 for i in range(weigth)]
    for i in range(height):
        output.append([0 for x in range(weigth)])
        for j in range(weigth):
            if j == 0:
                columnSum[j] = int(input[i][j])
            else:
                columnSum[j] = columnSum[j-1] + int(input[i][j])
            if i == 0:
                output[i][j] = columnSum[j]
            else:
                output[i][j] = output[i-1][j] + columnSum[j]
    return output

#哈尔图,默认size=1,deep=2
def myHaar(interM = [],weigth = 0,height = 0,size = 1,deep = 2):
    dst = []
    for i in range(height - deep + 1):
        dst.append([0 for x in range(weigth - size)])
        for j in range(weigth - 2*size +1):
            whithe,black = (0,0)
            if j == 0 and i==0:
                whithe = int(interM[i+deep-1][j+size-1])
            elif i!=0 and j==0:
                whithe = int(interM[i + deep - 1][j + size - 1]) - int(interM[i - 1][j + size -1])
            elif i == 0 and j != 0:
                whithe = int(interM[i+deep-1][j+size-1]) - int(interM[i+1][j-1])
            else:
                whithe = int(interM[i+deep-1][j+size-1]) + int(interM[i-1][j-1]) - int(interM[i+1][j-1]) - int(interM[i -1][j+ size -1])
            _i = i
            _j = j + size
            if _i == 0:
                black = int(interM[_i+deep-1][_j+size-1]) - int(interM[_i+1][_j-1])
            else:
                black = int(interM[_i+deep-1][_j+size-1]) + int(interM[_i-1][_j-1]) - int(interM[_i+1][_j-1]) - int(interM[_i - 1][_j+ size -1])
            dst[i][j] = black - whithe
    return dst



def main():
    src = cv.imread('1.jpg')
    tmp = src.copy()
    # 分裂出三通道。这里只取b通道来进行分析,实际应该是分析三个通道,再合并
    b, g, r = cv.split(src)
    # 用于得到图像的宽高
    _w = len(b[0])
    _h = len(b)
    in_b = intergralMat(b, _w, _h)
    Haar_b = myHaar(in_b, _w, _h)
    dst = []
    for x in range(len(Haar_b)):
        dst.append([])
        for y in range(len(Haar_b[0])):
            if Haar_b[x][y] > 0:
                dst[x].append(255)
            else:
                dst[x].append(0)
    for x in range(len(dst)):
        for y in range(len(dst[0])):
            f = dst[x][y]
            tmp[x, y] = [f, f, f]

    cv.imshow('src', src)
    cv.imshow('test', tmp)
    cv.waitKey()

main()

效果图:由于只实现了横向的比较,所以只有竖直的线可以提取特征
这里写图片描述

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用 Delphi-OpenCV 进行 Haar 特征对比的示例代码: ```delphi uses CvHaarTraining, CvHaarDetectObjects; procedure CompareHaarFeatures(const Image1, Image2: string; const XMLFile: string); var Img1, Img2: pIplImage; Cascade: pCvHaarClassifierCascade; Storage: pCvMemStorage; Faces1, Faces2: pCvSeq; i, j: Integer; Feature1, Feature2: pSingle; Similarity: Single; begin // 读取图像 Img1 := LoadImage(Image1); Img2 := LoadImage(Image2); // 加载 Haar 特征分类器 Cascade := Load(XMLFile); // 对图像进行人脸检测 Storage := cvCreateMemStorage(0); Faces1 := HaarDetectObjects(Img1, Cascade, Storage); Faces2 := HaarDetectObjects(Img2, Cascade, Storage); // 对比人脸特征 for i := 0 to Faces1.total - 1 do begin for j := 0 to Faces2.total - 1 do begin // 提取 Haar 特征向量 Feature1 := ExtractHaarFeatures(Img1, Faces1.ptr[i], Cascade); Feature2 := ExtractHaarFeatures(Img2, Faces2.ptr[j], Cascade); // 比较两个特征向量的相似度 Similarity := CompareHist(Feature1, Feature2, CV_COMP_CORREL); // 输出比较结果 if Similarity > 0.8 then Writeln('Face ', i + 1, ' in Image 1 is similar to Face ', j + 1, ' in Image 2 (similarity = ', Similarity, ')'); end; end; // 释放资源 cvReleaseMemStorage(@Storage); cvReleaseHaarClassifierCascade(@Cascade); cvReleaseImage(@Img1); cvReleaseImage(@Img2); end; ``` 在上述代码中,`Image1` 和 `Image2` 分别为待比较的两张图像的文件路径,`XMLFile` 为 Haar 特征分类器的 XML 文件路径。在人脸检测和特征比较的过程中,我们使用了 Delphi-OpenCV 中提供的 `HaarDetectObjects`、`ExtractHaarFeatures` 和 `CompareHist` 等函数。最后,我们根据比较结果输出相似度较高的人脸矩形区域的编号。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值