gpt4 book ai didi

Java:opencv 和 openni

转载 作者:太空宇宙 更新时间:2023-11-03 23:03:47 25 4
gpt4 key购买 nike

我想知道是否有人能够在 java 中将 openniopencv 结合使用?例如,您在 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以及可用的包装器( SimpleOpenNIOpenCV ),目前可以满足我的适度需求。这是一个非常基本的示例:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com