Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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
在棋盘上绘制3D方框-OpenCV、LibGdx和java_Java_Opencv_Libgdx_Computer Vision_Augmented Reality - Fatal编程技术网

在棋盘上绘制3D方框-OpenCV、LibGdx和java

在棋盘上绘制3D方框-OpenCV、LibGdx和java,java,opencv,libgdx,computer-vision,augmented-reality,Java,Opencv,Libgdx,Computer Vision,Augmented Reality,我是opencv的新手。我在java中工作,这是一个痛苦的事情,因为互联网上的大多数例子和资源都是C++的。 目前,我的项目涉及识别棋盘,然后能够在棋盘的特定部分进行绘制 我已经通过图书馆的Calib3d部分找到了角落。但这就是我被卡住的地方。我的问题是如何将我获得的角点信息(即2D图像上的角点位置)转换为可以在3D空间中使用LibGdx绘制的信息 以下是我的代码(以片段形式): 公共类棋盘抽屉实现ApplicationListner{ …//字段在这里 MatOfPoint2f角点=新的Mat

我是opencv的新手。我在java中工作,这是一个痛苦的事情,因为互联网上的大多数例子和资源都是C++的。 目前,我的项目涉及识别棋盘,然后能够在棋盘的特定部分进行绘制

我已经通过图书馆的Calib3d部分找到了角落。但这就是我被卡住的地方。我的问题是如何将我获得的角点信息(即2D图像上的角点位置)转换为可以在3D空间中使用LibGdx绘制的信息

以下是我的代码(以片段形式):

公共类棋盘抽屉实现ApplicationListner{
…//字段在这里
MatOfPoint2f角点=新的MatOfPoint2f();
MatOfPoint3f objectPoints=新的MatOfPoint3f();
公共void create(){
网络摄像头=新的视频捕获(0);
…//程序休眠以确保相机已准备就绪
}
公共无效呈现(){
//获取网络摄像头图像
网络摄像头读取(网络摄像头图像);
//对图像进行灰度处理
Imgproc.cvtColor(网络视频图像、灰度图像、Imgproc.COLOR\u bgr2灰度);
//检查图像是否包含具有9x6角的棋盘
布尔foundCorners=Calib3d.findChessboardCorners(灰色图像,
新尺寸(9,6),
角点,Calib3d.CALIB_CB_FAST_CHECK(Calib3d.Calibu CB_ADAPTIVE_THRESH);
如果(四角){
对于(int i=0;i
有什么帮助吗

  • 实际上,您需要使用这些坐标定位(物理)摄影机

    幸运的是,在棋盘游戏中这真的很容易

    注意:
    OpenCV中当前的实现可能无法满足您的精度要求(至少对于单目相机而言)。良好的AR体验需要良好的准确性

  • (可选)使用一些噪声过滤方法/估计算法来稳定跨时间/帧的姿势估计(最好)

    这将减少震动和抖动

  • 使用前面提到的姿势估计控制一个机器人的姿势(位置+方向)

  • 根据您提供给相机校准方法的
    objPoints
    ,使用比例和初始方向绘制3D素材

    你可以按照这个来做

  • 现在渲染的所有三维模型都将位于棋盘的参照系中

    希望这有帮助。
    祝你好运

    public class chessboardDrawer implements ApplicationListner{
    ... //Fields are here
    
    MatOfPoint2f corners = new MatOfPoint2f();
    MatOfPoint3f objectPoints = new MatOfPoint3f();
    
    public void create(){
        webcam = new VideoCapture(0);
        ... //Program sleeps to make sure camera is ready
    
    }
    
    public void render(){
        //Fetch webcam image
        webcam.read(webcamImage);
        //Grayscale the image
        Imgproc.cvtColor(webcamImage, greyImage, Imgproc.COLOR_BGR2GRAY);
        //Check if image contains a chessboard of with 9x6 corners
        boolean foundCorners = Calib3d.findChessboardCorners(greyImage, 
        new Size(9,6), 
        corners, Calib3d.CALIB_CB_FAST_CHECK | Calib3d.CALIB_CB_ADAPTIVE_THRESH);
    
        if(foundCorners){
            for(int i = 0; i < corners.height; i++){
                //This is where i have to convert the corners 
                //to something i can use in libGdx to draw boxes
                //And insert them into the objectPoints variable
            }
        }
        //Show the corners on the webcamIamge
        Calib3d.drawChessboardCorners(webcamImage, new Size(9,6), corners, true);
        //Helper library to show the webcamImage
        UtilAR.imDrawBackground(webcamImage);
    }
    }