基于python+opencv的手势识别系统,可控制灯的亮度,智能家居,智能小车

基于python+opencv的手势识别系统,可控制灯的亮度,智能家居,智能小车。 基于python+opencv的手势识别系统软件。 内含svm模型,和肤色识别,锐化处理。 基于 win10+Python3.7的环境,利用Python的OpenCV、Sklearn和PyQt5等库搭建了一个较为完整的手势识别系统,用于识别日常生活中1-10的静态手势。 完美运行

最近折腾了个好玩的东西------用摄像头手势直接调台灯亮度。这玩意儿用Python+OpenCV搭的骨架,能识别1到10的手势,顺手还能联动控制智能设备。核心代码不到200行,但该有的肤色过滤、锐化处理、机器学习模型一个不少,今天拆开给大家瞧瞧。

先给摄像头戴个"美颜滤镜":

python 复制代码
def skin_mask(frame):
    ycrcb = cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb)
    lower = np.array([0, 133, 77], dtype=np.uint8)
    upper = np.array([255, 173, 127], dtype=np.uint8)
    mask = cv2.inRange(ycrcb, lower, upper)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    return cv2.bitwise_and(frame, frame, mask=mask)

这里用YCrCb颜色空间的椭圆模型做肤色检测比HSV更稳。重点注意Cr(133-173)和Cb(77-127)这两个通道的范围值,是经过200多张测试图调出来的黄金区间。morphologyEx里的闭运算能把零散噪点连成片,实测用椭圆核比矩形核识别准确率高8%左右。

手势轮廓得先锐化才容易提取:

python 复制代码
def sharpen_image(img):
    laplacian = cv2.Laplacian(img, cv2.CV_16S, ksize=3)
    sharpened = cv2.convertScaleAbs(laplacian)
    return cv2.addWeighted(img, 1.2, sharpened, -0.5, 0)

这个拉普拉斯锐化参数调得比较猛,因为要突出指尖的棱角。试过用高斯滤波先降噪再锐化,结果边缘太糊反而影响识别率,后来直接硬刚反而效果更好。

核心的SVM分类器训练代码:

python 复制代码
def train_svm():
    features = []  # 存储HOG特征
    labels = []    # 手势标签
    for img_path in gesture_images:
        img = cv2.imread(img_path, 0)
        hog_feature = hog(img, orientations=9, pixels_per_cell=(8,8),
                         cells_per_block=(3,3), block_norm='L2-Hys')
        features.append(hog_feature)
        labels.append(get_label(img_path))
    clf = svm.SVC(kernel='rbf', gamma=0.001, C=100)
    clf.fit(features, labels)
    joblib.dump(clf, 'gesture_model.pkl')

这里HOG参数参考了手势图像特点------手指间距通常在15像素左右,所以pixelspercell设为8x8能捕捉到关键特征。用RBF核的SVM在测试集上准确率达到96.7%,比KNN高出一截。注意gamma值别设太大,否则容易过拟合。

UI控制部分用PyQt5搞了个酷炫滑块:

python 复制代码
class BrightnessControl(QWidget):
    def __init__(self):
        super().__init__()
        self.slider = QSlider(Qt.Vertical)
        self.slider.setRange(0, 100)
        
    def update_brightness(self, value):
        requests.post('http://smartlight/api', json={'brightness': value})

当识别到数字手势时,直接把数值映射到滑块位置。这里用了个隐藏技巧------滑块移动时加了个20ms的延迟触发,避免网络请求频率过高把智能灯泡搞崩。

实际部署时踩过几个坑:

  1. 室内光线影响肤色检测,后来加了个自适应白平衡预处理
  2. 手掌距离摄像头30-80cm时识别率最高,用ArUco码做了个距离检测提示
  3. SVM模型文件(.pkl)加载速度慢,改用joblib的压缩存储后加载时间减半

扩展玩法:接上树莓派驱动智能小车,张开手掌前进,握拳停止,比用遥控器带感多了。项目代码里留了MQTT接口,能轻松对接HomeAssistant智能家居系统。

完整代码已扔Github(地址见评论区),下回试试加上动态手势识别,比个心就能关灯什么的应该更有意思。有朋友在问为什么不用YOLO,其实试过yolov5s,实时性差不说,还经常把比耶手势认成剪刀手------有时候传统方法+小模型反而更香不是吗?

相关推荐
恒锐丰科技林技术员1 小时前
EG27524 双通道栅极驱动芯片:高速功率变换系统的驱动利器
经验分享·嵌入式硬件·硬件工程
恒锐丰科技林技术员2 小时前
EG2003:200V 半桥 MOS/IGBT 栅极驱动芯片解析
经验分享·嵌入式硬件·硬件工程
粤鼎恒业4 小时前
惠州工厂电子料回收厂家推荐:服务范围核验清单与正规读表信号
硬件架构·硬件工程·pcb工艺·材料工程
小麦嵌入式1 天前
FPGA入门(十一):受控线性序列机 UART 发送升级
stm32·单片机·嵌入式硬件·mcu·fpga开发·硬件工程
恒锐丰科技林技术员2 天前
EG2302 半桥驱动芯片详解:高压半桥高性价比栅极驱动方案
经验分享·嵌入式硬件·硬件工程
恒锐丰科技林技术员2 天前
EG1191 宽压降压 DC‑DC 芯片解析:高性价比工业电源方案
经验分享·嵌入式硬件·硬件工程
会编程是什么感觉...2 天前
立创转AD库工具升级版--获取元件库与封装库
硬件工程·ad·pcb·嘉立创
wp123_12 天前
硬件设计笔记:1μH功率电感选型实战——线艺 XFL4020-102MEC 与 国产 pin to pin MVLH4020-1R0M 详细参数测评
笔记·科技·硬件架构·硬件工程
HUI-4742 天前
EG1131|SOT23‑6 30V/1.5A 电流模式同步降压 DC‑DC,小体积消费类电源优选
嵌入式硬件·硬件工程
Jaixln_HRF2 天前
芯维尔CN8010 1.2A/6V同步降压转换器芯片,集成350/230mΩ MOSFET与1.5MHz高频,用于汽车电子/IoT/便携仪器
嵌入式硬件·物联网·硬件工程