Здравствуйте !
Меня интересует ваша ветка про «компьютерное зрение». Но вот незадача. Я в программировании не особо силен, и сейчас программирую на C#. А у вас все программы на C++. Есть ли у вас примеры на C# ?
Для работы c OpenCV на C# существует несколько библиотек-обёрток:
1. EmguCv (самый распространённый вариант)
2. OpenCvDotNet
3. OpenCvSharp
Когда мне потребовалось воспользоваться функционалом OpenCV под C# я выбрал именно последнюю библиотеку — OpenCvSharp.
Нет никаких заморочек с установкой — нужно просто сбросить dll-файл библиотеки в директорию проекта(туда же необходимо сбросить и dll-ки OpenCV), прописать в проекте и всё 🙂
Огромным плюсом этой библиотеки, так же является архив с примерами использования.
В качестве наглядного примера, как можно перенести код OpenCV с С++ на OpenCvSharp рассмотрим утилиту, осуществляющую захват видео с камеры.
//
// пример работы с OpenCvSharp
//
// подключение кадра с камеры, по нажатию на Enter - сохранение кадра в jpg-файл
//
// robocraft.ru
//
using System;
using OpenCvSharp;
class Program
{
static void Main()
{
Console.WriteLine("[i] Begin...");
IplImage frame = null;
IplImage src = null;
CvCapture capture = null;
CvWindow windowCapture = new CvWindow("capture");
try
{
capture = new CvCapture(0);
}
catch
{
Console.WriteLine("[!] Error: cant open camera.");
}
if (capture!=null)
{
double width = capture.GetCaptureProperty(CaptureProperty.FrameWidth);
double height = capture.GetCaptureProperty(CaptureProperty.FrameHeight);
Console.WriteLine("[i] width: " + width);
Console.WriteLine("[i] height: " + height);
int counter=0;
while (true)
{
capture.GrabFrame();
frame = capture.RetrieveFrame();
windowCapture.ShowImage(frame);
int key = CvWindow.WaitKey(33);
if (key == 27) // ESC
{
break;
}
else if (key == 13) //Enter
{
frame.SaveImage("Image"+counter+".jpg");
counter++;
}
}
}
else
{
Console.WriteLine("[!] Error: cant open camera.");
}
Console.WriteLine("[i] End.");
}
}
Единственная проблема с которой мне пришлось столкнуться во время моего непродолжительного знакомства с этой библиотекой стала ошибка — DllNotFoundException / TypeInitializationException. Эта проблема рассмотрена в FAQ-е к OpenCvSharp.
Первым делом скачайте себе полезную утилиту — Dependency Walker и натравите её на OpenCvSharp.dll и посмотрите каких файлов ей не хватает.
Возможно придётся установить Visual C++ 2005 Redistributable Package или Visual C++ 2008 SP1 Redistributable Package.
Так же обратите на требуемую версию OpenCV, т.к. библиотека ищет dll-ки именно той версии OpenCV для которой она была собрана.
Например, если вы скачали OpenCvSharp-2.2 , то в каталог проекта необходимо поместить файлы:
OpenCvSharp.dll opencv_core220.dll opencv_highgui220.dll opencv_imgproc220.dll opencv_video220.dll
Кстати, так же существует C#-обёртка для библиотеки videoInput:
VideoInputSharp
Ссылки
OpenCV. Сравнительный анализ оболочек под C#
http://code.google.com/p/opencvsharp/
установка OpenCvSharp в проект
OpenCvSharp FAQ



0 комментариев на «“Вопросы OpenCV — использование OpenCV под C#”»
Да, друзья, пора учить китайский…
Доброго времени суток!
Попробовал выше указанный пример и столкнулся с вышеуказанными проблемами.
Сначала просил opencv_core220.dll, добавил — затем opencv_imgproc220.dll,
добавил, но при запуске всё равно сообщение об ошибке DllNotFoundException.
Пишу в Visual Studio 2005.
Подскажите пожалуйста, как решить данную проблему!
Не знаю почему, но пока не добавил в проект ttb.dll ничего не хотело работать.
ttb.dll брал отсюда «C:\OpenCV\opencv\build\common\tbb\ia32\vc10».
решение нашел здесь
«Не знаю почему, но пока не добавил в проект ttb.dll ничего не хотело работать.»
OpenCV в своих алгоритмах использует архитектурные особенности процессоров Intel, от этой же компании есть компилятор поддерживающий все вкусные плюшки связанные с производительностью камней от intel и библиотека тоже от них, для производительности так сказать. А вообще С++ проект требовал tbb_debug.dll
ничего удивительного — в OpenCV начиная 2.3 появилась зависимость от TBB (этот момент отмечается в статье про )
Можно ли избежать переноса dll-файлов в папку bin, и каким либо образов вшить в реализуемую библиотеку на с++/cli? Т.е. чтобы я отдавал одну библиотеку mydllname.dll, а все используемые библиотеки opencv были в нее включены?
Есть ли у кого файлы
opencv_highgui220.dll
opencv_imgproc220.dll
opencv_video220.dll
?
Или быть может проект с уже подключенным opencvsharp?
Сейчас вышла интересная библиотека OpenCV.Net. Подключил ее в 13-ой студии через NuGet. Функционал тот же только под C#. например вместо cvZero( dst ), будет dst.SetZero(); Переписал на C# пример с детектором движения (исходник ). Единственное в чем загвоздка, ни как не могу найти аналогичное решение для CvtPlaneToPix( mask, 0, 0, 0, dst ).