手势识别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档