2010-12-16 5 views
0

Я испытал, что метод I. медленнее, чем II. Мое приложение выполняет обработку изображений в реальном времени. Я знаю, что C# не идеален для этой цели, но я могу отделить критические вещи от производительности и сделать это на C++, например. Мне интересно, почему медленнее на C# простой чертеж Bitmap без каких-либо вычислений. Мой вопрос: есть ли более быстрый метод в C#, чем I.?Скорость рисования фотокамер C#

I. C#: 

void DrawImg(Bitmap b) 
{ 
    pictureBox1.Image = b; 
    pictureBox1.Invalidate(); 
} 

II. C# + C++ + OpenCV 

C# side: 
[DllImport("MyWrapper.dll")] 
static extern void showimg(IntPtr p, int x, int y); 

void DrawImg(Bitmap b) 
{ 
     BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 
     showimg(d.Scan0, d.Width, d.Height); 
     b.UnlockBits(d); 
} 

C++ side: 
extern "C" void __stdcall showimg(uchar* p, int x, int y) 
{ 
    Mat img; // OpenCV's Mat class 
    img.create(y, x, CV_8UC3); 
    img.data = p; 
    imshow("Window1", img); 
} 

ответ

4

PixelFormat изображения имеет решающее значение. Подавляющее большинство компьютеров сегодня запускают свой видеоадаптер в режиме 32bpp. Это делает Format32bppPArgb более чем в 10 раз быстрее, чем любые другие, включая 32bppArgb и 24bppRgb. Обязательно создайте изображение в этом формате, при необходимости преобразуйте его.

Также очень важно то, что вы рисуете изображение с его первоначальным размером. Вы делаете это в собственном коде, но не обязательно с PictureBox. Он использует высококачественную интерполяцию на изображении, если ему нужно изменить размер изображения. Это требует времени.

+0

Спасибо за ответ. Мой код не преобразует изображение (изменение размера или смягчение и т. Д.), Просто скопируйте растровое изображение на экран. Формат Bitmap - 32bppArgb, потому что это значение по умолчанию. – bsebi 2010-12-16 20:39:16

+1

PictureBox делает, вот что говорит ваш фрагмент. Дело в том, чтобы * изменить * формат растрового изображения, не использовать значение по умолчанию. – 2010-12-16 20:41:51

2

Я не совсем уверен, что вы просите. Почему рисунок с C# медленнее, чем рисование с помощью C++? Прежде всего, поскольку стандартный класс Graphics, предоставляемый платформой .NET Framework, использует методы рисования GDI +, которые намного медленнее, чем функции GDI, используемые C/C++.

Вас интересует как ускорение рисунок в C#? Было бы очень полезно, если бы вы разместили соответствующие разделы (разделы) вашего кода, которые, по вашему мнению, слишком медленные. При использовании библиотеки Graphics определенно медленнее, чем некоторые из альтернатив, в большинстве случаев ее производительность не является фактором. Если вы не рисуете много графики в узком цикле, вы не должны испытывать никаких проблем. Если да, более вероятно, что ваш код может быть оптимизирован, а не полностью заменен. (Конечно, C# не то, что вы хотите использовать, если вы действительно ищете графику в реальном времени. В вашем вопросе недостаточно информации.)

В качестве альтернативы вы можете P/Invoke GDI основанные на чертежах функции из Win32 API и/или рассмотреть возможность использования unsafe кода в вашем приложении C# для непосредственного управления растровыми изображениями. Это должно дать вам очень сопоставимую производительность с кодом рисования в C++ DLL, который вы упомянули в своем вопросе, потому что вы будете использовать одни и те же процедуры. Однако, еще раз, вам нужно будет предоставить более подробную информацию в своем вопросе, если кто-либо из нас предоставит более конкретные, полезные советы.

+0

Спасибо за ответ, я изменил свой вопрос. – bsebi 2010-12-16 16:32:15

0

PictureBox делает немного больше фонового материала, чем просто рисует изображение.

Попробуйте рисовать непосредственно в окне управления цветом.

Graphics.DrawImageUnscaled (...), вероятно, будет самым быстрым методом Framework.

Если вы хотите быстрее, вам нужно взглянуть на DirectX или OpenGL и разгрузить чертеж на выделенное оборудование.

Смежные вопросы