精华内容
下载资源
问答
  • C ++和OpenCV手掌检测和手指计数使用C++ opevCV 手势识别
    2020-05-20 15:31:38

    先看效果图
    在这里插入图片描述

    源代码:
    https://download.csdn.net/download/weixin_39276851/82863713

    更多相关内容
  • opencv 手势识别

    2014-01-14 12:09:21
    opencv 手势识别 可以在 ubantu 下面直接运行
  • OpenCV C++ 手势识别

    千次阅读 多人点赞 2021-09-11 13:01:13
    OpenCV为我们提供了不同的背景减法模型,codebook 它的作用是对某些帧进行一段时间的精确校准。其中对于它获取的所有图像;它计算每个像素的平均值和偏差,并相应地指定框。 在前景中它就像一个黑白图像,只有手是...

    请添加图片描述

    源码在下面

    使用 RGB 值分割手部区域,即手部的 GB 值将与背景不同
    或者使用边缘检测
    或者
    背景减法。

     我这里使用了背景减法模型。OpenCV为我们提供了不同的背景减法模型,codebook   它的作用是对某些帧进行一段时间的精确校准。其中对于它获取的所有图像;它计算每个像素的平均值和偏差,并相应地指定框。
    

    在前景中它就像一个黑白图像,只有手是白色的
    在这里插入图片描述

    用 Convex Hull 来找到指尖。Convex hull 基本上是包围手部区域的凸集。
    在这里插入图片描述
    包围手的红线是凸包。基本上它是一个凸起;如果我们在红色区域内取任意两点并将它们连接起来形成一条线,那么这条线就完全位于集合内。
    在这里插入图片描述黄点是缺陷点,会有很多这样的缺陷点,即每个谷都有一个缺陷点。现在根据缺陷点的数量,我们可以计算展开的手指数量。

    大概就是
    手部区域提取是使用背景减法完成的。
    对于尖端点,深度点凸度缺陷。
    提取轮廓和检测凸点的主要代码在函数中
    无效检测(IplImage* img_8uc1,IplImage* img_8uc3);

    将相机放在稳定的背景前;运行代码,等待一段时间。校准完成后。你会看到显示一些干扰的连接组件图像。把你的手放在相机视图中。

    没什么好说的直接看代码会比较容易理解
    核心代码

    int main(int argc, char** argv)
    {
        const char* filename = 0;
        IplImage* rawImage = 0, *yuvImage = 0; 
        IplImage *ImaskCodeBook = 0,*ImaskCodeBookCC = 0;
        CvCapture* capture = 0;
    
        int c, n, nframes = 0;
        int nframesToLearnBG = 300;
    
        model = cvCreateBGCodeBookModel();
        
       
        model->modMin[0] = 3;
        model->modMin[1] = model->modMin[2] = 3;
        model->modMax[0] = 10;
        model->modMax[1] = model->modMax[2] = 10;
        model->cbBounds[0] = model->cbBounds[1] = model->cbBounds[2] = 10;
    
        bool pause = false;
        bool singlestep = false;
    
        for( n = 1; n < argc; n++ )
        {
            static const char* nframesOpt = "--nframes=";
            if( strncmp(argv[n], nframesOpt, strlen(nframesOpt))==0 )
            {
                if( sscanf(argv[n] + strlen(nframesOpt), "%d", &nframesToLearnBG) == 0 )
                {
                    help();
                    return -1;
                }
            }
            else
                filename = argv[n];
        }
    
        if( !filename )
        {
            printf("Capture from camera\n");
            capture = cvCaptureFromCAM( 0 );
        }
        else
        {
            printf("Capture from file %s\n",filename);
            capture = cvCreateFileCapture( filename );
        }
    
        if( !capture )
        {
            printf( "Can not initialize video capturing\n\n" );
            help();
            return -1;
        }
    
       
        for(;;)
        {
            if( !pause )
            {
                rawImage = cvQueryFrame( capture );
                ++nframes;
                if(!rawImage) 
                    break;
            }
            if( singlestep )
                pause = true;
            
           
            if( nframes == 1 && rawImage )
            {
                // CODEBOOK METHOD ALLOCATION
                yuvImage = cvCloneImage(rawImage);
                ImaskCodeBook = cvCreateImage( cvGetSize(rawImage), IPL_DEPTH_8U, 1 );
                ImaskCodeBookCC = cvCreateImage( cvGetSize(rawImage), IPL_DEPTH_8U, 1 );
                cvSet(ImaskCodeBook,cvScalar(255));
                
                cvNamedWindow( "Raw", 1 );
                cvNamedWindow( "ForegroundCodeBook",1);
                cvNamedWindow( "CodeBook_ConnectComp",1);
            }
    
         
            if( rawImage )
            {
                cvCvtColor( rawImage, yuvImage, CV_BGR2YCrCb );
            
                if( !pause && nframes-1 < nframesToLearnBG  )
                    cvBGCodeBookUpdate( model, yuvImage );
    
                if( nframes-1 == nframesToLearnBG  )
                    cvBGCodeBookClearStale( model, model->t/2 );
                
               
                if( nframes-1 >= nframesToLearnBG  )
                {
                  
                    cvBGCodeBookDiff( model, yuvImage, ImaskCodeBook );
                   centers if desired
                    cvCopy(ImaskCodeBook,ImaskCodeBookCC);	
                    cvSegmentFGMask( ImaskCodeBookCC );
                
                    cvShowImage( "CodeBook_ConnectComp",ImaskCodeBookCC);
                    detect(ImaskCodeBookCC,rawImage);
                    
                }
               
                cvShowImage( "Raw", rawImage );
                cvShowImage( "ForegroundCodeBook",ImaskCodeBook);
                
            }
    
        
            c = cvWaitKey(10)&0xFF;
            c = tolower(c);
           
            if(c == 27 || c == 'q')
                break;
     
            switch( c )
            {
            case 'h':
                help();
                break;
            case 'p':
                pause = !pause;
                break;
            case 's':
                singlestep = !singlestep;
                pause = false;
                break;
            case 'r':
                pause = false;
                singlestep = false;
                break;
            case ' ':
                cvBGCodeBookClearStale( model, 0 );
                nframes = 0;
                break;
        
            case 'y': case '0':
            case 'u': case '1':
            case 'v': case '2':
            case 'a': case '3':
            case 'b': 
                ch[0] = c == 'y' || c == '0' || c == 'a' || c == '3';
                ch[1] = c == 'u' || c == '1' || c == 'a' || c == '3' || c == 'b';
                ch[2] = c == 'v' || c == '2' || c == 'a' || c == '3' || c == 'b';
                printf("CodeBook YUV Channels active: %d, %d, %d\n", ch[0], ch[1], ch[2] );
                break;
            case 'i': 
            case 'o': 
            case 'k': 
            case 'l': 
                {
                uchar* ptr = c == 'i' || c == 'o' ? model->modMax : model->modMin;
                for(n=0; n<NCHANNELS; n++)
                {
                    if( ch[n] )
                    {
                        int v = ptr[n] + (c == 'i' || c == 'l' ? 1 : -1);
                        ptr[n] = CV_CAST_8U(v);
                    }
                    printf("%d,", ptr[n]);
                }
                printf(" CodeBook %s Side\n", c == 'i' || c == 'o' ? "High" : "Low" );
                }
                break;
            }
        }		
        
        cvReleaseCapture( &capture );
        cvDestroyWindow( "Raw" );
        cvDestroyWindow( "ForegroundCodeBook");
        cvDestroyWindow( "CodeBook_ConnectComp");
        return 0;
    }
    
    

    要直接跑代码调试的
    可以直接去下载
    https://download.csdn.net/download/weixin_39276851/22683893?spm=1001.2014.3001.5503

    展开全文
  • 基于Opencv手势识别

    2018-04-27 16:30:38
    基于Opencv凸包检测的手势识别,使用训练好的XML文件,可以识别0,1,2,3,4,5,6,8等手势。
  • OpenCV C++案例实战二十二《手势识别》前言一、手部关键点检测1.1 功能源码1.2 功能效果二、手势识别2.1算法原理2.2功能源码三、结果显示3.1功能源码3.2效果显示四、源码总结 前言 本文将使用OpenCV C++ 实现手势...


    前言

    本文将使用OpenCV C++ 实现手势识别效果。本案例主要可以分为以下几个步骤:
    1、手部关键点检测
    2、手势识别
    3、效果显示
    接下来就来看看本案例具体是怎么实现的吧!!!

    一、手部关键点检测

    如图所示,为我们的手部关键点所在位置。第一步,我们需要检测手部21个关键点。我们使用深度神经网络DNN模块来完成这件事。通过使用DNN模块可以检测出手部21个关键点作为结果输出,具体请看源码。
    请添加图片描述

    1.1 功能源码

    //手部关键点检测
    bool HandKeypoints_Detect(Mat src, vector<Point>&HandKeypoints)
    {
    	//模型尺寸大小
    	int width = src.cols;
    	int height = src.rows;
    	float ratio = width / (float)height;
    	int modelHeight = 368;  //由模型输入维度决定
    	int modelWidth = int(ratio*modelHeight);
    
    	//模型文件
    	string model_file = "pose_deploy.prototxt";  //网络模型
    	string model_weight = "pose_iter_102000.caffemodel";//网络训练权重
    
    	//加载caffe模型
    	Net net = readNetFromCaffe(model_file, model_weight);
    
    	//将输入图像转成blob形式
    	Mat blob = blobFromImage(src, 1.0 / 255, Size(modelWidth, modelHeight), Scalar(0, 0, 0));
    
    	//将图像转换的blob数据输入到网络的第一层“image”层,见deploy.protxt文件
    	net.setInput(blob, "image");
    
    	//结果输出
    	Mat output = net.forward();
    	int H = output.size[2];
    	int W = output.size[3];
    
    	for (int i = 0; i < nPoints; i++)
    	{
    		//结果预测
    		Mat probMap(H, W, CV_32F, output.ptr(0, i)); 
    
    		resize(probMap, probMap, Size(width, height));
    
    		Point keypoint; //最大可能性手部关键点位置
    		double classProb;  //最大可能性概率值
    		minMaxLoc(probMap, NULL, &classProb, NULL, &keypoint);
    
    		HandKeypoints[i] = keypoint; //结果输出,即手部关键点所在坐标
    	}
    
    	return true;
    }
    

    1.2 功能效果

    请添加图片描述
    如图所示,我们已经通过DNN检测出21个手部关键点所在位置。接下来,我们需要使用这些关键点进行简单的手势识别。

    二、手势识别

    2.1算法原理

    本案例实现手势识别是通过比较关键点位置确定的。首先拿出每个手指尖关键点索引(即4、8、12、16、20)。接下来,对比每个手指其它关键点与其指尖所在位置。
    例如我们想确定大拇指现在的状态是张开的还是闭合的。如下图所示,由于OpenCV是以左上角为起点建立坐标系的。当大拇指处于张开状态时(掌心向内),我们可以发现,对比关键点4、关键点3所在位置。当4的x坐标大于3的x坐标时,拇指处于张开状态;当4的x坐标小于3的x坐标时,拇指处于闭合状态。
    同理,其余四个手指,以食指为例。当关键点8的y坐标小于关键点6的y坐标时,此时食指处于张开状态;当关键点8的y坐标大于关键点6的y坐标时,此时食指处于闭合状态。
    当手指处于张开状态时,我们计数1。通过统计手指的张开数达到手势识别的目的。具体请看源码。
    请添加图片描述

    2.2功能源码

    //手势识别
    bool Handpose_Recognition(vector<Point>&HandKeypoints, int& count)
    {
    	vector<int>fingers;
    	//拇指
    	if (HandKeypoints[tipIds[0]].x > HandKeypoints[tipIds[0] - 1].x)
    	{	 
    		//如果关键点'4'的x坐标大于关键点'3'的x坐标,则说明大拇指是张开的。计数1
    		fingers.push_back(1);
    	}
    	else
    	{
    		fingers.push_back(0);
    	}
    	//其余的4个手指
    	for (int i = 1; i < 5; i++)
    	{
    		if (HandKeypoints[tipIds[i]].y < HandKeypoints[tipIds[i] - 2].y)
    		{
    			//例:如果关键点'8'的y坐标小于关键点'6'的y坐标,则说明食指是张开的。计数1
    			fingers.push_back(1);
    		}
    		else
    		{
    			fingers.push_back(0);
    		}
    	}
    
    	//结果统计
    	for (int i = 0; i < fingers.size(); i++)
    	{
    		if (fingers[i] == 1)
    		{
    			count++;
    		}
    	}
    
    	return true;
    }
    

    三、结果显示

    通过以上步骤,我们已经有了手部关键点所在坐标位置以及对应的手势结果,接下来就进行效果展示。
    在这里,为了逼格高一点,我们将下面的手势模板图像作为输出结果放进我们的测试图中。具体操作请看源码。
    在这里插入图片描述

    3.1功能源码

    //识别效果显示
    bool ShowResult(Mat& src, vector<Point>&HandKeypoints, int& count)
    {
    	//画出关键点所在位置
    	for (int i = 0; i < nPoints; i++)
    	{
    		circle(src, HandKeypoints[i], 3, Scalar(0, 0, 255), -1);
    		putText(src, to_string(i), HandKeypoints[i], FONT_HERSHEY_COMPLEX, 0.8, Scalar(0, 255, 0), 2);
    	}
    
    	//为了显示骚操作,读取模板图片,作为识别结果
    	vector<string>imageList;
    	string filename = "images/";
    	glob(filename, imageList);
    
    	vector<Mat>Temp;
    	for (int i = 0; i < imageList.size(); i++)
    	{
    		Mat temp = imread(imageList[i]);
    		
    		resize(temp, temp, Size(100, 100), 1, 1, INTER_AREA);
    	
    		Temp.push_back(temp);
    	}
    
    	//将识别结果显示在原图中
    	Temp[count].copyTo(src(Rect(0, src.rows- Temp[count].rows, Temp[count].cols, Temp[count].rows)));
    	putText(src, to_string(count), Point(20, 60), FONT_HERSHEY_COMPLEX, 2, Scalar(0, 0, 128), 3);
    
    	return true;
    }
    

    3.2效果显示

    请添加图片描述

    除此之外,我们还可以将所有的图片整合成一张图,具体请看源码吧。

    //将所有图片整合成一张图片
    bool Stitching_Image(vector<Mat>images)
    {
    	Mat canvas = Mat::zeros(Size(1200, 1000), CV_8UC3);
    	int width = 400;
    	int height = 500;
    
    	for (int i = 0; i < images.size(); i++)
    	{
    		resize(images[i], images[i], Size(width, height), 1, 1, INTER_LINEAR);
    	}
    
    	int col = canvas.cols / width;
    	int row = canvas.rows / height;
    	for (int i = 0; i < row; i++)
    	{
    		for (int j = 0; j < col; j++)
    		{
    			int index = i * col + j;
    			images[index].copyTo(canvas(Rect(j*width, i*height, width, height)));
    		}
    	}
    
    	namedWindow("result", WINDOW_NORMAL);
    	imshow("result", canvas);
    	waitKey(0);
    	return true;
    }
    

    最终结果如图所示。以上就是整个案例的流程啦。。。
    请添加图片描述

    四、源码

    #include<iostream>
    #include<opencv2/opencv.hpp>
    #include<opencv2/dnn.hpp>
    using namespace std;
    using namespace cv;
    using namespace cv::dnn;
    
    //手部关键点数目
    const int nPoints = 21; 
    //手指索引
    const int tipIds[] = { 4,8,12,16,20 };
    
    //手部关键点检测
    bool HandKeypoints_Detect(Mat src, vector<Point>&HandKeypoints)
    {
    	//模型尺寸大小
    	int width = src.cols;
    	int height = src.rows;
    	float ratio = width / (float)height;
    	int modelHeight = 368;  //由模型输入维度决定
    	int modelWidth = int(ratio*modelHeight);
    
    	//模型文件
    	string model_file = "pose_deploy.prototxt";  //网络模型
    	string model_weight = "pose_iter_102000.caffemodel";//网络训练权重
    
    	//加载caffe模型
    	Net net = readNetFromCaffe(model_file, model_weight);
    
    	//将输入图像转成blob形式
    	Mat blob = blobFromImage(src, 1.0 / 255, Size(modelWidth, modelHeight), Scalar(0, 0, 0));
    
    	//将图像转换的blob数据输入到网络的第一层“image”层,见deploy.protxt文件
    	net.setInput(blob, "image");
    
    	//结果输出
    	Mat output = net.forward();
    	int H = output.size[2];
    	int W = output.size[3];
    
    	for (int i = 0; i < nPoints; i++)
    	{
    		//结果预测
    		Mat probMap(H, W, CV_32F, output.ptr(0, i)); 
    
    		resize(probMap, probMap, Size(width, height));
    
    		Point keypoint; //最大可能性手部关键点位置
    		double classProb;  //最大可能性概率值
    		minMaxLoc(probMap, NULL, &classProb, NULL, &keypoint);
    
    		HandKeypoints[i] = keypoint; //结果输出,即手部关键点所在坐标
    	}
    
    	return true;
    }
    
    //手势识别
    bool Handpose_Recognition(vector<Point>&HandKeypoints, int& count)
    {
    	vector<int>fingers;
    	//拇指
    	if (HandKeypoints[tipIds[0]].x > HandKeypoints[tipIds[0] - 1].x)
    	{	 
    		//如果关键点'4'的x坐标大于关键点'3'的x坐标,则说明大拇指是张开的。计数1
    		fingers.push_back(1);
    	}
    	else
    	{
    		fingers.push_back(0);
    	}
    	//其余的4个手指
    	for (int i = 1; i < 5; i++)
    	{
    		if (HandKeypoints[tipIds[i]].y < HandKeypoints[tipIds[i] - 2].y)
    		{
    			//例:如果关键点'8'的y坐标小于关键点'6'的y坐标,则说明食指是张开的。计数1
    			fingers.push_back(1);
    		}
    		else
    		{
    			fingers.push_back(0);
    		}
    	}
    
    	//结果统计
    	for (int i = 0; i < fingers.size(); i++)
    	{
    		if (fingers[i] == 1)
    		{
    			count++;
    		}
    	}
    
    	return true;
    }
    
    //识别效果显示
    bool ShowResult(Mat& src, vector<Point>&HandKeypoints, int& count)
    {
    	//画出关键点所在位置
    	for (int i = 0; i < nPoints; i++)
    	{
    		circle(src, HandKeypoints[i], 3, Scalar(0, 0, 255), -1);
    		putText(src, to_string(i), HandKeypoints[i], FONT_HERSHEY_COMPLEX, 0.8, Scalar(0, 255, 0), 2);
    	}
    
    	//为了显示骚操作,读取模板图片,作为识别结果
    	vector<string>imageList;
    	string filename = "images/";
    	glob(filename, imageList);
    
    	vector<Mat>Temp;
    	for (int i = 0; i < imageList.size(); i++)
    	{
    		Mat temp = imread(imageList[i]);
    		
    		resize(temp, temp, Size(100, 100), 1, 1, INTER_AREA);
    	
    		Temp.push_back(temp);
    	}
    
    	//将识别结果显示在原图中
    	Temp[count].copyTo(src(Rect(0, src.rows- Temp[count].rows, Temp[count].cols, Temp[count].rows)));
    	putText(src, to_string(count), Point(20, 60), FONT_HERSHEY_COMPLEX, 2, Scalar(0, 0, 128), 3);
    
    	return true;
    }
    
    //将所有图片整合成一张图片
    bool Stitching_Image(vector<Mat>images)
    {
    	Mat canvas = Mat::zeros(Size(1200, 1000), CV_8UC3);
    	int width = 400;
    	int height = 500;
    
    	for (int i = 0; i < images.size(); i++)
    	{
    		resize(images[i], images[i], Size(width, height), 1, 1, INTER_LINEAR);
    	}
    
    	int col = canvas.cols / width;
    	int row = canvas.rows / height;
    	for (int i = 0; i < row; i++)
    	{
    		for (int j = 0; j < col; j++)
    		{
    			int index = i * col + j;
    			images[index].copyTo(canvas(Rect(j*width, i*height, width, height)));
    		}
    	}
    
    	namedWindow("result", WINDOW_NORMAL);
    	imshow("result", canvas);
    	waitKey(0);
    	return true;
    }
    
    
    int main()
    {
    	vector<string>imageList;
    	string filename = "test/";
    	glob(filename, imageList);
    
    	vector<Mat>images;
    	for (int i = 0; i < imageList.size(); i++)
    	{
    		Mat src = imread(imageList[i]);
    
    		vector<Point>HandKeypoints(nPoints);
    		HandKeypoints_Detect(src, HandKeypoints);
    
    		int count = 0;
    		Handpose_Recognition(HandKeypoints, count);
    
    		ShowResult(src, HandKeypoints, count);
    		images.push_back(src);
    
    		imshow("Demo", src);
    		waitKey(0);
    	}
    
    	Stitching_Image(images);
    
    	system("pause");
    	return 0;
    }
    
    

    总结

    本文使用OpenCV C++实现一些简单的手势识别,在这里仅为了提供一个算法思想,理解了算法思想自己想实现什么功能都会很简单。主要操作有以下几点。
    1、使用DNN模块实现手部关键点检测
    2、利用各关键点所在位置来判定手指的张合状态。
    3、效果显示(仅为了实现效果演示,可以省略)

    展开全文
  • opencv手势识别与匹配

    2015-04-26 19:40:16
    一种基于opencv模式识别的手势识别,能够识别手指个数,
  • opencv实现两种手势识别,拳头和手掌,效果还是可以的
  • opencv 手势识别实例

    2018-07-15 08:37:05
    opencv手势识别实例。c++ 11。支持摄像头和图片两种方式。
  • 基于OpenCV3.0和vs2012软件的手势识别的石头剪刀布的游戏
  • 一个实现石头剪刀布的小程序,基于opencv,在vs2010和opencv2.4.4下可以完美运行,另一个是一个根据手势播放音频的,还有一个提供参考
  • https://blog.csdn.net/weixin_39276851/article/details/106237300
  • 经过两个月左右努力,基于OpenCV3和C++手势识别系统设计完结。 从OpenCV概述及安装配置教程到本篇博客:基于OpenCV3和C++手势识别系统设计(完结),花费了大量精力,下面简单介绍一下本手势识别设计。 目录一、...

    经过两个月左右努力,基于OpenCV3和C++的手势识别系统设计完结。
    OpenCV概述及安装配置教程到本篇博客:基于OpenCV3和C++的手势识别系统设计(完结),花费了大量精力,下面简单介绍一下本手势识别设计。

    一、项目介绍

    本次做的项目主要是利用奥比中光Astra mini摄像头进行手势识别,但是由于Astra mini摄像头存在一些局限性,我选择首先利用电脑自带摄像头进行手势识别,等调试运行成功后,再将其代码移植到Astra mini上。
    奥比中光官网:https://developer.orbbec.com.cn/
    Astra mini:
    在这里插入图片描述
    这里介绍一下为什么使用C++。
    因为Astra mini的OpenNI库目前只支持Visual Studio调用,因此项目使用Visual Studio2017和OpenCV3(也兼容OpenCV4)进行编程设计。

    二、项目流程图

    项目主要流程如下:
    在这里插入图片描述

    三、显示结果

    经过支持向量机训练,验证得其准确率为:98%
    在这里插入图片描述

    显示结果示例:
    1:
    在这里插入图片描述
    3:
    在这里插入图片描述
    5:
    在这里插入图片描述

    四、代码实现

    代码包括两部分,既可以利用电脑自带摄像头进行手势识别,也可以利用Astra mini的OpenNI库进行手势识别,更加方便。
    【注意】:本项目不包含手势跟踪部分,手势跟踪请自行设计。
    由于投入了不少精力和时间,以及走了大量的弯路,因此有需要代码的可以添加Q:912918749联系(有偿)(请备注:手势识别)。

    展开全文
  • opencv手势识别

    2015-06-01 10:56:47
    基于opencv手势识别程序,针对上下左右的方向手势,训练后识别率高于80%
  • 基于OPENCV手势识别技术

    万次阅读 多人点赞 2020-12-11 13:44:04
    基于OPENCV手势识别技术   本篇博客主要介绍基于OPENCV手势识别程序,代码为C++OPENCV版本为OPENCV3会有较为详细的实现流程和源码,并且做到源码尽量简单,注释也自认为较为清晰,希望能帮助到大家。
  • OpenCV手势识别

    万次阅读 2016-08-05 16:08:00
    Description: 手势检测 先滤波去噪 -->转换到HSV空间 -->根据皮肤在HSV空间的分布做出阈值判断,这里用到了inRange函数, 然后进行一下形态学的操作,去除噪声干扰,是手的边界更加清晰平
  • 基于OPENCV手势识别

    2020-12-12 00:15:25
    基于OPENCV手势识别程序,代码为C++OPENCV版本为OPENCV3会有较为详细的实现流程和源码,并且做到源码尽量简单,注释也自认为较为清晰,希望能帮助到大家。
  • 基于OpenCV实现的手势识别,可识别出剪刀石头布.资源中包含实现代码思路,源代码以及效果图.
  • 基于c++opencv的dnn模块的手势识别 先看效果: 老规矩话不多,实现的方法步骤,细节全在我的代码注释里面,只你跟着注释写,相信你也写得出来的! #include <opencv2/dnn.hpp> #include<opencv2/opencv....
  • opencv_traincascade训练分类器,手势识别
  • 基于OpenCV的简易实时手势识别1.基本信息介绍1.1实验步骤1.2效果展示2.肤色检测+二值化+开运算+高斯模糊2.1 flip()函数原型2.2cvtColor()函数原型2.3split()函数原型2.4GaussianBlur()函数原型2.5Code3.连通空心部分...
  • 基于OpenCV手势识别完整项目(Python3.7)

    万次阅读 多人点赞 2019-08-09 08:52:41
    这是我的本科毕设题目,刚开始接触机器学习这方面,感谢CSDN和GitHub上的大佬,...项目简介:基于Win10 + Python3.7的环境,利用Python的OpenCV、Sklearn和PyQt5等库搭建了一个较为完整的手势识别系统,用于识别日...
  • OPENCV手势动作识别-石头剪刀布

    万次阅读 多人点赞 2018-04-22 17:25:41
    作为一个OpenCV初学者,为了锻炼能力,决定自己写个手势识别程序,结果比网上找的程序效果还好一些,所以分享出来~~ 为了得到更好的效果,我利用了背景减法。取摄像头的第一帧为背景,后面所有帧减去第一帧,这样...
  • OpenCV 手势识别实现物体虚拟拖放

    千次阅读 2022-04-13 23:05:50
    本文主要基于 OpenCV 和 MediaPipe 实现虚拟方块的拖放,最终效果如下: OpenCV 实现虚拟方块拖放 主要分为下面几个步骤 利用 opencv 读取摄像头视频 利用 mediaPipe 获取手掌关键点位置 定义拖放手势:主要...
  • 文章目录环境准备资源读取读取图片读取视频资源操作修改图片绘制图形尺寸修改灰度处理图片图片保存使用模型模型训练训练模型加载手势识别opencv版本mediapipe版本HandTrackingModule.pyMain.py 环境准备 编辑器 ...
  • 基于opencv的数字手势识别,平台是基于vs2010开发的,需要配置opencv
  • 基于opencv2.3.1+vs的手势识别代码,主要使到了Opencv的特征训练库和基本的图像处理,包括肤色检测等等。
  • http://www.cnblogs.com/hebaichuanyeah/p/5014519.html
  • 手势识别程序,基于opencv,利用camshift来实现。效果很好,在vs2010和opencv2.4.4上可以完美运行。
  • 使用OpenCVC++开发了一个手势识别模块。检测手的质心以跟踪和识别手势。将模块与计算机连接,形成基本任务。
  • opencv基于计算机视觉的手势识别

    热门讨论 2010-10-16 11:44:07
    基于计算机视觉的手势识别是新一代的人机交互手段,有着重要的理论研究 价值和应用前景。本文对手势图像的预处理、特征提取、手势的跟踪与识别进行 了研究,并在 Microsoft Visual C++ 6.0 环境下编程实现了对从...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,326
精华内容 530
关键字:

opencv手势识别c++

c++ 订阅