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

