C++ OpenCV imdecode 慢
C++ OpenCV imdecode slow
我将图像的字节数组从 C# 发送到 C++ 库。我用OpenCV(版本3.3.1)解码图像 BMP图像解码速度快,但JPEG图像解码速度慢。
如何加快 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/
使用 libjpeg turbo 构建 OpenCV 3.0.0?
http://answers.opencv.org/question/68681/how-to-build-opencv-300-with-libjpeg-turbo/
我将图像的字节数组从 C# 发送到 C++ 库。我用OpenCV(版本3.3.1)解码图像 BMP图像解码速度快,但JPEG图像解码速度慢。
如何加快 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/
使用 libjpeg turbo 构建 OpenCV 3.0.0?
http://answers.opencv.org/question/68681/how-to-build-opencv-300-with-libjpeg-turbo/