java glReadpixels 到 OpenCV 垫

Posted

技术标签:

【中文标题】java glReadpixels 到 OpenCV 垫【英文标题】:java glReadpixels to OpenCV mat 【发布时间】:2015-06-23 12:29:57 【问题描述】:

我使用 lwjgl 在 OpenGL 中渲染图像,现在我想将 Framebuffer 的内容作为 RGB 存储在 OpenCV 矩阵中。为了让舒尔一切正常,我在 jFrame 的面板上显示捕获的图像。 但是问题出在:虽然显示存储的 jpeg 一切看起来都很好,但如果我试图显示捕获的帧缓冲区,我只会看到条纹!

下面是截图代码:

public Mat takeMatScreenshot()

    int   width       = m_iResolutionX;
    int   height      = m_iResolutionY;
    int   pixelCount  = width * height;
    byte[] pixelValues = new byte[ pixelCount * 3 ];

    ByteBuffer pixelBuffer = BufferUtils.createByteBuffer( width * height * 3 );

    glBindFramebuffer( GL_FRAMEBUFFER, m_iFramebuffer );
    glReadPixels( 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixelBuffer );

    for( int i = 0; i < pixelCount; i++ )
    
        int line        = height - 1 - (i / width); // flipping the image upside down
        int column      = i % width;
        int bufferIndex = ( line * width + column ) * 3;

        pixelValues[bufferIndex + 0 ] = (byte)(pixelBuffer.get(bufferIndex + 0) & 0xFF) ;
        pixelValues[bufferIndex + 1 ] = (byte)(pixelBuffer.get(bufferIndex + 1) & 0xFF);
        pixelValues[bufferIndex + 2 ] = (byte)(pixelBuffer.get(bufferIndex + 2) & 0xFF);
    

    Mat image = new Mat(width, height, CvType.CV_8UC3);
    image.put(0, 0, pixelValues);

    new ImageFrame(image);

    return image;

这里是显示垫子的代码:

public static Image toBufferedImage(Mat m)

   int type = BufferedImage.TYPE_BYTE_GRAY;

   if ( m.channels() == 3 )
       type = BufferedImage.TYPE_3BYTE_BGR;

   if( m.channels() == 4 )
       type = BufferedImage.TYPE_4BYTE_ABGR;

   int bufferSize = m.channels()*m.cols()*m.rows();
   byte [] b = new byte[bufferSize];
   m.get( 0, 0, b ); // get all the pixels

   BufferedImage image = new BufferedImage( m.cols(), m.rows(), type );
   final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
   System.arraycopy(b, 0, targetPixels, 0, b.length);  
   return image;

如果有人能帮助我,那就太好了! 干杯!

【问题讨论】:

你看到***.com/questions/9097756/…了吗? 是的,我做到了,对我帮助不大。 【参考方案1】:

哦不!捂脸! OpenCV Mat 对象的构造函数是:Mat(rows, cols)! 所以正确的解决方案是:

Mat image = new Mat(height, width, CvType.CV_8UC3);
image.put(0, 0, pixelValues);

【讨论】:

以上是关于java glReadpixels 到 OpenCV 垫的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同的线程上调用 glReadPixels?

glReadPixels 的 OpenGL DSA 等效项

不能 glreadPixels 超过 3844x1065

使用 OpenCV 处理来自 glReadPixels 的图像并将其作为纹理返回

glReadPixels 不更新值

glReadPixels 移动坐标与缩放