2017-12-27 717 views
0

我发送一个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); 
} 
+1

JPG格式使用压缩算法来减少图像大小,而通常BMP不会。 – Silencer

+0

我知道但有500%的差异?而在C#jpeg类似的问题获胜? –

+0

您是否正在运行调试版本?你用什么优化选项编译? –

回答