JPEG encoding of cv::Mat

I would like to use the class NvJPEGEncoder from the Multimedia API to compress an Opencv image.

This class has the methods:

encodeFromBuffer(…)
encodeFromFd(…)

Does anyone know how to convert a cv::Mat to the corresponding nvBuffer, apply the encoding and re-convert the result back to opencv again?

Best regards!

JPEGEncoder can only take Nvbuffer or dma_buffer as input.

As a result, you need to use mmap to create a pointer that can sync with your Nvbuffer or dam_buffer fd. Copy you Mat to that memory (call NvBufferMemSyncForDevice for syncing) and then use encoder.

Thank you very much for your fast answer! I know the types that JPEGEncoder accept, but I can’t find an example to convert from cv::Mat to NvBuffer.

I found this example that converts fd to cv::Mat (https://devtalk.nvidia.com/default/topic/1014481/?comment=5174973), but I need the opposite conversion…

Can you help me with a simple example?

Thank you very much!

Hi,

What I told in #2 is the way to copy Mat to Nvbuffer. Please refer to mmapi sample 12_camera_v4l2_cuda.

Though I don’t think this one is easier to understand for your case.

I just address it again. You need to call mmap for your NvBuffer so that there is a cpu pointer. After that, copy your Mat content into that memory. Call NvBufferMemSyncForDevice, so that cpu memory is truly sync with gpu memory. Use that Nvbuffer to jpeg encoder.

where can i find ‘mmapi sample 12_camera_v4l2_cuda’

Please file a new topic. This thread was closed 3 years ago.