Получение снимков с цифровой зеркальной камеры (Nikon) из программного кода на c#

    Здравствуйте.

    Столкнулся я с задачей получения фотографий с фотокамеры в моей программе на c#, причем надо было так, чтобы пользователь нажал кнопку в программе, или случилось какое-то программное событие, и мы ррррраз и получили снимок с камеры в программу и дальше его как-нибудь обработали/сохранили/отправили, в общем сделали с ним что-нибудь программным же образом.

    Как оказалось, у производителей цифровых зеркальных фотокамер есть специальный SDK, через который можно программным путем к этой самой камере обратиться и поуправлять ею. У меня камера Nikon D5200, хотя для Sony и Canon вроде бы тоже видел подобный SDK.

    Цель статьи рассказать о возможности и показать короткий пример. Как известно, если вы знаете что что-то можно сделать, то узнать, как это сделать – пара пустяков.

    Итак, что нам понадобиться:

    Во-первых, вам нужно скачать сам SDK с сайта Никона: sdk.nikonimaging.com/apply

    Вам придется пройти регистрацию и стать почетным разработчиком Никона, причем при регистрации нужно использовать почтовый ящик организации, общедоступные ящики там не прокатывают. Там же можно увидеть список поддерживаемых камер, к сожалению дешевые мыльницы не поддерживаются.

    Во-вторых, для простоты, рекомендую воспользоваться уже написанным NikonCSWrapper’ом: sourceforge.net/p/nikoncswrapper/wiki/Home

    Далее создаете свой проект (в Visual Studio), подключаете ссылку на никоновский враппер, и, внимание: копируете в директорию с бинарниками файлы: NkdPTP.dll и Type0009.md3 (вот тут цифры могут отличаться в зависимости от камеры), которые можно отыскать в скачанном SDK.

    Теперь небольшой пример о том, как фотографировать:

    Сначала определяем менеджер устройств:

    NikonManager manager = new NikonManager("Type0009.md3");

    Затем привязываем к менеджеру обработчик события добавления устройства:

    manager.DeviceAdded += manager_DeviceAdded;

    в коде обработчика у меня вот такой текст:

    void manager_DeviceAdded(NikonManager sender, NikonDevice device)
    {
    _device = device;
    this.Text = _device.Name;
    _device.ImageReady += _device_ImageReady;
    }


    Здесь я сохраняю ссылку на новое устройство и привязываю обработчик к событию ImageReady, которое будет срабатывать когда камера фотографирует, причем событие вызывается, и когда вы из программы командуете сфотографировать, и когда вы на самой камере жмете кнопку.

    Обработчик события фотографирования у меня выглядит так:

    void _device_ImageReady(NikonDevice sender, NikonImage image)
    {
    MemoryStream ms = new MemoryStream(image.Buffer);
    Image img = Image.FromStream(ms);
    ms.Close();
    pictureBox1.Image = img;
    }


    Здесь я просто получаю доступ к буферу, в котором сидит фотография и через MemoryStream загружаю ее в Image, который потом отправляю в pictureBox, чтобы вывести ее на форме. Как вы знаете, с Image вообще можно делать все что угодно, мой код – только для примера.

    Чтобы сфоткать камерой из программного кода, нужно вызвать метод Capture():

    _device.Capture();

    Ну и при выходе из программы обязательно нужно закрыть менеджер устройств, иначе потом не подключитесь к нему, пока не перезагрузите компьютер:

    manager.Shutdown();

    Вообще, через SDK можно делать множество вещей с вашей камерой: получать и устанавливать любые(?) параметры камеры, фотографировать, снимать видео, фокусировать автоматически и вручную (из программы), получать живое видео с видоискателя.

    На этом у меня все, надеюсь, кому-нибудь эта информация пригодиться, Спасибо за внимание.
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 22
      +14
      А что вы написали такого, что отличается от обычной рутинной программерской работы? Скачать SDK, найти готовую обертку и вуаля?
        +1
        Я рассказал сообществу о возможности. Думаю, что есть такие, которые ищут способ получения снимков с фотокамеры но не знают, что можно программно получать их с фотокамеры. Я, например, на хабре о такой возможности ничего не нашел.
        В моем посте как раз мало рутинной программерской работы, только несколько строк кода, для демонстрации того, как можно получить снимки.
        Ну и инженерный подход как раз в том, чтобы найти существующие технологии и использовать их с минимальными затратами.
        А как вы считаете, каким должен был быть мой пост?
          –2
          Да я не в особой претензии, на самом то деле, пост для новичков, пусть будет. Просто я первым делом набрал в гугле "Nikon SDK C#" и получил более чем исчерпывающую информацию о том, как взаимодействовать с камерой. Другое дело, если бы данная информация была дефицитной или вы сделали что-то такое, что другим не удавалось…
        +2
        делал аналогичное на C с libgphoto, не понял, зачем писать об этом пост ))
          +1
          Я раньше тоже не понимал, зачем люди пишут посты и чего-то рассказывают. Вот например, вопрос задать — это понятно, задал вопрос, получил ответ и тебе польза. А вот какая польза от того что написал топик и рассказал о чем-то? Ну разве что топик рекламный. Наверное, многие так считают.
            +2
            Зачем писать пост здесь о простых (для кого просто, для кого не очень), но нестандартных вещах? У хабра хорошая поисковая выдача, а значит если кто будет искать в поисковике, то попадёт сюда. Статья пригодится людям, а хабр получит дополнительные посещения.
              +1
              Делал графическую оболочку для libgphoto под MacOS.
              0
              А что еще с камерой можно делать через это АПИ? Фокус или режимы менять?
                +1
                ага, в конце поста об этом написал.
                  0
                  получать живое видео с видоискателя.
                  Жаль не все камеры это могут. Или тут дело в другом и камеры могут но не реализовано?
                  Не подскажете D3000 Live View умеет?
                    +1
                    Примерно, через неделю-другую у меня будет в распоряжении камера D3100, постараюсь потестить на ней, тогда и напишу.
                      0
                      Для D3100 нет поддержки в SDK
                      +1
                      К сожалению нет. Нет поддержки Live View у прошивки для данной камеры. У самого D3000
                  0
                  Сейчас делаю то же самое на c#, но через ezShare по wifi. Подойдет любая фотокамера.
                    0
                    Здорово! Слышал, что ezShare не очень надежно и быстро коннектиться и передает изображения, у вас сама карточка есть? как скорость?
                      +1
                      Работает стабильно. Скорость 1 мбит. После выключения фотокамеры активен 10-15 минут — закачка не оборвется. Брал здесь
                      0
                      Кстати, вот еще какой можно использовать подход, я тоже рассматривал его для решения своей задачи. Если камеру подключить к компу через USB, то она будет подключена как диск (правда некоторые камеры в таком режиме не работают как камеры:), после того как камера делает снимок, он появляется в виде файла, ну и очевидно, что можно мониторить наличие новых файлов на диске и делать с ними то, что нужно.
                      0
                      У никона есть возможность создавать свои профили для внутрикамерной обработки. Эти же профили «на лету» преобразуют тона и цвета для сжатого видео.
                      Мне кажется, что видеографы снимающие на никон будут очень благодарны если будет удобное сторонее приложение для создания таких профилей.
                        0
                        Решал такую же задачу с помощью Windows Image Acquisition.
                        Если честно, то только для получения фото с камеры не вижу смысла подключать их SDK.
                        Другое дело был программный спуск затвора, хотя тоже решился этот вопрос без SDK.

                        Речь о работе в среде Windows. Про другие не скажу — не компитентен.
                          0
                          а я как раз и сделал программный спуск затвора, _device.Capture(); именно это и делает.
                          через WIA с веб камерами я тоже пытался получать снимки, проблема в том, что веб камеры меня не устроили по качеству получаемого изображения.
                            0
                            А где я говорил про вебкамеру?
                            Я всё это делал для фотоаппарата Nikon D3100. Да, через WIA.
                            Да, на С#.

                            После разового выбора устройста, сохраняете его device id и обращаетесь когда нужно.
                              0
                              и снимок програмно можно сделать? а отловить событие спуска затвора кнопкой на камере можно? можете пример кода привести, как подключиться и сфотографировать через wia?

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

                        Самое читаемое