Java中OpenCV和OpenGL与俄罗斯方块游戏的连接

Posted

技术标签:

【中文标题】Java中OpenCV和OpenGL与俄罗斯方块游戏的连接【英文标题】:Connection between OpenCV and OpenGL in Java with Tetris Game 【发布时间】:2022-01-24 06:31:55 【问题描述】:

我有一个需要使用相机的俄罗斯方块项目。也就是说,有两个窗口。一个加载网络摄像头(OpenCV)并检测到红色三角形或正方形。另一个窗口是俄罗斯方块游戏(OpenGL),每个瓷砖都会从上到下一个接一个地下来。 所有功能都已编写好,一切正常。现在我需要将两者连接起来。 我在这里写了类的部分代码 在 BoxLightTextRendererPP 类中,您可以看到游戏块的定位。 在 VideoProcessing 类中,您可以看到相机的轮廓检测。 在 InteractionHandler 类中,我必须编写一个方法,例如使用 Switch-Case 检测到它,如果相机看到一个正方形,则将令牌向左移动,如果检测到三角形,则将其向右移动。 我该怎么做?

BoxLightTexRendererPP:

// Pointers (names) for data transfer and handling on GPU
private int[] vaoName;  // Name of vertex array object
private int[] vboName;  // Name of vertex buffer object
private int[] iboName;  // Name of index buffer object

float[] barrey = verticies;
int block = 28;
//Startpunkt rechts/links
static float x = -1.5f;
//Startpunkt oben/unten
float h = 1.5f;
//Startpunkt vorne/hinten
float y = 0;
//Fallgeschwindigkeit
float fall = 0.01f;
boolean start = true;
public static boolean go = false;
boolean stay = false;
float[] barrey1 = verticies;
int block1 = 28;

视频处理:

for (int idx = 0; idx < contours.size(); idx++) 
                MatOfPoint2f approx = new MatOfPoint2f(); //approx parameter count contours of objects; important for interaction handling
                //allows the approximation of polygons and determine scope of object
                Imgproc.approxPolyDP(newContours.get(idx), approx, Imgproc.arcLength(newContours.get(idx), true) * 0.02, true);
                long count = approx.total();
                //filtering small blobs
                if(Math.abs(Imgproc.contourArea(contours.get(idx))) > 1000) 

                    //draw contours on objects
                    if (count == 5) 
                        Imgproc.drawContours(frame, contours, idx, new Scalar(75, 0, 0));
                    
                    if (count == 6) 
                        Imgproc.drawContours(frame, contours, idx, new Scalar(255, 255, 255));
                    
                    if (count == 4) 
                        Imgproc.drawContours(frame, contours, idx, new Scalar(200, 0, 0));
                        viereck = (int) count;
                    
                    if (count == 3) 
                        Imgproc.drawContours(frame, contours, idx, new Scalar(360, 100, 50));
                        dreieck = (int) count;
                    
                
            

交互处理程序:

public void connection() 
        float xAchse = BoxLightTexRendererPP.x;
        int viereck = VideoProcessing.viereck;
        int dreieck = VideoProcessing.dreieck;
        

        Switch(xAchse)
??????????????


    

【问题讨论】:

【参考方案1】:

于是我找到了答案:InteractionHandler 并不重要。 刚刚修改了视频处理: (仍然存在碰撞检测问题。我仍在努力。)

for (int idx = 0; idx < contours.size(); idx++) 
                MatOfPoint2f approx = new MatOfPoint2f(); //approx parameter count contours of objects; important for interaction handling
                //allows the approximation of polygons and determine scope of object
                Imgproc.approxPolyDP(newContours.get(idx), approx, Imgproc.arcLength(newContours.get(idx), true) * 0.02, true);
                long count = approx.total();
                //filtering small blobs
                if(Math.abs(Imgproc.contourArea(contours.get(idx))) > 1000) 

                    //draw contours on objects
                    if (count == 5) 
                        Imgproc.drawContours(frame, contours, idx, new Scalar(75, 0, 0));
                        BoxLightTexMainWindowPP.errorLog.setText("Fünfeck erkannt");
                        BoxLightTexRendererPP.x -= 0.1;
                    
                    if (count == 6) 
                        Imgproc.drawContours(frame, contours, idx, new Scalar(255, 255, 255));
                        BoxLightTexMainWindowPP.errorLog.setText("Sechseck erkannt");
                        BoxLightTexRendererPP.y -= 0.1;
                    
                    if (count == 4) 
                        Imgproc.drawContours(frame, contours, idx, new Scalar(200, 0, 0));
                        BoxLightTexMainWindowPP.errorLog.setText("Viereck erkannt");
                        BoxLightTexRendererPP.x += 0.1;
                    
                    if (count == 3) 
                        Imgproc.drawContours(frame, contours, idx, new Scalar(360, 100, 50));
                        BoxLightTexMainWindowPP.errorLog.setText("Dreieck erkannt");
                        BoxLightTexRendererPP.y += 0.1;
                    
                
            

【讨论】:

以上是关于Java中OpenCV和OpenGL与俄罗斯方块游戏的连接的主要内容,如果未能解决你的问题,请参考以下文章

Tetris(俄罗斯方块)

JAVA课程设计 俄罗斯方块

java的俄罗斯方块代码

java写俄罗斯方块啥水平

java如何用图形界面显示二维数组俄罗斯方块

新蜂俄罗斯方块说明书