Вопросы OpenCV - использование OpenCV под C#



Здравствуйте!
Меня интересует ваша ветка про «компьютерное зрение». Но вот незадача. Я в программировании не особо силен, и сейчас программирую на 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#
code.google.com/p/opencvsharp/
установка OpenCvSharp в проект
OpenCvSharp FAQ
  • 0
  • 2 августа 2011, 08:47
  • noonv

Комментарии (8)

RSS свернуть / развернуть
+
+1
Да, друзья, пора учить китайский…
avatar

lfway

  • 2 августа 2011, 16:06
+
0
Доброго времени суток!
Попробовал выше указанный пример и столкнулся с вышеуказанными проблемами.
Сначала просил opencv_core220.dll, добавил — затем opencv_imgproc220.dll,
добавил, но при запуске всё равно сообщение об ошибке DllNotFoundException.
Пишу в Visual Studio 2005.
Подскажите пожалуйста, как решить данную проблему!
avatar

antizboy1985

  • 6 ноября 2011, 11:03
+
0
Не знаю почему, но пока не добавил в проект ttb.dll ничего не хотело работать.
ttb.dll брал отсюда «C:\OpenCV\opencv\build\common\tbb\ia32\vc10».

решение нашел здесь code.google.com/p/opencvsharp/issues/detail?id=106
avatar

vomchik

  • 31 марта 2012, 17:26
+
0
«Не знаю почему, но пока не добавил в проект ttb.dll ничего не хотело работать.»
OpenCV в своих алгоритмах использует архитектурные особенности процессоров Intel, от этой же компании есть компилятор поддерживающий все вкусные плюшки связанные с производительностью камней от intel и библиотека тоже от них, для производительности так сказать. А вообще С++ проект требовал tbb_debug.dll
avatar

tyz210

  • 12 июня 2012, 17:19
+
0
ничего удивительного — в OpenCV начиная 2.3 появилась зависимость от TBB (этот момент отмечается в статье про установку OpenCV 2.3.1)
avatar

noonv

  • 13 июня 2012, 06:31
комментарий был удален

+
0
Есть ли у кого файлы

opencv_highgui220.dll
opencv_imgproc220.dll
opencv_video220.dll
?
Или быть может проект с уже подключенным opencvsharp?
avatar

Stas

  • 27 октября 2013, 12:01
+
0
Сейчас вышла интересная библиотека OpenCV.Net. Подключил ее в 13-ой студии через NuGet. Функционал тот же только под C#. например вместо cvZero( dst ), будет dst.SetZero(); Переписал на C# пример с детектором движения (исходник blog.vidikon.com/?p=55). Единственное в чем загвоздка, ни как не могу найти аналогичное решение для CvtPlaneToPix( mask, 0, 0, 0, dst ).
avatar

beautifuldevil

  • 23 января 2014, 12:54

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.