You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中获取HAAR特征向量?OpenCV已实现HOG特征提取

在Python中获取HAAR特征向量的方法

Hey,这个问题问到点子上了!虽然OpenCV里的HAAR工具大多是给级联分类器(比如人脸检测)用的,没有直接给出提取HAAR特征向量的API,但咱们有两种靠谱的实现方式:

方法一:用scikit-image直接提取(推荐)

scikit-image的feature模块提供了现成的haar_like_feature函数,能高效提取HAAR特征向量,步骤超简单:

  1. 先装依赖(没装过的话):
pip install scikit-image opencv-python numpy
  1. 代码示例:
import numpy as np
import cv2
from skimage.feature import haar_like_feature, haar_like_feature_coord
from skimage.transform import integral_image

# 1. 读取并预处理图像:转灰度+统一尺寸
img = cv2.imread("your_image.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray_img = cv2.resize(gray_img, (64, 64))  # 固定尺寸方便特征对齐

# 2. 计算积分图像(HAAR特征计算的核心,加速区域像素和计算)
int_img = integral_image(gray_img)

# 3. 可选:生成特征对应的区域坐标和类型(方便理解每个特征的含义)
feature_coord, feature_type = haar_like_feature_coord(
    gray_img.shape[0], gray_img.shape[1],
    feature_types=('type-2-x', 'type-2-y', 'type-3-x', 'type-3-y', 'type-4')
)

# 4. 提取HAAR特征向量
haar_features = haar_like_feature(
    int_img, 0, 0, gray_img.shape[0], gray_img.shape[1],
    feature_type=feature_type, feature_coord=feature_coord
)

print(f"提取到的HAAR特征向量长度:{len(haar_features)}")
print(f"前10个特征示例:{haar_features[:10]}")

小说明:

  • feature_types参数指定要提取的HAAR特征类型:横向双矩形、纵向双矩形、三矩形、四矩形这些都支持,按需选就行
  • 积分图像的作用是把任意矩形区域的像素和计算从O(n)降到O(1),大幅提升计算速度

方法二:基于OpenCV手动实现(适合学习原理)

如果不想依赖第三方库,也可以手动用OpenCV的基础操作计算HAAR特征。这里以最基础的横向双矩形特征为例:

import cv2
import numpy as np

def calculate_horizontal_haar(img, x, y, w, h):
    # 计算上下两个矩形的像素和之差
    top_area = img[y:y+h//2, x:x+w]
    bottom_area = img[y+h//2:y+h, x:x+w]
    return np.sum(top_area) - np.sum(bottom_area)

# 读取图像并预处理
img = cv2.imread("your_image.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.resize(gray, (64, 64))

# 滑动窗口提取所有横向双矩形特征(简化版,固定步长)
haar_features = []
step = 4  # 窗口滑动步长
for h in range(8, gray.shape[0]+1, step):
    for w in range(8, gray.shape[1]+1, step):
        for y in range(gray.shape[0] - h + 1):
            for x in range(gray.shape[1] - w + 1):
                feat = calculate_horizontal_haar(gray, x, y, w, h)
                haar_features.append(feat)

print(f"手动提取的HAAR特征向量长度:{len(haar_features)}")

这种方式完全自定义,但缺点是要自己实现所有特征类型和滑动窗口逻辑,计算效率较低,适合用来理解HAAR特征的底层原理。

额外提醒

  • HAAR特征的维度极高(比如64x64的图像,仅横向双矩形特征就可能有上万维),直接用原始特征做后续任务会很吃力,通常需要配合AdaBoost算法做特征选择
  • 如果你的目标是训练分类器,其实OpenCV的cv2.CascadeClassifier已经封装了HAAR特征+AdaBoost的训练流程,直接用cv2.CascadeClassifier.train()就行,不用手动提取特征向量

内容的提问来源于stack exchange,提问作者sultan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:41:17