- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在处理数字信号时遇到问题。我正在尝试检测指尖,类似于此处提供的解决方案:Hand and finger detection using JavaCV .
但是,我没有使用 JavaCV,而是使用 OpenCV for android,这略有不同。我已经完成了教程中介绍的所有步骤,但过滤了凸包和凸缺陷。这就是我的图像的样子:
这是另一种分辨率的图像:
如您所见,有很多黄点(凸包)和很多红点(凸包)。有时2个黄点之间没有红点,这很奇怪(凸包是如何计算的?)
我需要像之前提供的链接一样创建类似的过滤功能,但使用 OpenCV 的数据结构。
凸包是 MatOfInt 的类型 ...凸缺陷是 MatOfInt4 的类型 ...
我还创建了一些额外的数据结构,因为愚蠢的 OpenCV 以不同的方法使用包含相同数据的不同类型的数据...
convexHullMatOfInt = new MatOfInt();
convexHullPointArrayList = new ArrayList<Point>();
convexHullMatOfPoint = new MatOfPoint();
convexHullMatOfPointArrayList = new ArrayList<MatOfPoint>();
这是我到目前为止所做的,但效果不佳。问题可能在于以错误的方式转换数据:
创建凸包和凸缺陷:
public void calculateConvexHulls()
{
convexHullMatOfInt = new MatOfInt();
convexHullPointArrayList = new ArrayList<Point>();
convexHullMatOfPoint = new MatOfPoint();
convexHullMatOfPointArrayList = new ArrayList<MatOfPoint>();
try {
//Calculate convex hulls
if(aproximatedContours.size() > 0)
{
Imgproc.convexHull( aproximatedContours.get(0), convexHullMatOfInt, false);
for(int j=0; j < convexHullMatOfInt.toList().size(); j++)
convexHullPointArrayList.add(aproximatedContours.get(0).toList().get(convexHullMatOfInt.toList().get(j)));
convexHullMatOfPoint.fromList(convexHullPointArrayList);
convexHullMatOfPointArrayList.add(convexHullMatOfPoint);
}
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e("Calculate convex hulls failed.", "Details below");
e.printStackTrace();
}
}
public void calculateConvexityDefects()
{
mConvexityDefectsMatOfInt4 = new MatOfInt4();
try {
Imgproc.convexityDefects(aproximatedContours.get(0), convexHullMatOfInt, mConvexityDefectsMatOfInt4);
if(!mConvexityDefectsMatOfInt4.empty())
{
mConvexityDefectsIntArrayList = new int[mConvexityDefectsMatOfInt4.toArray().length];
mConvexityDefectsIntArrayList = mConvexityDefectsMatOfInt4.toArray();
}
} catch (Exception e) {
Log.e("Calculate convex hulls failed.", "Details below");
e.printStackTrace();
}
}
过滤:
public void filterCalculatedPoints()
{
ArrayList<Point> tipPts = new ArrayList<Point>();
ArrayList<Point> foldPts = new ArrayList<Point>();
ArrayList<Integer> depths = new ArrayList<Integer>();
fingerTips = new ArrayList<Point>();
for (int i = 0; i < mConvexityDefectsIntArrayList.length/4; i++)
{
tipPts.add(contours.get(0).toList().get(mConvexityDefectsIntArrayList[4*i]));
tipPts.add(contours.get(0).toList().get(mConvexityDefectsIntArrayList[4*i+1]));
foldPts.add(contours.get(0).toList().get(mConvexityDefectsIntArrayList[4*i+2]));
depths.add(mConvexityDefectsIntArrayList[4*i+3]);
}
int numPoints = foldPts.size();
for (int i=0; i < numPoints; i++) {
if ((depths.get(i).intValue()) < MIN_FINGER_DEPTH)
continue;
// look at fold points on either side of a tip
int pdx = (i == 0) ? (numPoints-1) : (i - 1);
int sdx = (i == numPoints-1) ? 0 : (i + 1);
int angle = angleBetween(tipPts.get(i), foldPts.get(pdx), foldPts.get(sdx));
if (angle >= MAX_FINGER_ANGLE) // angle between finger and folds too wide
continue;
// this point is probably a fingertip, so add to list
fingerTips.add(tipPts.get(i));
}
}
结果(白点-过滤后的指尖):
你能帮我写一个合适的过滤函数吗?
2013 年 8 月 14 日更新
我使用标准的 openCV 函数进行轮廓逼近。我必须随着分辨率的变化和手到相机的距离来改变近似值,这很难做到。如果分辨率较小,则手指包含的像素较少,因此近似值应该是情人。距离也一样。保持高将导致完全失去手指。所以我认为近似不是解决问题的好方法,但是小值可能有助于加快计算速度:
Imgproc.approxPolyDP(frame, frame, 2 , true);
如果我使用高值,那么结果就像下图一样,只有在距离和分辨率不变的情况下才会好。 另外,我很惊讶船体点和缺陷点的默认方法没有有用的参数来传递(最小角度、距离等)......
下图展示了我希望始终实现的效果,与分辨率或手到相机的距离无关。我也不想在合上手掌的时候看到任何黄点...
总结一下,我想知道:
最佳答案
低分辨率的凸包可用于识别整个手的位置,它对手指没有用,但确实提供了感兴趣的区域和适当的比例。
然后应该将更高分辨率的分析应用于您的近似轮廓,很容易跳过最后两个不通过“长度和角度”标准的任何点,尽管您可能希望“平均”而不是“完全跳过”。
您的代码示例是计算凸面缺陷然后将其删除的单程..这是一个逻辑错误..您需要随时删除点.. (a) 一次完成所有事情会更快更简单-pass (b) 它避免了在第一次通过时删除点并在以后添加它们,因为任何删除都会改变以前的计算。
这项基本技术非常简单,因此适用于基本张开手掌。但它本质上并不理解手或手势,因此调整比例、角度和长度参数只会让你“走这么远”。
技术引用:过滤器长度和角度“凸面缺陷”斯门安德森博客 http://simena86.github.io/blog/2013/08/12/hand-tracking-and-recognition-with-opencv/
基于 Kinect SDK 的 C# 库,添加了手指方向检测 http://candescentnui.codeplex.com/ http://blog.candescent.ch/2011/11/improving-finger-detection.html
“ self 生长和有组织的神经气体”(SGONG)Nikos Papamarkos 教授 http://www.papamarkos.gr/uploaded-files/Hand%20gesture%20recognition%20using%20a%20neural%20network%20shape%20fitting%20technique.pdf
商业产品“Leap Motion”的创始人 David Holz 和 Michael Buckwald http://www.engadget.com/2013/03/11/leap-motion-michael-buckwald-interview/
关于java - 计算机视觉 - 使用 OpenCV 过滤凸包和凸面缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18143077/
通过终端,您可以使用命令 - “SetFile -a B 文件名” 以编程方式,我认为我应该通过[[NSFileManager defaultManager] createDirectoryAtPat
嗨,正在尝试书中的一些示例:Practical Graph mining with R对于子图挖掘: library(subgraphMining) library(igraph) graph1 =
代码中的相同问题: class Foo { int getIntProperty () { ... } CustomObject getObjectProperty () { ... }
所以这可能是一个愚蠢的问题,但它已经困扰我一段时间了。 使用 React,我创建了两个组件(Buttons.js 和 Message.js),每个组件都有一个导出。但是,现在我希望将这两个组件用作 n
从今天早上开始,我发现我无法再从某个范围安装任何 NPM 包(或任何具有依赖项的包)。例如,如果我输入 npm i webpack 我会收到以下错误... npm ERR! code E401 npm
我在这里搜索过,Angular 2, @ngtools/webpack, AOT ,但对我不起作用。我运行了 npm install 命令。我正在做的是创建一个新的 Angular 2 项目。当我运行
情况: 我有一个 Swift 包,将其命名为 lib。 lib 位于其自己的存储库中。在lib的仓库中,有一堆本地包;也就是说,这些包是在 lib 中定义的,使用本地路径依赖格式 .package(p
我想在工作中学习和使用nodejs,但是在使用 de npm 命令安装模块/包时遇到网络问题。我是否可以使用我的家用计算机构建完整的 Node js 包,然后将其安装在另一台计算机(我的工作场所计算机
我需要将一些 .tar.bz2 格式的非 Python 包转换为 Anaconda/miniConda .egg 文件并安装它们。为此,我需要一个适用于 Windows 的 bld.bat 文件。互联
我需要共享库文件 libthrift-0.9.3.so 作为其他包的依赖项。我在构建 thrift-0.9.3 包时看到编译问题(我确实从 https://thrift.apache.org/down
我尝试在 R 版本 3.5.0 中安装“arcgisbinding”包。但是我失败了,得到以下错误和警告。 Installing package into ‘C:/Users/Lenovo/Docum
我尝试在 R 版本 3.5.0 中安装“arcgisbinding”包。但是我失败了,得到以下错误和警告。 Installing package into ‘C:/Users/Lenovo/Docum
我试图在 flutter 中测试这个应用程序,但我无法运行该应用程序,因为出现此错误“名称‘Page’在库‘package:burn_off/widgets/page.dart’和‘package’中
试图理解和学习如何编写包...用我一直使用的东西进行测试,记录... 您能帮我理解为什么“日志”变量不起作用...并且屏幕上没有日志记录吗? 谢谢! 主要文件: #!/opt/local/bin/py
我尝试运行此使用 Google 云的代码。 import signal import sys from google.cloud import language, exceptions # creat
我想知道是否有人找到了一个很好的 R 包来分析眼动追踪数据? 我遇到了 eyetrackR,但据我所知,没有可用的英文支持文档: http://read.psych.uni-potsdam.de/pm
我正在 R 上制作一个包。我有两个函数共享一个变量(全局)。 如何将其导入到包中? 例如, m<-0 f<-function() { m <- m+1 } g<-function() { m <- m
我用 C 为 Lua 编写了很多模块。每个模块都包含一个 Lua 用户数据类型,我像这样加载和使用它们: A = require("A") B = require("B") a = A.new(3,{
我正在尝试在 R 中的 Ubuntu 上安装 xlsx 包,以便使用允许在 R 中插入链接然后将它们导出到 Excel 的功能。 话虽如此,我根本无法安装该软件包。 显然它必须与 rJava 一起使用
我想在 Haskell 中做一些蒙特卡洛分析。我希望能够编写这样的代码: do n <- poisson lambda xs <- replicateM n $ normal mu sigma
我是一名优秀的程序员,十分优秀!