Введение в OpenCV программирование на C++ (Introduction to OpenCV C++ programming)

Автор: | 12.10.2018

Инсталляция  OpenCV
Выделение контуров на изображении
Выделение лица на изображении
Захват видеопотока с камеры и выделение контуров
Полезные ссылки

 

OpenCV (англ. Open Source Computer Vision Library, библиотека компьютерного зрения с открытым исходным кодом) — библиотека алгоритмов компьютерного зренияобработки изображений и численных алгоритмов общего назначения с открытым кодом.

Инсталляция  OpenCV

Загружаю OpenCV-3.4.3-vc14-vc15 для Windows (у меня на компьютере Windows 10)

Тестирование OpenCV проводил  для  Visual Studio 2015, которая на тот момент была установлена у меня на компьютере. Возможна ли работа OpenCV 3.4.3-vc14-vc15 с другими версиями Visual Studio утверждать не берусь, смущают суффиксы в названии OpenCV 3.4.3-vc14-vc15 .

Распаковываю OpenCV в корень диска С. Для этого запускается  файл OpenCV-3.4.3_vc14_vc15.exe и указывается директория.

Перед запуском 3.4.3_vc14_vc15.exe директорию opencv создавать не нужно. Она создается автоматически при распаковке.

Выполняю настройки в Windows. Выхожу на окно «Изменить переменную среды» (в Windows 10 — кнопки Windows->Служебные->Панель управления -> Система и безопасность -> Система -> Дополнительные параметры системы -> Переменные среды -> Path ->Изменить).  В этом окне  создаю переменную C:\opencv\build\x64\vc14\bin. Перезагружаю Windows.

Запускаю Visual Studio и создаю проект консольного приложения: File -> New -> Project -> Visual C++  -> Win32 -> Win32 Consol Application  -> Next -> Empty Project -> Finish.

Устанавливаю платформу к x64:

Добавляю в проект файл main.cpp , пока  ничего в него не записываю.

Выполняю Right click на имени проекта в окне Solution Explorer и в контекстном меню перехожу к  вкладке “Properties”.

В открывшемся окне «Property Pages» выполняю действия:

  • C/C++ -> General -> Additional Include Directories -> C:\opencv\build\include
  • Linker -> General -> Additional Library Directories -> C:\opencv\build\x64\vc14\lib  
  • Linker -> Input -> Additional Dependencies -> opencv_world343.lib;opencv_world343d.lib;

Обратите внимание, что цифры в имени файлов opencv_world343.lib и opencv_world343d.lib  соответствуют цифрам в имени версии  OpenCV 3.4.3-vc14-vc15.  Например, для версии OpenCV 3.4.1-vc14-vc15 нужно ссылаться в установках проекта уже на файлы opencv_world341.lib и opencv_world341d.lib.

Копирую и вставляю код в файл main.cpp

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
 Mat img(Mat::zeros(300, 300, CV_8U));
 imshow("window", img);
 waitKey();
 return 0;
}

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

Выделение контуров на изображении

Программа выделяет контуры на изображении методом Canny (Canny Edge Detection).

Для запуска приложения необходимо поместить файл lena.jpg (скачать lena.zip) в директорию проекта, где находится исходный файл (main.cpp).

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

using namespace cv;
using namespace std;

int main()
{
 Mat src1;
 src1 = imread("lena.jpg", CV_LOAD_IMAGE_COLOR);
 namedWindow("Original image", CV_WINDOW_AUTOSIZE);
 imshow("Original image", src1);

Mat gray, edge, draw;
 cvtColor(src1, gray, CV_BGR2GRAY);

Canny(gray, edge, 50, 150, 3);

edge.convertTo(draw, CV_8U);
 namedWindow("image", CV_WINDOW_AUTOSIZE);
 imshow("image", draw);

waitKey(0);
 return 0;
}

Выделение лица на изображении

Программа выделяет лицо на изображении, используя классификатор Haar-Cascade.

Для запуска приложения необходимо поместить файл изображения lena.jpg (lena.zip) и файл каскада  haarcascade_frontalface_alt2.xml  в директорию проекта, где находится исходный файл (main.cpp).  Файлы каскадов находятся в директории   c:\opencv\build\etc\…

При запуске программа выдавала ошибку, если в установках проекта было Debug. Поменял на Release, запуск успешный.

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
 Mat image;
 image = imread("lena.jpg", CV_LOAD_IMAGE_COLOR);
 namedWindow("window1", 1); imshow("window1", image);

// Load Face cascade (.xml file)
 CascadeClassifier face_cascade;
 face_cascade.load("haarcascade_frontalface_alt2.xml");

// Detect faces
 std::vector<Rect> faces;
 face_cascade.detectMultiScale(image, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));

// Draw circles on the detected faces
 for (int i = 0; i < faces.size(); i++)
 {
 Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);
 ellipse(image, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
 }
 imshow("Detected Face", image);

waitKey(0);
 return 0;
}

Захват видеопотока с камеры и выделение контуров

Для кода ниже требуется веб-камера, подключенная к компьютеру, она захватывает изображение с камеры. Изображение подвергается обработке — выделяются контуры методом Canny

 

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
 Mat img;
 VideoCapture cap(0);
while (true)
 {
 cap >> img;
Mat edges;
 cvtColor(img, edges, CV_BGR2GRAY);
Canny(edges, edges, 30, 60);
imshow("window label", edges);
 waitKey(1);
 }
return 0;
}

 

 

Полезные ссылки

OpenCV шаг за шагом

 

 

 

Автор: Николай Свирневский