- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道是否有人能够在 java 中将 openni 与 opencv 结合使用?例如,您在 IplImage 等中获得深度流……我目前正在尝试这样做,但我不确定从哪里开始。
如果任何完成此操作的人想要分享他们的知识或一些代码,我将不胜感激。
到目前为止我的代码:
/
*
* To change this template, choose Tools | Templates
* and open the template in the editor.
/**
*
* @author olivierjanssens
*/
package kitouch;
import com.googlecode.javacpp.Loader;
import com.googlecode.javacv.*;
import com.googlecode.javacv.cpp.*;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_calib3d.*;
import static com.googlecode.javacv.cpp.opencv_objdetect.*;
import java.nio.ShortBuffer;
import java.awt.*;
import java.awt.image.*;
import org.OpenNI.*;
import javax.swing.JFrame;
public class KiTouch {
private Context context;
private final String SAMPLE_XML_FILE = "/Users/olivierjanssens/Development/Kinect/OpenNI/Samples/Config/SamplesConfig.xml";
private OutArg<ScriptNode> scriptNode;
private DepthGenerator depthGen;
private BufferedImage bimg;
int width, height;
IplImage depthImage;
private float histogram[];
private byte[] imgbytes;
CanvasFrame frame = new CanvasFrame("Some Title");
public KiTouch() {
try {
scriptNode = new OutArg<ScriptNode>();
context = Context.createFromXmlFile(SAMPLE_XML_FILE, scriptNode);
depthGen = DepthGenerator.create(context);
DepthMetaData depthMD = depthGen.getMetaData();
histogram = new float[10000];
width = depthMD.getFullXRes();
height = depthMD.getFullYRes();
imgbytes = new byte[width*height];
DataBufferByte dataBuffer = new DataBufferByte(imgbytes, width*height);
Raster raster = Raster.createPackedRaster(dataBuffer, width, height, 8, null);
bimg = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
bimg.setData(raster);
depthImage = IplImage.create(width, height, IPL_DEPTH_8U, 1);
} catch (GeneralException e) {
e.printStackTrace();
System.exit(1);
}
}
private void calcHist(DepthMetaData depthMD)
{
// reset
for (int i = 0; i < histogram.length; ++i)
histogram[i] = 0;
ShortBuffer depth = depthMD.getData().createShortBuffer();
depth.rewind();
int points = 0;
while(depth.remaining() > 0)
{
short depthVal = depth.get();
if (depthVal != 0)
{
histogram[depthVal]++;
points++;
}
}
for (int i = 1; i < histogram.length; i++)
{
histogram[i] += histogram[i-1];
}
if (points > 0)
{
for (int i = 1; i < histogram.length; i++)
{
histogram[i] = (int)(256 * (1.0f - (histogram[i] / (float)points)));
}
}
}
public Dimension getPreferredSize() {
return new Dimension(width, height);
}
void updateDepth()
{
try {
DepthMetaData depthMD = depthGen.getMetaData();
context.waitAnyUpdateAll();
calcHist(depthMD);
ShortBuffer depth = depthMD.getData().createShortBuffer();
depth.rewind();
while(depth.remaining() > 0)
{
int pos = depth.position();
short pixel = depth.get();
imgbytes[pos] = (byte)histogram[pixel];
}
depthImage.createFrom(bimg);
frame.showImage(depthImage);
} catch (GeneralException e) {
e.printStackTrace();
}
}
}
并调用此代码:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package kitouch;
import org.OpenNI.GeneralException;
/**
*
* @author olivierjanssens
*/
public class kiTouchApp {
public static void main(String s[]) throws GeneralException {
KiTouch kit = new KiTouch();
while(true) {
kit.updateDepth();
}
}
}
虽然我得到一个黑框。所以还不行
当我不像这里那样初始化 IplImage 而只是 IplImage depthImage = new IplImage();我得到这个错误:
Exception in thread "main" java.lang.NullPointerException
at java.awt.image.BufferedImage.<init>(BufferedImage.java:613)
at com.googlecode.javacv.cpp.opencv_core$IplImage.getBufferedImage(opencv_core.java:1005)
at com.googlecode.javacv.cpp.opencv_core$IplImage.getBufferedImage(opencv_core.java:931)
at com.googlecode.javacv.CanvasFrame.showImage(CanvasFrame.java:331)
at kitouch.KiTouch.paint(KiTouch.java:138)
at kitouch.kiTouchApp.main(kiTouchApp.java:21)
提前致谢!
最佳答案
我确实玩过 OpenNI 和 Java,但使用的是 Processing以及可用的包装器( SimpleOpenNI 和 OpenCV ),目前可以满足我的适度需求。这是一个非常基本的示例:
import hypermedia.video.*;
import SimpleOpenNI.*;
SimpleOpenNI ni;
OpenCV cv;
PImage user;
void setup()
{
ni = new SimpleOpenNI(this);
ni.enableScene();
background(200,0,0);
strokeWeight(4);
size(ni.sceneWidth() , ni.sceneHeight());
cv = new OpenCV( this );
cv.allocate(width,height);
}
void draw()
{
//OpenNI
ni.update();
user = ni.sceneImage();
//OpenCV
cv.copy(user);
cv.blur( OpenCV.BLUR, 17 );
Blob[] blobs = cv.blobs( width,height, OpenCV.MAX_VERTICES, true, OpenCV.MAX_VERTICES*4 );
//diplay
image(cv.image(),0,0);
//*
fill(255);
for(Blob b : blobs){
beginShape();
for(java.awt.Point p : b.points) vertex(p.x,p.y);
endShape(CLOSE);
}
//*/
}
请注意,此 OpenCV 包装器使用 OpenCV 1.0,您可能还想使用自己的 Java 类,而不是使用 Processing 库。在这种情况下尝试 JavaCV wrapper 。关于深度流,如果你查看 OpenNI 附带的 org.OpenNI.Samples.SimpleViewer
类,你会注意到来自 OpenNI 的深度字节被写入 BufferedImage,我想这可以是与OpenCV等集成
public SimpleViewer() {
try {
scriptNode = new OutArg<ScriptNode>();
context = Context.createFromXmlFile(SAMPLE_XML_FILE, scriptNode);
depthGen = DepthGenerator.create(context);
DepthMetaData depthMD = depthGen.getMetaData();
histogram = new float[10000];
width = depthMD.getFullXRes();
height = depthMD.getFullYRes();
imgbytes = new byte[width*height];
DataBufferByte dataBuffer = new DataBufferByte(imgbytes, width*height);
Raster raster = Raster.createPackedRaster(dataBuffer, width, height, 8, null);
bimg = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
bimg.setData(raster);
} catch (GeneralException e) {
e.printStackTrace();
System.exit(1);
}
}
关于Java:opencv 和 openni,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8367303/
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我用home通过kinect捕捉: capture.retrieve( depthMap, CV_CAP_OPENNI_DEPTH_MAP ) capture.retrieve( bgrImage,
我是图像处理新手。如何使用 Simple OpenNI for Processing 中的 getUserPixels() 跟踪多个用户?这需要什么作为参数?我该如何设置此代码? 最佳答案 这个想法是
所以我知道这个问题之前已经完成,但其他大部分时间仍然是 OpenNI 和 Libfreenect 都被剥离的时候。我的问题是: 1)我想知道现在是什么状态。2)这两者之间的差异(优点,缺点和其他)3)
我是 OpenNI 的新手。当我使用 Visual Studio 2010 c++ 尝试 OpenNI 示例时,我遇到了这些错误: 1>kinect_first_try.obj : error LNK
我刚刚安装了 openNi 库并让我的 kinect 在我的电脑上工作。我的问题是我只是一个 c++ 编程新手。 我从这个页面复制了手部追踪代码: http://openni.org/Document
我正在尝试使用 OpenNI 从 Kinect 的音频流中获取峰值电平(分频电平或诸如此类)。 我找到了这些: http://openni.org/docs2/Reference/classxn_1_
我想知道是否有人能够在 java 中将 openni 与 opencv 结合使用?例如,您在 IplImage 等中获得深度流……我目前正在尝试这样做,但我不确定从哪里开始。 如果任何完成此操作的人想
我正在使用 OpenNI、OpenCv 2.4 和 Kinect 实现手指检测算法。问题是我不知道如何开始,我找到了一段代码并尝试运行它。但问题是 imgproc_c.h 有很多错误,如(未声明的 C
我需要生成自己的 ONI 文件,我项目中的科学深度图像不是使用 Kinect 等常规设备生成的。 我查看了他们的github,发现有两个库https://github.com/OpenNI/OpenN
谁能给我一些解决这个问题的提示? 我正在尝试编译 "Kinect Matlab" (在 Mac OS 10.7 上),在编译脚本中是以下行: mex('-v','-L/usr/lib/','-lOpe
我已经能够找到/创建一些代码,允许我从支持 OpenNI 的相机(具体来说是 Orbbec Astra S)打开深度和颜色流。除了与标准 OpenNI 查看器不同外,我的流将最近的点显示为最暗的颜色,
我正在考虑在我的一个项目中使用 Kinect,但我完全迷失在所有库之间。不知 Prop 体是什么。最重要的是,我正在阅读有关 OpenNI 和 OpenKinect 的内容。但不知道他们的关系/差异。
我正在尝试提取用户轮廓并将其放在我的图像上方。我能够制作一个 mask 并从 RGB 图像中剪切用户。但轮廓很乱。 问题是如何使蒙版更加精确(以适合真实用户)。我尝试过 ERODE-DILATE 过滤
我在 Linux 上使用点云库 1.7.2。尽管 pcd_write 示例有效,但 PCL 工作正常。 但是当尝试运行 openni_grabber 时,它会显示一个窗口屏幕,其中包含三个红色、绿色和
我正在尝试编译 cpp 文件,但编译器找不到包含目录。 当我这样做时,我收到错误: #include 我已经安装了 OpenNI 及其依赖项,并且正在使用带有 Raspbian 操作系统的 Rasp
所以,我一直在尝试设置我的系统,以便我可以在开发环境中从 kinect 获取视频流。到目前为止我的设置是这样的: Windows 7 32 位 OpenCV 2.3.1 Super Pack(我假设大
我编写了一个程序,用于在 OpenNI 中保存 Kinect 深度图像的所有深度帧。我使用了简单的查看器示例。没有保存所有帧的问题!!我运行我的程序 10 秒,虽然应用程序设置为 30fps,但只保存
可以在同一个项目中使用两者吗?实际上他们有不同的类(class)。 我想这样做是因为 OpenNI2 有 Microsoft Kinect 的驱动程序,但是库 PCL(点云库)还不能与这个版本的 Op
Kinect OpenNI library使用自定义视频文件格式来存储包含 rgb+d 信息的视频。这些视频的扩展名为 *.oni。我找不到关于 ONI 视频格式的任何信息或文档。 我正在寻找一种将传
我是一名优秀的程序员,十分优秀!