代码之家  ›  专栏  ›  技术社区  ›  HimalayanCoder

将bytebuffer转换为opencv mat

  •  1
  • HimalayanCoder  · 技术社区  · 6 年前

    我想把bytebuffer转换成opencv mat是一种有效的方式。

    脏的解决方案是首先使用copyPixelsFromBuffer创建位图

    Bitmap bmp = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888);
    bmp.copyPixelsFromBuffer(frame);
    

    然后使用opencv-utils将位图转换为mat。

    Mat mat = new Mat();
    Utils.bitmapToMat(bmp, mat);
    

    哪个比较慢

    请给我一个优雅的解决方案

    4 回复  |  直到 6 年前
        1
  •  1
  •   enterML    6 年前

    下面的解决方案非常简单。假设 frame 是输入 ByteBuffer

    byte[] data = new byte[frame.capacity()];
    ((ByteBuffer) frame.duplicate().clear()).get(data);
    Mat mat = new Mat(480, 640, CvType.CV_8UC4);
    mat.put(0, 0, data);
    
        2
  •  1
  •   zindarod    6 年前

    免责声明:这是未测试的代码。

    如果你知道图像的属性(宽度、高度、类型等),那么你可以。

    byte[] data = byteBuffer.array()
    Mat mat = new Mat(width, height, CvType.CV_8UC3);
    mat.put(0, 0, data);
    

    请记住,opencv默认创建的图像是b、g、r。

        3
  •  0
  •   Mills    6 年前

    我不太熟悉bytebuffer bytebuffer,但是如果你能得到一个指向缓冲区的指针(通过 getdirectbufferaddress(). . ?),您可以使用此mat constructor mat(size,int type,void*data,size_t step). >that will not do any copying.

    GetDirectBufferAddress() ?),可以使用此mat构造函数 Mat(Size size, int type, void* data, size_t step) 那不会做任何复制。

        4
  •  0
  •   dementor    6 年前

    这可能有用。

    byte[] bytes = frame.array();      
    Mat mat = Imgcodecs.imdecode(new MatOfByte(bytes), Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);