基于OpenCv的简单手势识别(课程设计) 您所在的位置:网站首页 课程设计模板图片 基于OpenCv的简单手势识别(课程设计)

基于OpenCv的简单手势识别(课程设计)

2024-06-27 04:23| 来源: 网络整理| 查看: 265

基于OpenCv视觉库实现识别手势1-5,IDE采用的是Visual Studio 2015。图像可实现动态采集,通过修改代码可以调用移动设备的摄像头。原理是提前把手势1-5的图像存放在工程文件中,再把实时采集到的手势图像与之对比,利用Hu不变矩这一几何特征得出相似度最高的图像。

环境配置:Visual Studio 2015+OpenCV-3.1.0

代码和思路主要参考了这位作者(https://blog.csdn.net/luoyouren/article/details/65633170) 本人在此之上为代码添加了更完整易懂的注释,以及提供了提高识别率的建议,详细的软件安装及环境配置不细说了,直接上代码和实现效果

**

代码

**

/*此程序对背景有要求,背景色最好是纯色并且容易与手的颜色区分开,否则识别效果很差,建议用白色背景,需离摄像头30-50cm * 摄像头读取--> * HSV颜色空间转换--> * HSV通道分离--> * 中值滤波--> * 肤色分割--> * 形态学运算--> * 轮廓检测及过滤--> * 轮廓形状匹配 */ /*--------https://blog.csdn.net/luoyouren/article/details/65633170--------*/ #include #include #include using namespace cv; using namespace std; #define MAXVALUE (80) #define KERNEL_SIZE (5) #define TEMPLATE_NUMS (5) //括号内为模板图片个数 int minVal = 3, maxVal = 20;//白天建议3 14 int match_number = -1; Mat frame; //原始图像帧,//Mat可以理解为一个存储数据的容器,关于Mat类的详解和用法,https://blog.csdn.net/guyuealian/article/details/70159660 vector channels; //HSV通道分离 Mat frameH; //H通道 Mat result; //最终结果 Mat resultRGB; //将结果显示在原图 vector< vector > mContoursTemp; //轮廓模板集,vector容器里面放了一个vector容器,子容器里放点 vector< vector > mContoursProc; //待处理轮廓集 //函数声明 void trackBarMin(int pos, void* userdata) {} //分割H通道时的最小值 void trackBarMax(int pos, void* userdata) {} //分割H通道时的最大值 void init_hand_template(void); //载入模板的轮廓 void hand_contours(Mat &srcImage); // 对肤色分割、滤波去噪、开运算后图像进行轮廓提取并过滤 void hand_template_match(void); // 将目标轮廓与模板轮廓进行匹配 void number_draw(Mat &img, int num); // 在图片的左上角标注数字 void setMatInt(Mat & input_image, uchar val); // 将Mat中的每个元素设置为某个数值 char *tmp_names[TEMPLATE_NUMS] = { "1.bmp", "2.bmp","3.bmp","4.bmp","5.bmp" }; // , "6.bmp", "7.bmp", "8.bmp", "9.bmp", "10.bmp"}; const char *num_char[] = { "1", "2", "3","4", "5" }; // ,"6", "7", "8", "9", "10" };//在图片的左上角标注数字 /***********************************************************主函数******************************************************/ int main() { // 载入模板的轮廓 init_hand_template(); //----------------------------肤色分割调参窗口---------------------// namedWindow("TrackBar", CV_WINDOW_AUTOSIZE); createTrackbar("minVal", "TrackBar", &minVal, MAXVALUE, trackBarMin); createTrackbar("maxVal", "TrackBar", &maxVal, MAXVALUE, trackBarMax); //----------------------------摄像头读取----------------------------// VideoCapture capture; capture.open(0);//括号里是0则调用电脑摄像头,若是"http://admin:[email protected]:8081"则调用IP摄像头,如果是"Video 3.wmv"则调用视频文件 if (false == capture.isOpened()) { cout frame; if (true == frame.empty()) { cout mHierarchy; for (int i = 0; i < TEMPLATE_NUMS; i++) { srcImage = imread(tmp_names[i], IMREAD_GRAYSCALE);//读取文件 //imshow("srcimage ", srcImage); if (true == srcImage.empty()) { cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有