Возможно ли в вашей ситуации реализовать какой-то простой высокоуровневый API вашего собственного кода OpenCV, чтобы он легко взаимодействовал с C # с помощью PInvoke? В прошлом у меня была похожая проблема: я упаковал свой нативный код примерно в 15 функций, которые можно было легко использовать из C # (используя PInvoke). Я не знаю, возможно ли сделать это легко в вашем случае, если нет, вы можете попытаться закодировать несколько классов в MC ++ и попытаться скомпилировать ваш код OpenCV с использованием MC ++, в основном, использование C ++ / CLI - это создание мост между нативным c ++ и управляемыми языками (хотя я лично до сих пор предпочитаю делать хороший нативный API и вызывать его из C #.
Что касается IplImage, если вы используете EmguCV, есть свойство .Bitmap
, которое дает вам управляемый класс System.Drawing.Bitmap
, который можно использовать без копирования базовых буферов (я рендерил 5 потоков в реальном времени с камер в моем приложении, и это работал довольно хорошо). С другой стороны, если вы хотите сделать это вручную, без использования EmguCV, я рекомендую вам проверить их исходный код и посмотреть, как они реализуют эту функциональность, и сделать это самостоятельно (в основном, вам нужно захватить указатель на память и получить несколько свойств , например, шаг изображения, ширина, высота и создайте класс Bitmap
самостоятельно, используя их).
Редактировать: Я нашел код, который использовал для визуализации изображения, обработанного в OpenCV:
C ++ код:
void __stdcall GetRectifiedImage(Calibration* calib, int left, int** dataPtr, int* stride)
{
CvMat* mat = ((CalibrationImpl*)calib)->imagesRectified[left > 0 ? 0 : 1];
*dataPtr = mat->data.i;
*stride = mat->step;
}
Этот код в основном заполняет dataPtr и step (при условии, что ширина и высота известны)
C # PInvoke:
[DllImport("Stereo.dll")]
public static extern void GetRectifiedImage(IntPtr calib, int left, out IntPtr data, out int stride);
Использование C # (с EmguCV):
StereoNative.GetDepthImage(calib, out ptr, out stride);
pictureBox5.Image = new Image<Gray, byte>(640, 480, stride, ptr).Bitmap;
Без Emgu вам нужно было бы увидеть, как они реализуют свойство .Bitmap
, и просто сделать это самостоятельно, чтобы создать собственный объект Bitmap
.