python手势识别上下左右(SVM+HOG特征)

项目环境:opencv==3.4.5       scikit-learn =>=0.20.2.     numpy == 1.17.4

参考博客:https://blog.csdn.net/qq_41562704/article/details/88975569

一、收集数据集

1、数据集图片的大小 300x300

2、获取上、下、左、右的手势,进行皮肤检测,将背景二值化

3、皮肤检测参考文章(https://blog.csdn.net/weixin_40893939/article/details/84527037

dataset.py

# -*- coding: utf8 -*-
# @auth 
# 获取数据集
import cv2
import numpy as np 
from picture import skinMask
#图片数据格式为 300x300
HEIGHT = 300
WIDTH  = 300
#获取手势框左上角坐标
x0 	   = 100
y0 	   = 100
#保存图片计数器
count = 0

if __name__ == '__main__':
	cap = cv2.VideoCapture(0) #打开摄像头
	while True:
		ret, frame = cap.read() #读取摄像头内容

		if ret == False: 
			break #若内容读取失败则跳出循环

		frame = cv2.flip(frame, 1) #翻转图片
		cv2.rectangle(frame, (x0-1,y0-1), (x0+WIDTH+1, y0+HEIGHT+1), (0,255,0), 2) #画出获取手势的位置框
		roi = frame[y0:y0+HEIGHT, x0:x0+WIDTH] # 获取手势框内容
		res = skinMask(roi) # 皮肤检测
		frame[y0:y0+HEIGHT, x0:x0+WIDTH] = res # 将肌肤检测后
		cv2.imshow("frame", frame) #展示图片
		key = cv2.waitKey(25) #获取按键,进行判断下一步操作
		if key == 27:
			break # 按ESC键退出
		elif key == ord("w"):
			y0 -= 5 # 按w向上移动
		elif key == ord("a"):
			x0 -= 5 # 按a向左移动
		elif key == ord("s"):
			y0 += 5 # 按s向下移动
		elif key == ord("d"):
			x0 += 5 # 按d向右移动
		elif key == ord("l"):
		# 按l保存手势
			count += 1
			cv2.imwrite("./dataset/{:d}.png".format(count), roi) # 保存手势

	cap.release()
	cv2.destroyAllWindows()

效果展示:

          按键:a(左移手势框),    w(上移手势框),      s(下移手势框),     d(右移手势框),    l(保存手势框中数据)

二、训练数据集

1、提取数据集的HOG特征,调用OpenCV自带函数

2、使用SVM进行训练,分类

classify.py

# -*- coding: utf-8 -*-
# @auth
# 使用SVM对手势方向进行训练, 分类

import cv2
import numpy as np 
from os import listdir
from sklearn.svm import SVC
from sklearn.externals import joblib
from sklearn.model_selection import GridSearchCV

train_path = "./feature/"
test_path  = "./test_feature/"
model_path = "./model/"

# 将txt文件中的特征转化成向量
def txtToVector(filename, N):
	returnVec = np.zeros((1,N))
	fr = open(filename)
	lineStr = fr.readline()
	lineStr = lineStr.split(" ")
	for i in range(N):
		returnVec[0, i] = int(lineStr[i])
	return returnVec


# 训练SVM
def train_SVM(N):
	svc = SVC()
	parameters = {'kernel':('linear', 'rbf'),
	              'C':[1, 3, 5, 7, 9, 11, 13, 15, 17, 19],
	              'gamma':[0.00001, 0.0001, 0.001, 0.1, 1, 10, 100, 1000]}#预设置一些参数值
	hwLabels = []#存放类别标签
	trainingFileList = listdir(train_path)
	m = len(trainingFileList)
	trainingMat = np.zeros((m,N))
	for i in range(m):
		fileNameStr = trainingFileList[i]
		classNumber = int(fileNameStr.split('_')[0])
		hwLabels.append(classNumber)
		trainingMat[i,:] = txtToVector(train_path+fileNameStr, N)#将训练集改为矩阵格式
	clf = GridSearchCV(svc, parameters, cv=5, n_jobs=8)#网格搜索法,设置5-折交叉验证
	clf.fit(trainingMat, hwLabels)
	print(clf.return_train_score)
	print(clf.best_params_) #打印出最好的结果
	best_model = clf.best_estimator_
	print("SVM Model saved")
	save_path = model_path + "svm_train_model.m"
	joblib.dump(best_model,save_path)#保存最好的模型


# 测试SVM
def test_SVM(clf,N):
	testFileList = listdir(train_path)
	errorCount = 0#记录错误个数
	mTest = len(testFileList)
	for i in range(mTest):
		fileNameStr = testFileList[i]
		classNum = int(fileNameStr.split('_')[0])
		vectorTest = txtToVector(train_path+fileNameStr,N)
		valTest = clf.predict(vectorTest)
		#print("分类返回结果为%d\t真实结果为%d" % (valTest, classNum))
		print("file:", fileNameStr,"classNum:", classNum, "Test:", clf.predict(vectorTest))
		if valTest != classNum:
			errorCount += 1
	print("总共错了%d个数据\n错误率为%f%%" % (errorCount, errorCount/mTest * 100))


# 载入模型并进行测试
def test_fd(fd_test):
	clf = joblib.load(model_path + "svm_train_model.m")
	test_svm = clf.predict(fd_test)
	return test_svm


if __name__=="__main__":
	train_SVM(99)
	clf = joblib.load(model_path + "svm_train_model.m")
	test_SVM(clf,99)


训练后,结果测试:

                                              

三、完成训练

运行myGUI.py

效果展示:


小结:

1、训练样本共1417张手势图片

2、食指超出摄像界面或是手臂出现在摄像界面中错误概率较大

3、运行GUI界面可能会出现“延迟卡顿”(鼠标点击终端会更新识别状态)

4、代码下载

  • 5
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
Python OpenCV HOG SVM 行人检测是使用Python编程语言和OpenCV库来实现行人检测的一种方法。该方法主要利用了HOG(Histogram of Oriented Gradients)特征SVM(Support Vector Machine)分类器来检测行人。 以下是 Python OpenCV HOG SVM 行人检测的步骤: 1. 收集行人图像数据集并标注。 2. 提取图像中的HOG特征。 3. 利用提取的特征训练SVM分类器。 4. 在测试图像中使用训练好的SVM分类器来检测行人。 具体实现细节如下: 1. 数据集收集和标注 要进行行人检测,首先需要收集行人图像数据集并进行标注。可以使用现有的数据集,例如INRIA行人数据集,或者自己创建数据集。 对于数据集的标注,可以使用图像标注工具来手动标注,例如LabelImg或VGG Image Annotator(VIA)。对于每个行人图像,需要标注行人的位置和大小。 2. 提取HOG特征 OpenCV提供了HOGDescriptor函数来提取图像中的HOG特征HOG特征是由图像中不同方向的梯度组成的向量,可以有效地表示图像的纹理和形状特征。 代码示例: ``` import cv2 # 创建HOG描述符对象 hog = cv2.HOGDescriptor() # 提取HOG特征 features = hog.compute(image) ``` 其中,image是输入图像,features是提取的HOG特征向量。 3. 训练SVM分类器 在提取HOG特征后,需要使用训练数据集来训练SVM分类器。可以使用OpenCV提供的SVM函数来实现训练。 代码示例: ``` import cv2 # 加载训练数据集和标签 train_data = cv2.imread('train_data.png') train_labels = cv2.imread('train_labels.png') # 创建SVM分类器对象 svm = cv2.ml.SVM_create() # 设置SVM参数 svm.setType(cv2.ml.SVM_C_SVC) svm.setKernel(cv2.ml.SVM_LINEAR) svm.setTermCriteria((cv2.TERM_CRITERIA_MAX_ITER, 100, 1e-6)) # 训练SVM分类器 svm.train(train_data, cv2.ml.ROW_SAMPLE, train_labels) ``` 其中,train_data是训练数据集,train_labels是对应的标签。SVM参数可以根据实际情况进行调整。 4. 行人检测 在训练好SVM分类器后,可以在测试图像中使用它来检测行人。可以使用OpenCV提供的detectMultiScale函数来实现检测。 代码示例: ``` import cv2 # 加载测试图像 test_image = cv2.imread('test_image.png') # 创建HOG描述符对象 hog = cv2.HOGDescriptor() # 设置SVM分类器 hog.setSVMDetector(svm.getSupportVectors()) # 行人检测 rects, weights = hog.detectMultiScale(test_image, winStride=(8, 8)) # 绘制检测结果 for (x, y, w, h) in rects: cv2.rectangle(test_image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 显示检测结果 cv2.imshow('result', test_image) cv2.waitKey(0) ``` 其中,test_image是要检测的测试图像。通过设置SVM分类器,可以使用HOG描述符对象的detectMultiScale函数来检测行人。检测结果是一组矩形框,可以使用OpenCV提供的rectangle函数来绘制。最后使用imshow函数显示检测结果。 总结: Python OpenCV HOG SVM 行人检测是一种简单有效的行人检测方法。通过收集数据集,提取HOG特征,训练SVM分类器,可以实现高效的行人检测。可以应用于视频监控、自动驾驶等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值