手势识别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录:OpenCV学习笔记
最近也在玩手势识别,资料找了很多,基本可以分为静态手势识别和动态手势识别,先弄个简单的静态手势识别给大家看看。
基本流程如下:
先滤波去噪-->转换到HSV空间-->根据皮肤在HSV空间的分布做出阈值判断,这里用到了inRange函数,然后进行一下形态学的操作,去除噪声干扰,是手的边界更加清晰平滑-->得到的2值图像后用findContours找出手的轮廓,去除伪轮廓后,再用convexHull函数得到凸包络。
结果如下:
源代码:
控制台版本main.cpp:
1.
2.// #include "stdafx.h"
3.//#include "cv.h"
4.
5.#include
6.#include
7.
8.//#include
9.//#include
10.
11.#include
12.
ing namespace std;
14.
15.int pmsf_value = 5;//均值飘逸分割平滑系数
16.int MopEx_value = 2;//开运算
17.int Hmatch_value = 25;//模板匹配系数
18.
19.//亮度
20.int V_low = 30;
21.int V_high = 250;
22.//饱和度
23.int S_low = 10;
24.int S_high = 170;
25.//色相
26.int H_low_max = 40;
27.int H_high_min = 100;
28.int if_high_light = 1; //是否高光补偿
29.
30.IplImage *src = 0;
31.IplImage *srcResize = 0;
32.
33.IplImage *img_YCrCb = 0;
34.CvSize newSize;
35.CvSize sz;
36.
37.IplImage *tmp1;
38.IplImage *tmp2;
39.IplImage *tmp3;
40.IplImage *src2;
41.IplImage *src1;
42.
43.///////////////////////////////////////////////////////////////////////
/////////////////////////////////////////
44.IplImage *YCrCb;
45.IplImage *YCrCb_mask;
46.IplImage *Y_channel,*Cr_channel, *Cb_channel;
47.IplImage *Y_cmp,*Cr_cmp, *Cb_cmp;
48.
49.CvScalar Y_lower;
50.CvScalar Y_upper;
51.
52.CvScalar Cr_lower;
53.CvScalar Cr_upper;
54.
55.CvScalar Cb_lower;
56.CvScalar Cb_upper;
57.
58.CvScalar YCrCb_lower;
59.CvScalar YCrCb_upper;
60.
61.///////////////////////////////////////////////////////////////////////
////////////////////////////////////////
62.
63.void init_hand_YCrCb()
64.{
65. //
66. img_YCrCb = cvCreateImage( sz, 8, 3);
67. YCrCb_mask = cvCreateImage(sz,IPL_DEPTH_8U,1);;
68.
69. //最终的图片
70. YCrCb = cvCreateImage(sz,IPL_DEPTH_8U,3);
71.
72.
73. //三通道
74. Y_channel = cvCreateImage(sz,IPL_DEPTH_8U,1);
75. Cr_channel = cvCreateImage(sz,IPL_DEPTH_8U,1);
76. Cb_channel = cvCreateImage(sz,IPL_DEPTH_8U,1);
77.
78. //按范围截取后
79. Y_cmp = cvCreateImage(sz,IPL_DEPTH_8U,1);
80. Cr_cmp = cvCreateImage(sz,IPL_DEPTH_8U,1);
81. Cb_cmp = cvCreateImage(sz,IPL_DEPTH_8U,1);
82.
83. //Y,Cr,Cb的颜色范围
84. Y_lower = CV_RGB(0,0,130);
85. Y_upper = CV_RGB(0,0,130);
86.
87. Cr_lower = CV_RGB(0,0,125);
88. Cr_upper = CV_RGB(0,0,125);
89.
90. Cb_lower = CV_RGB(0,0,132);
91. Cb_upper = CV_RGB(0,0,147);
92.
93. YCrCb_lower = cvScalar(0,0,132,0);
94. YCrCb_upper = cvScalar(130,125,147,0);
95.}
96.///////////////////////////////////////////////////////////////////////
/////////////////////////////////////////
97.void hand_YCrCb()
98.{
99. //转换到YCrBr
100. cvCvtColor(src2,img_YCrCb, CV_RGB2YCrCb);
101.
102.
103. //分割到Y,Cr,Cb
104. cvSplit(img_YCrCb,Y_channel,Cr_channel,Cb_channel,0);
105.
106. //将Y_channel的位于 Y_lower 和 Y_upper 之间的元素复制到 Y_tmp中107. cvInRangeS( Y_channel, Y_lower, Y_upper, Y_cmp);