C++ OpenCV imdecode slow

我发送一个C#图像的字节数组到C++库。我用OpenCV(版本3.3.1)解码图像BMP图像解码速度快,但JPEG图像速度慢。C++ OpenCV imdecode slow

我如何加快JPEG图像的解码时间? (多线程,GPU,...?)

解码性能

--------------------------------------------------------- 

| Resolution | Format | Size | Duration | |

---------------------------------------------------------

| 800x600 | BMP | 2MB | 0.7 ms | |

---------------------------------------------------------

| 800x600 | JPEG | 10KB | 4 ms | 500% slower |

---------------------------------------------------------

OpenCV的C++方法

VMAPI char* __stdcall SendImage(unsigned char* pArray, int nSize) 

{

cv::Mat buf(1, nSize, CV_8UC1, (void*)pArray);

auto start = std::chrono::high_resolution_clock::now();

//cv::Mat input = cv::imdecode(buf, CV_LOAD_IMAGE_COLOR);

cv::Mat input = cv::imdecode(buf, -1);

auto finish = std::chrono::high_resolution_clock::now();

std::chrono::duration<double> elapsed = finish - start;

std::string result = "Test Version 1.0 - Elapsed time: " + std::to_string(elapsed.count() * 1000) + " s\n";

return _strdup(result.c_str());

}

C#请求

[DllImport("VideoModule.dll")] 

public static extern string SendImage(IntPtr pArray, int nSize);

static void ProcessImage()

{

var bitmap = new Bitmap(800, 600);

using (var graphic = Graphics.FromImage(bitmap))

{

graphic.Clear(Color.White);

graphic.DrawRectangle(new Pen(Color.DarkBlue), 20, 20, 60, 60);

graphic.DrawRectangle(new Pen(Color.DarkGreen), 200, 200, 60, 60);

graphic.DrawRectangle(new Pen(Color.Red), 500, 400, 60, 60);

}

var memoryStream = new MemoryStream();

//Return an image in JPEG

bitmap.Save(memoryStream, ImageFormat.Jpeg);

//Return an image in BMP

//bitmap.Save(memoryStream, ImageFormat.Bmp);

var imageData = memoryStream.GetBuffer();

var size = Marshal.SizeOf(imageData[0]) * imageData.Length;

IntPtr pnt = Marshal.AllocHGlobal(size);

try

{

// Copy the array to unmanaged memory.

Marshal.Copy(imageData, 0, pnt, imageData.Length);

}

catch (Exception)

{

}

result = SendImage(pnt, imageData.Length);

Marshal.FreeHGlobal(pnt);

Console.WriteLine(result);

}

回答:

您可以使用其他的编解码器,例如

  • https://github.com/libjpeg-turbo/libjpeg-turbo
  • http://www.fastcompression.com/news/2013-cuda-jpeg-codec.htm
  • https://software.intel.com/en-us/intel-ipp

有关这个主题的
http://www.briancbecker.com/blog/2010/analysis-of-jpeg-decoding-speeds/

构建的OpenCV 3.0.0用一个有趣的文章libjpeg turbo?
http://answers.opencv.org/question/68681/how-to-build-opencv-300-with-libjpeg-turbo/

以上是 C++ OpenCV imdecode slow 的全部内容, 来源链接: utcz.com/qa/265956.html

回到顶部