7. OpenCV шаг за шагом. Захват видео с камеры


1. OpenCV шаг за шагом. Введение.
2. OpenCV шаг за шагом. Установка.
3. OpenCV шаг за шагом. Hello World.
4. OpenCV шаг за шагом. Загрузка картинки.
5. OpenCV шаг за шагом. Вывод видео
6. OpenCV шаг за шагом. Ползунок
7. OpenCV шаг за шагом. Захват видео с камеры

Работа с камерой почти ничем не отличается от работы с видео.
Просто вместо функции cvCreateFileCapture() нужно использовать функцию cvCreateCameraCapture(), которая в качестве параметра принимает не название файла, а идентификатор камеры.

Данная программа представляет собой удобную утилиту для работы с камерой.
Программа подключается и начинает захват с камеры с помощью cvCreateCameraCapture(), далее получает ширину и высоту кадра с помощью cvGetCaptureProperty(). А потом в цикле при помощи cvQueryFrame() получает картинку с камеры и выводит в окошко.
При нажатии клавиши ESC программа выйдет из цикла и завершится, а при нажатии клавиши Enter текущий кадр будет сохранён в файл ImageN.jpg, где N — номер кадра, начиная от 0 (Image0.jpg, Image1.jpg и т.д.)

#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
	// получаем любую подключённую камеру
	CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY); //cvCaptureFromCAM( 0 );
	assert( capture );

	//cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640);//1280); 
	//cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);//960); 

	// узнаем ширину и высоту кадра
	double width = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
	double height = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
	printf("[i] %.0f x %.0f\n", width, height );

	IplImage* frame=0;

	cvNamedWindow("capture", CV_WINDOW_AUTOSIZE);

	printf("[i] press Enter for capture image and Esc for quit!\n\n");

	int counter=0;
	char filename[512];

	while(true){
		// получаем кадр
		frame = cvQueryFrame( capture );

		// показываем
		cvShowImage("capture", frame);
	
		char c = cvWaitKey(33);
		if (c == 27) { // нажата ESC
			break;
		}
		else if(c == 13) { // Enter
			// сохраняем кадр в файл
			sprintf(filename, "Image%d.jpg", counter);
			printf("[i] capture... %s\n", filename);
			cvSaveImage(filename, frame);
			counter++;
		}
	}
	// освобождаем ресурсы
	cvReleaseCapture( &capture );
	cvDestroyWindow("capture");
	return 0;
}

Посмотрим результаты работы (камера – дешёвая USB Gembird 69U):

OpenCV v1.0 показывает и сохраняет картинку минимального разрешения камеры 320×240
Установить большее разрешение при помощи cvSetCaptureProperty() не даёт

А вот что выдаёт последняя стабильная версия OpenCV 2.1

у которой, кстати, сразу в комплекте идут скомпилированные lib-файлы C:\DevTools\OpenCV2.1\lib\ и которая завелась даже под VC++ 6.0
Установка аналогична 2.0 только теперь нужно линковать библиотеки
cxcore210.lib cv210.lib highgui210.lib cvaux210.lib


а теперь раскомментируем строчки

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640);//1280); 
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);//960); 


так же заработало и при 1280×960.
Однако, должен отметить, что не всегда удаётся установить нужное разрешение штатными средствами и приходится делать финт ушами.

новые функции:

#define cvCaptureFromCAM cvCreateCameraCapture

CVAPI(CvCapture*) cvCreateCameraCapture( int index );

— начинает захват с камеры

index — номер камеры в системе (состоит из суммы порядкового номера и т.н. домена)
0 — первая попавшаяся камера(можно использовать, если работает всего одна камера)
возможные домены:

#define CV_CAP_ANY      0     // autodetect
#define CV_CAP_MIL      100   // MIL proprietary drivers
#define CV_CAP_VFW      200   // platform native
#define CV_CAP_V4L      200
#define CV_CAP_V4L2     200
#define CV_CAP_FIREWARE 300   // IEEE 1394 drivers
#define CV_CAP_FIREWIRE 300
#define CV_CAP_IEEE1394 300
#define CV_CAP_DC1394   300
#define CV_CAP_CMU1394  300
#define CV_CAP_STEREO   400   // TYZX proprietary drivers
#define CV_CAP_TYZX     400
#define CV_TYZX_LEFT    400
#define CV_TYZX_RIGHT   401
#define CV_TYZX_COLOR   402
#define CV_TYZX_Z       403
#define CV_CAP_QT       500   // QuickTime
#define CV_CAP_UNICAP   600   // Unicap drivers
#define CV_CAP_DSHOW    700   // DirectShow (via videoInput)
CVAPI(int) cvSaveImage( const char* filename, const CvArr* image, const int* params CV_DEFAULT(0) );

— сохраняет изображение в файл
filename — имя файла
image — изображение для сохранения

при успешном сохранении функция вернёт 1, а при неудаче — 0.

Далее: 8. OpenCV шаг за шагом. Запись видео

Дополнительно:
24. Работа с камерой через библиотеку videoInput
OpenCV и работа с видео


58 комментариев на «“7. OpenCV шаг за шагом. Захват видео с камеры”»

  1. Скопировал пример один к одному. Все скомпилировалось, программа запускается, но выдает разрешение 0*0 и серый квадрат.
    Камера в других приложения (проводник, VLC) нормально работает.
    В чем может быть дело?

    • версия OpenCV?
      какая камера?
      пробовали изменить разрешение/ не изменять разрешения (оставить дефолтным)?

    • OpenCV 2.2.0, ОС Windows, VC++ 2005 Express Edition.
      Библиотеки скомпилировались без ошибок, сделал все уроки со 2-го по 23-й, все работает, кроме захвата с камеры.
      Камера в китайском телефоне, подключается телефон по USB, работает во всех приложениях без драйверов.
      Пробовал не указывать разрешение, 320*240, 540*480.
      Результат — серый квадрат, а в консоли информация о разрешении 0*0.

    • похоже проблема именно в доступе к камере — попробуйте использовать библиотеку videoInput

    • Была та же проблема. Помогает videoInput. И еще у меня заработало после включения программы WebcamMax. Кто-нибудь знает как работает эта программа?

    • OpenCV 2.2, Windows, Code::Blocks.
      Телефон от philips в качестве вебкамеры.
      Пробывал менять — всё равно серый экран и выдаёт в качестве разрешения 0*0.

    • как видите — у вас с Upryamyj-м и камеры чем-то похожи, так что похоже проблема именно в доступе к камере — попробуйте использовать библиотеку videoInput

    • У меня камера нормальная, также разрешение 0 на 0 если использовать cvCreateCameraCapture, но videoinput к счастью помогла 🙂

    • верно — в линуксе коды клавиш отличаются 🙂

  2. Уважаемый Господин! Возник у меня вопрос вот я сейчас пробежался и дошел увидел как раз урок — то что мне надо, это захват изображения с камеры, попробывал не работает, хотя камера не с телефона нормальная 720p, Посмотрел библиотеку videoInput и вопрос смогу ли я захватив камеры с этой библиотекой сохранить его в файл, и смогу ля я к этому захваченному изображению применять функции из OpenCV прям то есть находу, а не открывая сохраненный видеофайл заново Я нуб в этом деле) Спасибо за Help))))

    • да. там же в исходнике есть комментарий:

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

      так что в image уже хранится данные захваченной картинки и к ней можно применять средства OpenCV.

  3. Не могу сделать захват со второй камеры. Opencv 2.2 win QtSDK 4.7.4
    cvCreateCameraCapture -индексам <0…10, 10…99, 200…299 всегда соответствует захват 1 камеры, остальные возвращает нулевыми
    Обе камеры определяются как видеоустройства 1 и 2. Штатными средствами ОС можно с них получить картинку.
    В faq ocv видел ссылки на модуль cvcam с инструментарием для выбора камеры, но, похоже из текущих версий библиотеки его убрали.
    Вообще стоит задача получения синхронных снимков с нескольких камер.

    • к сожалению, пока руки никак не дойдут поработать со стереозрением, хотя в планах это и есть (для начала, хотя бы купить две одинаковых камеры :)))
      Для конкретных задач, похоже, лучше всё же использовать не штатный захват OpenCV, а кастомные решения.
      Например, под Windows — можно попробовать библиотеку videoInput, а под Linux — libv4l2cam.

    • нет. с картинкой frame, получаемой от cvQueryFrame() ничего делать не нужно.

    • Спасибо за быстрый ответ и ссылочку!
      Однако вопросы ещё имеются.
      1. Нельзя ли для работы с IP-камерой использовать возможности только самой OpenCV?
      Работать-то с USB-камерами в OpenCV очень просто: в одной строке захватил камеру, в другой — считал кадр, в третьей — показал его. Хочется такого же комфорта и с IP-камерой.
      2. Ваш вариант работает только с MJPEG, а как работать с MPEG-4, H.264, наконец, просто JPEG?
      3. Как всё это организовать на чистом Си (без "++")?

    • если OpenCV собран с поддержкой FFmpeg и ffmpeg позволяет работать, то должен подхватить 😉
      т.е. будет достаточно сделать стандартный

      cv::VideoCapture vcap;
      
          // This works on a D-Link CDS-932L
          const std::string videoStreamAddress = "http://<username:password>@<ip_address>/video.cgi?.mjpg";
      
          //open the video stream and make sure it's opened
          if(!vcap.open(videoStreamAddress)) {
              std::cout << "Error opening video stream" << std::endl;
              return -1;
          }
      
    • Спасибо за быстрый ответ!

      Как узнать, собран OpenCV с поддержкой FFmpeg или нет?

      Я имею ввиду вариант, когда OpenCV не собирается из исходников (CMake и всё такое), а используется «из коробки». Интересуют последние, на текущий момент, версии OpenCV: 2.4.3… 2.4.5.

  4. Добрый вечер! Столкнулся с проблемой: Скопировал пример, все работает, НО! изображение идет с ТВ-тюнера! Кто-нибудь сталкивался с подобным? Какой параметр cvCreateCameraCapture( int index ) указать для обычной веб-камеры? Как в программе указать, с какой камерой (устройством видеозахвата) нужно работать?

    • Перечитал форум, разобрался)))
      CvCapture* capture = cvCaptureFromCAM( 1 );

  5. Ребят, нужна помощь. Хочу эту программу совместить с программой для подсчета и определения доминирующих цветов в изображении. Нужно чтобы камера по нажатию кнопки фотографировала и определяла доминирующие цвета в полученном изображении. Как это правильно сделать? Вот ссылка на прогу, определяющую доминирующие цвета robocraft.ru/blog/computervision/1063.html

  6. Здравствуйте.
    Как у некоторых выше, и я получил черный экран. Вебка USB, дрова винда сама поставила. Библиотеку videoInput мне не удалось прикрутить к Eclipse Kepler + MinGW 4.8.1 + OpenCV 3.1.0. Но пример с этой страницы успешно заработал. Подскажите пожалуйста как теперь мне например воспользоватся функцией cvSmooth тоесть как из переменной типа «Mat» взять данные типа «IplImage». Я Си++ почти незнаю, только начал изучать, а попробовать хочется.

    • Привет!
      Если используется интерфейс C++, то и функции логичнее использовать С++-ые, которые работают с cv::Mat.
      Хотя cvSmooth() считается устаревшей и вместо неё рекомендуется использовать: GaussianBlur(), blur(), medianBlur()

      Преобразовать cv::Mat в IplImage можно при помощи оператора IplImage.

    • Можно примерчик с этим оператором. После Си не совсем въеду как им пользоватся.

    • Можно примерчик с этим оператором. После Си не совсем въеду как им пользоватся. функцию взял для примера, ведь во всех мануалах подобные функции. Не подскажите где почитать на русском по поводу устаревших и их рекомендуемой замены? Цель как и у многих — научится распознавать предметы, попутно изучая Си++.

    • // To pass the new matrices to the functions that only work with IplImage or CvMat do:
      // step 1) Convert the headers (tip: data will not be copied).
      // step 2) call the function   (tip: to pass a pointer do not forget unary "&" to form pointers)
      cv::Mat mat_img;
      IplImage ipl_img = mat_img;
      

      // преобразование IplImage в cv::Mat
      // и обратно
      IplImage ipl_img;
      cv::Mat mat_img(ipl_img);
      

      Про устаревшие и замену — только в документации.

    • Не выходит чет у меня:

      VideoCapture cap(CAP_ANY); // открыть доступную камеру
       if (!cap.isOpened())  // проверить открылась ли
            return -1;
      
      Mat frame;
      namedWindow("original", WINDOW_AUTOSIZE);
      
      cap >> frame; // получаем очередной кадр
      
      imshow("original", frame); // выводим кадр в окно
      
      IplImage* image = 0;
      cvNamedWindow("test", WINDOW_AUTOSIZE);
      
      // как сделать чтоб в image попал этот же кадр и например вывести его в другое окошко функцией ниже (либо использовать любую другую функцию)
      // что я не делал либо проблемы при компиляции либо открывается окошко и "программа завершила свою работу, поиск решений бла-бла"
      
      cvShowImage("test", image);
      
      

      P.S нужно ли специально освобождать память как в здешних мануалах, в примере с VideoCapture сказано чтото про автоматически освободится или я не так понял.

    • С первым разобрался, огромное спасибо за помощь. Кому интересно надо было сделать так:

      IplImage image;
      image = IplImage(frame);
      cvShowImage("test", &image);
      

      Второй вопрос остается в силе.

  7. Здравствуйте! Сделал все как указано в уроке, но при запуске программы получаю черное окошко, в котором по идее должно отображаться изображение с вебки. Вебка при этом включается, но изображение не выводится, только черный квадрат. Как это можно решить?
    Visual Studio 2015, OpenCV 3.1.0

    • Не очень разобрался, с тем как с этим работать, не могли бы описать действия?

    • Суть еще в том, что, если данный код закомпилить на 2012 студии то проблем не возникает, но хотелось бы разобраться в чем проблема в 15 студии и как это можно решить

  8. Все запускаю на установленной Visual Studio 2017, opencv запускаю через Cmake. При запуске в верхнем левом углу все как надо написано(В главном окне программы), Opencv — Visual Studio. Но при запуске кода вылазеют вот такие ошибки.

    Серьезность Код Описание Проект Файл Строка Состояние подавления
    Ошибка (активно) E1696 не удается открыть источник файл «cv.h» ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 1
    Ошибка (активно) E1696 не удается открыть источник файл «highgui.h» ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 2
    Ошибка (активно) E0020 идентификатор «CvCapture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9
    Ошибка (активно) E0020 идентификатор «capture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9
    Ошибка (активно) E0020 идентификатор «cvCreateCameraCapture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9
    Ошибка (активно) E0020 идентификатор «CV_CAP_ANY» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9
    Ошибка (активно) E0020 идентификатор «cvCaptureFromCAM» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 10
    Ошибка (активно) E0020 идентификатор «assert» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 11
    Ошибка (активно) E0020 идентификатор «ширину» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 17
    Ошибка (активно) E0065 требуется точка с запятой ";" ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 19
    Ошибка (активно) E0020 идентификатор «cvGetCaptureProperty» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 24
    Ошибка (активно) E0020 идентификатор «CV_CAP_PROP_FRAME_HEIGHT» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 24
    Ошибка (активно) E0020 идентификатор «width» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 25
    Ошибка (активно) E0020 идентификатор «IplImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 27
    Ошибка (активно) E0020 идентификатор «frame» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 27
    Ошибка (активно) E0020 идентификатор «cvNamedWindow» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 29
    Ошибка (активно) E0020 идентификатор «CV_WINDOW_AUTOSIZE» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 29
    Ошибка (активно) E0020 идентификатор «cvQueryFrame» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 40
    Ошибка (активно) E0020 идентификатор «cvShowImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 43
    Ошибка (активно) E0020 идентификатор «cvWaitKey» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 45
    Ошибка (активно) E0020 идентификатор «кадр» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 51
    Ошибка (активно) E0065 требуется точка с запятой ";" ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 53
    Ошибка (активно) E0020 идентификатор «cvSaveImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 56
    Ошибка (активно) E0029 требуется выражение ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 57
    Ошибка (активно) E0020 идентификатор «ресурсы» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 61
    Ошибка (активно) E0020 идентификатор «cvDestroyWindow» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 63
    Ошибка C1010 непредвиденный конец файла во время поиска предкомпилированного заголовка. Возможно, вы забыли добавить директиву "#include «stdafx.h»" в источник. ConsoleApplication3 c:\users\user\source\repos\consoleapplication3\consoleapplication3\consoleapplication3.cpp 66

    • Проверьте — прописаны ли пути до заголовочных файлов OpenCV в настройках проекта.

      #include "opencv2/highgui.hpp"
      #include "opencv2/imgproc.hpp"
      

      см. videocapture_basic.cpp

  9. Ошибка по отсутствию файлов cv.h,highgui.h и т.д, ушла.

    Остались ошибки, отсутствия индентификаторов:

    Ошибка (активно) E0020 идентификатор «CvCapture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9
    Ошибка (активно) E0020 идентификатор «capture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9
    Ошибка (активно) E0020 идентификатор «cvCreateCameraCapture» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9
    Ошибка (активно) E0020 идентификатор «CV_CAP_ANY» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 9
    Ошибка (активно) E0020 идентификатор «cvCaptureFromCAM» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 10
    Ошибка (активно) E0020 идентификатор «assert» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 11
    Ошибка (активно) E0020 идентификатор «ширину» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 17
    Ошибка (активно) E0065 требуется точка с запятой ";" ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 19
    Ошибка (активно) E0020 идентификатор «cvGetCaptureProperty» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 24
    Ошибка (активно) E0020 идентификатор «CV_CAP_PROP_FRAME_HEIGHT» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 24
    Ошибка (активно) E0020 идентификатор «width» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 25
    Ошибка (активно) E0020 идентификатор «IplImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 27
    Ошибка (активно) E0020 идентификатор «frame» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 27
    Ошибка (активно) E0020 идентификатор «cvNamedWindow» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 29
    Ошибка (активно) E0020 идентификатор «CV_WINDOW_AUTOSIZE» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 29
    Ошибка (активно) E0020 идентификатор «cvQueryFrame» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 40
    Ошибка (активно) E0020 идентификатор «cvShowImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 43
    Ошибка (активно) E0020 идентификатор «cvWaitKey» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 45
    Ошибка (активно) E0020 идентификатор «кадр» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 51
    Ошибка (активно) E0065 требуется точка с запятой ";" ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 53
    Ошибка (активно) E0020 идентификатор «cvSaveImage» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 56
    Ошибка (активно) E0029 требуется выражение ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 57
    Ошибка (активно) E0020 идентификатор «ресурсы» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 61
    Ошибка (активно) E0020 идентификатор «cvDestroyWindow» не определен ConsoleApplication3 c:\Users\User\source\repos\ConsoleApplication3\ConsoleApplication3\ConsoleApplication3.cpp 63

  10. Выше описанные ошибки исправил. Вот новые, как исправить?
    Серьезность Код Описание Проект Файл Строка Состояние подавления
    Ошибка C4996 ‘cv::flann::Index_’: was declared deprecated ConsoleApplication2 c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt\opencv2\flann\flann.hpp 233
    Ошибка C2857 ‘#include’ statement specified with the /Ycstdafx.h,stdafx.hpp command-line option was not found in the source file ConsoleApplication2 c:\users\user\documents\visual studio 2015\projects\consoleapplication2\consoleapplication2\stdafx.cpp 9

  11. Вторую исправил, осталась первая. Вот, часть кода из класса flann.hpp, который вызывает ошибку, ошибка на странице с функцией public.

    /**
    * @deprecated Use GenericIndex class instead
    */
    template class FLANN_DEPRECATED Index_ {
    public:
    typedef typename L2::ElementType ElementType;
    typedef typename L2::ResultType DistanceType;

    Index_(const Mat& features, const ::cvflann::IndexParams& params);

    ~Index_();

    void knnSearch(const vector& query, vector& indices, vector& dists, int knn, const ::cvflann::SearchParams& params);
    void knnSearch(const Mat& queries, Mat& indices, Mat& dists, int knn, const ::cvflann::SearchParams& params);

    int radiusSearch(const vector& query, vector& indices, vector& dists, DistanceType radius, const ::cvflann::SearchParams& params);
    int radiusSearch(const Mat& query, Mat& indices, Mat& dists, DistanceType radius, const ::cvflann::SearchParams& params);

    void save(std::string filename)
    {

  12. Все исправилось, предьидущая ошибка исправилась, выключением precompiled filters в разделе input, опций. Предпредидущая ошибка исправилась, копированием класов *.h из opencv, в непосредственно директории по умолчанию include directories в VC++ Directories. И все запустилось уже с флагом success, но свмо уже приложение, появилось на уровне cmd и пишет: Необработанное исключение по адресу 0x7789D4C2 (ntdll.dll) в ConsoleApplication3.exe: 0xC000007B: Программа "%hs" не предназначена для выполнения в Windows или содержит ошибку. Попробуйте установить программу еще раз с исходного установочного носителя либо обратитесь к системному администратору или поставщику программного обеспечения за поддержкой. Состояние ошибки 0x.
    При отладке добавляет, вот это: Необработанное исключение по адресу 0x77849510 (ntdll.dll) в ConsoleApplication3.exe: Код инструментирования VTGuard обнаружил попытку использования недопустимой таблицы виртуальных функций.

    Вызвано исключение по адресу 0x00000030 в ConsoleApplication3.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x00000030.

  13. Вот, дезасамблированный код, на 7 строке он указывает, что там ошибка. 77AED4B2 jne string L"\??\%C:"+4944Ch (77AED4BCh)
    77AED4B4 push esi
    77AED4B5 push 0FFFFFFFFh
    77AED4B7 call _NtTerminateProcess@8 (77A8C5B0h)
    77AED4BC push esi
    77AED4BD call _RtlRaiseStatus@4 (77A907A0h)
    77AED4C2 mov eax,dword ptr fs:[00000018h]
    77AED4C8 test byte ptr [eax+0FCAh],20h
    77AED4CF jne LdrShutdownThread+0FFFFFC91h (77A72A01h)
    77AED4D5 xor esi,esi
    77AED4D7 jmp LdrShutdownThread+0FFFFFDA7h (77A72B17h)

    В логе по статусу дебагинга кода флаг success стоит.

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

    Один кадр я беру так:

    Mat frame;
    
    capture.read(frame);
    

    Как мне скопировать этот кадр и дальше обрабатывать его независимо?

    Mat frame_2;
    
    frame_2 = frame;
    

    вот так не работает, вернее работает но нарисованое на frame попадает в frame_2.

  15. если у вас черное окно попробуйте так.

    #include <opencv2/opencv.hpp>
    #include<iostream>
    #include <stdlib.h>
    #include <stdio.h>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    	VideoCapture cap(0); //открыть камеру по-умолчанию
    
    	if (cap.isOpened() == false) {
    		cout << "Cannot open the video camera" << endl;
    		cin.get();
    		return -1;
    	}
    
    	double w = cap.get(CV_CAP_PROP_FRAME_WIDTH); //получить ширину кадра
    	double h = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //получить высоту кадра
    
    	cout << "Resolution of the video : " << w << " x " << h << endl;
    
    	string window_name = "My Camera Feed";
    	namedWindow(window_name);
    
    	while (true) {
    		Mat frame;
    		bool success = cap.read(frame); // читаем кадр
    		if (success == false) {
    			cout << "Video camera is disconnected" << endl;
    			cin.get();
    			break;
    		}
    
    		imshow(window_name, frame); // показать кадр
    
    		if (waitKey(10) == 27) {
    			cout << "Esc key is pressed by user. Stoppig the video" << endl;
    			break;
    		}
    	}
    
    	return 0;
    }

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

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