Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于surf描述符的静态手势识别&x2B;法兰匹配器_C++_Opencv - Fatal编程技术网

C++ 基于surf描述符的静态手势识别&x2B;法兰匹配器

C++ 基于surf描述符的静态手势识别&x2B;法兰匹配器,c++,opencv,C++,Opencv,我正在尝试只对6个手势进行静态手势识别。因为手可能会转动一点,所以我尝试了surf+flann,因为它们是不变的。 这些图像是二进制的,当我比较它们时,我得到了不好的结果,我甚至不理解它们。例如,对于相等的图像,我得到1或2个好的关键点;对于不同的图像,我得到5或6个好的关键点 对于这种情况,您有什么建议来实现手势识别吗 列车和查询图像的结果: 双最大距离=0,最小距离=100; matcher.match(GestodeScript、T1Descriptor、matches); 对于(int

我正在尝试只对6个手势进行静态手势识别。因为手可能会转动一点,所以我尝试了surf+flann,因为它们是不变的。 这些图像是二进制的,当我比较它们时,我得到了不好的结果,我甚至不理解它们。例如,对于相等的图像,我得到1或2个好的关键点;对于不同的图像,我得到5或6个好的关键点

对于这种情况,您有什么建议来实现手势识别吗

列车和查询图像的结果:

双最大距离=0,最小距离=100;
matcher.match(GestodeScript、T1Descriptor、matches);

对于(int i=0;i我没有广泛地使用SURF进行特征提取,但从我收集的信息来看,重要的是图像要合理地“表达”,因为存在具有独特属性的各种兴趣点。我认为你的主要问题是手的图像(特别是经过阈值处理以生成二值图像的图像)没有很多独特的兴趣点。特别是由于冲浪特征的比例和旋转不变性,您的图像中几乎没有特定手势的独特性

您可能想尝试使用二进制图像作为遮罩来移除背景,然后在全彩色(或灰度)手势上尝试SURF和FLANN逻辑


从长远来看,如果你真的想建立一个高质量的手势识别系统,我认为你最好还是研究卷积神经网络。CNN需要的图像预处理要少得多,特别适合这种应用。

我没有广泛地使用SURF进行特征提取,但是m据我所知,重要的是图像要合理地“表达”,因为有各种具有独特属性的兴趣点。我认为你的主要问题是手的图像(特别是经过阈值处理以产生二值图像的图像)不要有太多独特的兴趣点。尤其是由于冲浪特征的比例和旋转不变性,在你的图像中几乎没有什么特定手势的独特性

您可能想尝试使用二进制图像作为遮罩来移除背景,然后在全彩色(或灰度)手势上尝试SURF和FLANN逻辑

从长远来看,如果你真的想建立一个高质量的手势识别系统,我认为你最好研究卷积神经网络。CNN对图像的预处理要少得多,特别适合这种应用。

看看看
double max_dist = 0, min_dist = 100; 

matcher.match(gestoDescriptors,t1descriptors,matches);

for (int i=0; i<gestoDescriptors.rows; i++){
  double dist =  matches[i].distance;
  if (dist<min_dist)
    min_dist = dist;
  if (dist>max_dist)
    max_dist=dist;
}

vector<DMatch>t1_good_matches;
for (int i=0; i<gestoDescriptors.rows; i++){
  if (matches[i].distance<=max(2*min_dist,0.02)){
    t1_good_matches.push_back(matches[i]);
  }
}

//-- Draw only "good" matches
Mat img_matches;
drawMatches(gestoImage,gestoKeypoints,train1,t1keypoints,t1_good_matches,
img_matches, Scalar::all(-1), Scalar::all(-1),
           vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );