Java:opencv&;openni
我想知道是否有人能够在java中将openni与opencv结合使用? 例如,您在IplImage中获取深度流等。。。我目前正在尝试这样做,但我不知道从哪里开始 如果有人愿意分享他们的知识或代码,我将不胜感激 到目前为止,我的代码是: / 虽然我有一个黑色的框架。所以它还不起作用 当我没有像这里那样初始化IplImage,而是只初始化IplImage depthImage=new IplImage();我得到这个错误:Java:opencv&;openni,java,opencv,openni,Java,Opencv,Openni,我想知道是否有人能够在java中将openni与opencv结合使用? 例如,您在IplImage中获取深度流等。。。我目前正在尝试这样做,但我不知道从哪里开始 如果有人愿意分享他们的知识或代码,我将不胜感激 到目前为止,我的代码是: / 虽然我有一个黑色的框架。所以它还不起作用 当我没有像这里那样初始化IplImage,而是只初始化IplImage depthImage=new IplImage();我得到这个错误: Exception in thread "main" java.lang.N
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)
线程“main”java.lang.NullPointerException中的异常
位于java.awt.image.buffereImage。(buffereImage.java:613)
在com.googlecode.javacv.cpp.opencv_core$IplImage.getBufferedImage(opencv_core.java:1005)
在com.googlecode.javacv.cpp.opencv_core$IplImage.getBufferedImage(opencv_core.java:931)
位于com.googlecode.javacv.CanvasFrame.showImage(CanvasFrame.java:331)
在kitouch.kitouch.paint(kitouch.java:138)
在kitouch.kiTouchApp.main(kiTouchApp.java:21)
提前谢谢 我确实使用了OpenNI和Java,但使用和可用的包装器(和)目前可以满足我的适度需求。 下面是一个非常基本的示例:
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类,而不是使用处理库。在这种情况下,尝试包装器。
关于深度流,如果您查看OpenNI附带的org.OpenNI.Samples.SimpleViewer
类,您会注意到OpenNI中的深度字节被写入一个BuffereImage,我认为它可以与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);
}
}
publicsimpleviewer(){
试一试{
scriptNode=newoutarg();
context=context.createFromXmlFile(示例XML文件,scriptNode);
depthGen=DepthGenerator.create(上下文);
DepthMetaData depthMD=depthGen.getMetaData();
直方图=新浮动[10000];
宽度=depthMD.getFullXRes();
高度=深度。getFullYRes();
imgbytes=新字节[宽度*高度];
DataBufferByte dataBuffer=新的DataBufferByte(单位:百万字节,宽度*高度);
光栅=光栅.createPackedRaster(数据缓冲区,宽度,高度,8,空);
bimg=新的BuffereImage(宽度、高度、BuffereImage.TYPE_BYTE_GRAY);
bimg.setData(光栅);
}捕获(一般异常e){
e、 printStackTrace();
系统出口(1);
}
}
我确实使用了OpenNI和Java,但使用和可用的包装器(和)目前可以满足我的适度需求。
下面是一个非常基本的示例:
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类,而不是使用处理库。在这种情况下,尝试包装器。
关于深度流,如果您查看OpenNI附带的org.OpenNI.Samples.SimpleViewer
类,您会注意到OpenNI中的深度字节被写入一个BuffereImage,我认为它可以与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);
}
}
publicsimpleviewer(){
试一试{
scriptNode=newoutarg();
context=context.createFromXmlFile(示例XML文件,scriptNode);
depthGen=DepthGenerator.create(上下文);
DepthMetaData depthMD=depthGen.getMetaData();
直方图=新浮动[10000];
宽度=depthMD.getFullXRes();
高度=深度。getFullYRes();
imgbytes=新字节[宽度*高度];
DataBufferByte dataBuffer=新的DataBufferByte(单位:百万字节,宽度*高度);
光栅=光栅.createPackedRaster(数据缓冲区,宽度,高度,8,空);
bimg=新的BuffereImage(宽度、高度、BuffereImage.TYPE_BYTE_GRAY);
bimg.setData(光栅);
}捕获(一般异常e){
e、 printStackTrace();
系统出口(1);
}
}
目前我正在研究BuffereImage,我相信BuffereImage可以转换为IplImage。哦,顺便说一句,我使用的是javacvSure,谷歌搜索JavaiPlimage应该会让你明白。没错,但我尝试了一个内置转换:“depthImage.createFrom(bimg);帧。显示图像(深度图像);'我在updatedepth函数中这样做。但是我得到了一个空指针。所以我必须继续搜索我已经在问题中添加了我的代码,也许你可以看看?(我没有得到一个空指针,只有一个黑屏)不幸的是,我现在不能在我的电脑上测试,但是你能检查一下你是否能在屏幕上显示bimg(或来自bimg的缓冲区图像)吗?如果这样做有效,那么问题要么在于depthImage.createFrom(),要么在于字节数组没有被理解,但首先,确保bimg不是null/空的。HTH目前我正在研究BuffereImage,我相信BuffereImage可以转换为IplImage。哦,顺便说一句,我使用的是javacvSure,谷歌搜索JavaiPlimage应该会让你明白。没错,但我尝试了一个内置转换:“depthImage.createFrom(bimg);帧。显示图像(深度图像);'我在updatedepth函数中这样做。但是我得到了一个空指针。所以我必须继续搜索我已经在问题中添加了我的代码,也许你可以看看?(我没有得到一个空指针,只有一个黑屏)不幸的是,我现在不能在我的电脑上测试,但是你能检查一下你是否能在屏幕上显示bimg(或来自bimg的缓冲区图像)吗?如果这样做有效,那么问题要么在于depthImage.createFrom(),要么在于字节数组没有被理解,但首先,确保bimg不是null/空的。嗯