Введение в OpenCV программирование на C++

Автор: | 12.10.2018

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

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

Ниже описаны шаги по инсталляции OpenCV, а также проблемы, которые возникали у меня при инсталляции, и пути по их устранению.

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

Первоначально загрузил версию OpenCV 3.4.1-vc14-vc15  с официального сайта. Однако, после инсталляции возникли проблемы с запуском тестового примера, система выдавала ошибку: cannot open file ‘opencv_world341 .lib’. Потратил много времени на поиски решения по ее устранению. В конце концов скачал и инсталлировал  версию  OpenCV 3.4.3-vc14-vc15. Проблем с этой версией не возникало.

Тестирование 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 и указывается директория.

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

Выполняю настройки в Windows. Выхожу на окно «Переменные среды» (в Windows 10 — кнопки Windows->Служебные->Панель управления -> Система и безопасность -> Система -> Дополнительные параметры системы -> Переменные среды):

Здесь сначала создаю новую переменную OPENCV_DIR на путь C:\opencv\build\x64\vc14\. Затем выполняю click  на переменную Path и добавляю в нее путь к директории bin опосредовано через новую переменную: %OPENCV_DIR%\bin. После этого в переменной Path отобразится полный путь к директории bin.

Очевидно, можно было обойтись и без создания новой переменной OPENCV_DIR. Тогда необходимо прописывать полный путь неопосредовано в переменной Path, а позднее —  в установках проекта приложения.

Перезагружаю 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   либо  $(OPENCV_DIR)\..\..\include
  • Linker -> General -> Additional Library Directories -> C:\opencv\build\x64\vc14\lib  либо    $(OPENCV_DIR)\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  (скачать haarcascade_frontalface_alt2.zip ) в директорию проекта, где находится исходный файл (main.cpp).

При запуске программа выдавала ошибку, если в установках проекта было 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;
}

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

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

 

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
 // Load Face cascade (.xml file)
 CascadeClassifier face_cascade;
 face_cascade.load("haarcascade_frontalface_alt2.xml");

Mat img;
 VideoCapture cap(0);
 while (true)
 {
 cap >> img;

//cvtColor(img, img, CV_BGR2GRAY);

// Detect faces
 std::vector<Rect> faces;
 face_cascade.detectMultiScale(img, 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(img, 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", img);
 waitKey(1);
 }
 return 0;
}

 

 

 

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *