Вопросы 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#
http://code.google.com/p/opencvsharp/
установка OpenCvSharp в проект
OpenCvSharp FAQ


0 комментариев на «“Вопросы OpenCV — использование OpenCV под C#”»

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

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

    • ничего удивительного — в OpenCV начиная 2.3 появилась зависимость от TBB (этот момент отмечается в статье про установку OpenCV 2.3.1)

  2. Можно ли избежать переноса dll-файлов в папку bin, и каким либо образов вшить в реализуемую библиотеку на с++/cli? Т.е. чтобы я отдавал одну библиотеку mydllname.dll, а все используемые библиотеки opencv были в нее включены?

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

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение