Как использовать библиотеку C # в проекте C ++ OpenCV с графическим интерфейсом VB.net? - PullRequest
2 голосов
/ 01 апреля 2011

Я разработал приложение, написанное на неуправляемом C ++, которое использует OpenCV, и до сих пор только что использовал встроенную библиотеку highgui для отображения результатов.

Вместе с разработчиком VB.net я бы хотел упаковать его в продукт, подходящий для продажи.

Два улучшения, которые я решил сделать, это добавить графический интерфейс и, во-вторых, улучшить модуль распознавания лиц, заменив его на решение 3rdParty.

Проблемы заключаются в том, что 3rdParty SDK имеет только API C #, и, очевидно, другой программист хотел бы реализовать интерфейс в VB.

Я мог бы перенести свой код на C # и использовать EmguCV, убив двух зайцев одним выстрелом, однако база кода довольно большая, и я не думаю, что у меня есть время, но это вариант.

Я хотел бы знать, куда идти отсюда. Нужно ли портировать на MC ++, использовать смешанные сборки Native и Managed, написать графический интерфейс в Qt и т. Д.

Также, как мне отобразить поток Iplimage в элементе управления .NET WinForm?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2011

Возможно ли в вашей ситуации реализовать какой-то простой высокоуровневый 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.

1 голос
/ 01 апреля 2011

Я использовал EmguCV, и это хорошо работает. Я также поместил свой код OpenCV C ++ в управляемую DLL, и это тоже хорошо работает. Вы также можете иметь исходный код .NET и приемник для интерфейсов COM, которые вы можете вызывать на стороне C ++.

0 голосов
/ 01 апреля 2011

Хотя я решил портировать на MC ++ для полноты и поскольку я уже провел исследование, есть два других решения, которые я мог бы использовать.

Во-первых, я мог бы вызвать компонент C # из нативного C ++ путем , внедрив моно среду выполнения в проект. Выглядело интересно, и я буду исследовать его для использования в других проектах.

Или я мог бы использовать CLR Hosting API . Выглядело больше взлома, чем первый, но выполнимый.

Наконец, для всех, кто интересуется поиском информации, необходимой для переноса C ++ в управляемую форму, см. эту ссылку. Похоже, нативный C ++ является единственным языком, который может быть скомпилирован как управляемый без изменения кода. Поправь меня, если я ошибаюсь. РЕДАКТИРОВАТЬ: я неправильно ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...