24. OpenCV шаг за шагом. Работа с камерой через библиотеку videoInput


1. OpenCV шаг за шагом. Введение.
2. Установка.
3. Hello World.
4. Загрузка картинки.
5. Вывод видео
6. Ползунок
7. Захват видео с камеры
8. Запись видео
9. События от мышки
10. Обработка изображения — сглаживание
11. Обработка изображения — изменение размеров
12. ROI — интересующая область изображения
13. Типы данных OpenCV
14. Матрица
15. Сохранение данных в XML
16. Генерация случайных чисел
17. Обработка изображения — морфологические преобразования
18. Обработка изображения — морфологические преобразования 2
19. Обработка изображения — заливка части изображения
20. Обработка изображения — альфа-смешивание
21. Обработка изображения — пороговое преобразование
22. Поиск объекта по цвету — RGB.
23. Поиск объекта по цвету. Цветовое пространство HSV.
24. Работа с камерой через библиотеку videoInput.

В шаге про захват видео с камеры я упомянул о том, что штатный захват не всегда срабатывает как нужно.
Например, он не хочет устанавливать частоту кадров.
Но под Windows есть замечательная библиотека videoInput, которая уже идёт в составе OpenCV, просто в OpenCV реализованы не все возможности этой библиотеки 😉

страничка библиотеки:
http://muonics.net/school/spring05/videoInput/

последняя версия — Version 0.1995 — Jan 2009 (35Mb — bin & src)

Можете скачать библиотеку или использовать файлы:

videoInput.h
videoInput.lib

, которые идут вместе с OpenCV.

Для работы с библиотекой в своём проекте нам нужно прописать пути к директориям файлов библиотеки в настройках своей IDE.

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

c:\DevTools\videoInput\

Прописываем пути до заголовочного файла (videoInput.h) и файла библиотеки (videoInput.lib):

C:\DevTools\videoInput\compiledLib\compiledByVS2008\include\

и

c:\DevTools\videoInput\compiledLib\compiledByVS2008\

соответственно.

При попытке слинковать программу вероятна ошибка, что не найдена библиотека atlthunk.lib

Это решается указанием в свойствах проекта не линковать эту библиотеку.
Для этого нужно перейти
Project–>Properties–>Linker->Command Line
и вставить строчку:

/NODEFAULTLIB:"atlthunk"

Пример получения видео с помощью videoInput.

//
// пример использования библиотеки видеозахвата videoInput
// http://muonics.net/school/spring05/videoInput/
//
// robocraft.ru
//

#include <cv.h>
#include <highgui.h>
#include <p>

#ifdef _MSC_VER
// подключение библиотек под MS VC
# pragma comment(lib, "cxcore200.lib")
# pragma comment(lib, "cv200.lib")
# pragma comment(lib, "highgui200.lib")
# pragma comment(lib, "videoInput.lib")
#endif //#ifdef _MSC_VER

IplImage* image = 0;

int main(int argc, char* argv[])
{
	// создание объекта videoInput
	videoInput VI;

	// получение списка доступных видеоустройств, возвращается число устройств
	int numDevices = VI.listDevices();
	int device1=0; // первое найденое видеоустройсво из списка

	// частота кадров
	VI.setIdealFramerate(device1, 15);

	// указываем разрешение
	VI.setupDevice(device1, 1280, 960, VI_COMPOSITE);

	//VI.showSettingsWindow(device1); // показать окошко настроек камеры

	// создаём картинку нужного размера
	image = cvCreateImage(cvSize(VI.getWidth(device1),VI.getHeight(device1)), IPL_DEPTH_8U, 3);

	cvNamedWindow("capture", CV_WINDOW_AUTOSIZE);

	while(1){
		if (VI.isFrameNew(device1)){
			// первый параметр - индекс видеоустройсва
			// второй - указатель на буфер для сохранения данных
			// третий - флаг, определяющий менять ли местами B и R -составляющий
			// четвёртый - флаг, определяющий поворачивать картинку или нет
			VI.getPixels(device1, (unsigned char *)image->imageData, false, true); // получение пикселей в BGR

			//
			// здесь уже можно работать с картинкой
			// с помощью функций OpenCV
			//

			// показываем картинку
			cvShowImage("capture", image);
		}

		char c = cvWaitKey(33);
		if (c == 27) { // ESC
			break;
		}
	}

	// освобождаем ресурсы
	cvReleaseImage(& image);
	cvDestroyWindow("capture");

	// останавливаем видеозахват
	VI.stopDevice(device1);

	return 0;
}

скачать иcходник (24-vi.cpp)

Вот и всё! Теперь, если штатными средствами захватить видео не получается — можете попробовать поработать через эту библиотеку 😉

далее: 25. Обработка изображения — свёртка.

Ссылки
http://muonics.net/school/spring05/videoInput/
http://opencv.willowgarage.com/wiki/DirectShow


16 комментариев на «“24. OpenCV шаг за шагом. Работа с камерой через библиотеку videoInput”»

  1. Друзья, подскажите, а можно с помощью этой библиотеке эмулировать веб-камеру (необходим функционал захвата изображения рабочего стола, типа ManyCam, VCam)?
    Или каким средствами это сделать? Возможно, есть решение получше, чем писать драйвер.

  2. Всем привет!
    подскажите плиз заинклудил библиотеку, скачал уже для VS2010 но при компиляции пишет ошибку
    1>d:\project\opencv_helloworld\opencv_helloworld\opencv_helloworld\opencv_helloworld.cpp(1): warning C4627: ‘#include <cv.h>’: skipped when looking for precompiled header use
    1> Add directive to ‘StdAfx.h’ or rebuild precompiled header
    1>d:\project\opencv_helloworld\opencv_helloworld\opencv_helloworld\opencv_helloworld.cpp(2): warning C4627: ‘#include <highgui.h>’: skipped when looking for precompiled header use
    1> Add directive to ‘StdAfx.h’ or rebuild precompiled header
    1>d:\project\opencv_helloworld\opencv_helloworld\opencv_helloworld\opencv_helloworld.cpp(3): warning C4627: ‘#include <videoInput.h>’: skipped when looking for precompiled header use
    1> Add directive to ‘StdAfx.h’ or rebuild precompiled header
    1>d:\project\opencv_helloworld\opencv_helloworld\opencv_helloworld\opencv_helloworld.cpp(69): fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add ‘#include «StdAfx.h»’ to your source?
    1>
    1>Build FAILED.
    подскажите куда копать, VC советует инклудить stdafx, после чего ошибок.

  3. Здравствуйте! А не подскажете как настроить выбор каналов видео? У меня 4-х канальный оцифровщик, и OpenCV и VideoInput видят только первый канал, а мне нужно чтобы все 4?

  4. Эта библиотека только под Windows? В Linux ее можно использовать? Стандартными средствами, в Linux, изменить частоту кадров не получается =(

    • Спасибо большое, очень внимаетльно просммотрел содержимое этого файла, но как Я понял это только класс для работы с этой библиотекой… примера так и не нашел.
      Попробовал своими силами его одолеть, но пока без результатно… может найдется у вас пример для работы с этой библиотекой?
      Ниже кидаю свой код(он не работает… такое чувство, что вылетает на инициализации т.к. ничего кроме консольного окна не наблюдаю):

      #define LINUX
      #define USE_V4L2_LIB
      #define USE_OPENCV
      
      #include <cv.h>
      #include <highgui.h>
      #include <stdlib.h>
      #include <stdio.h>
      #include "camera_v4l2.h"
      
      
      int main(int argc, char *argv[])
      {
          IplImage *pFrame;
          CameraV4L2 *pCapture;
          pCapture->init();
      
          cvNamedWindow("Test",CV_WINDOW_AUTOSIZE);
      
          while (1)
          {
              pFrame=pCapture->getFrame();
              cvShowImage("Test",pFrame);
              char key;
              key=cvWaitKey(33);
              if(key==27)
                  break;
      
          }
          cvReleaseImage(&pFrame);
          cvDestroyWindow("Test");
          return 0;
      }

  5. Здравствуйте, вопрос, конечно, дурацкий, но куда указывать пути к файлам? Указал по аналогии с opencv, вроде все работает, но VS жалуется.

    • Выдает ошибку:
      Ошибка LNK1112 тип компьютера модуля «X86» противоречит типу целевого компьютера «x64».
      Файл:
      c:\Users\User\documents\visual studio 2015\Projects\ConsoleApplication4\ConsoleApplication4\videoInput.lib(videoInput.obj) 1

      Погуглил, попробовал исправить, но все никак не уходит ошибка. Что делать?

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

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
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение