在棋盘上绘制 3D 框 - OpenCV,LibGdx 和 java
Drawing 3D boxes on chessboard - OpenCV, LibGdx and java
我是 opencv 的新手。我在 java 中使用它,这很痛苦,因为互联网上的大多数示例和资源都是用 C++ 编写的。
目前我的项目涉及识别棋盘,然后能够在棋盘的特定部分上绘图。
我已经通过库的 Calib3d 部分获得了角落。但这就是我卡住的地方。我的问题是如何将我得到的角信息(这是 2D 图像上的角位置)转换为我可以在 3D space 中使用的信息以使用 LibGdx 绘制?
以下是我的代码(片段):
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);
}
}
有什么帮助吗?
您实际上需要使用这些坐标定位(物理)相机。
幸运的是,在棋盘的情况下,这真的很容易。
Note:
The current implementation in OpenCV may not satisfy you in terms of accuracy (at least for a monocular camera). A good AR experience demands nice accuracy.
(可选)使用一些噪声过滤method/estimation算法来稳定time/frames(最好是Kalman Filter)。
这会减少抽搐和摇晃。
PerspectiveCamera的控制姿势(位置+方向)使用上述姿势估计。
根据您提供给相机校准方法的 objPoints
使用比例和初始方向绘制 3D 东西。
你可以按照这个nice blog post去做。
您现在渲染的所有 3D 模型都将位于棋盘的参考系中。
希望对您有所帮助。
祝你好运。
我是 opencv 的新手。我在 java 中使用它,这很痛苦,因为互联网上的大多数示例和资源都是用 C++ 编写的。
目前我的项目涉及识别棋盘,然后能够在棋盘的特定部分上绘图。
我已经通过库的 Calib3d 部分获得了角落。但这就是我卡住的地方。我的问题是如何将我得到的角信息(这是 2D 图像上的角位置)转换为我可以在 3D space 中使用的信息以使用 LibGdx 绘制?
以下是我的代码(片段):
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);
}
}
有什么帮助吗?
您实际上需要使用这些坐标定位(物理)相机。
幸运的是,在棋盘的情况下,这真的很容易。
Note:
The current implementation in OpenCV may not satisfy you in terms of accuracy (at least for a monocular camera). A good AR experience demands nice accuracy.(可选)使用一些噪声过滤method/estimation算法来稳定time/frames(最好是Kalman Filter)。
这会减少抽搐和摇晃。
PerspectiveCamera的控制姿势(位置+方向)使用上述姿势估计。
根据您提供给相机校准方法的
objPoints
使用比例和初始方向绘制 3D 东西。你可以按照这个nice blog post去做。
您现在渲染的所有 3D 模型都将位于棋盘的参考系中。
希望对您有所帮助。
祝你好运。