opencv használataszakaly/kie/data/opencv.pdf · ellenőrizzük le a működést #include //...

43
OpenCV használata Korszerű informatikai eszközök 2021 L03-as kurzus Szakály Norbert

Upload: others

Post on 23-Jan-2021

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

OpenCV használata

Korszerű informatikai eszközök 2021L03-as kurzus

Szakály Norbert

Page 2: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Pótlások

2. Pót 05.14. 10:15-11:45

1. Alternatív Pót 05.17. 12:15-13:45 (aki nem jelent meg a sima pót-on, de szeretne javítani)

2. Alternatív Pót 05.17. 14:15-15:45 (aki nem jelent meg a sima pót-on, de szeretne javítani)

1. PótPót 05.19. 10:15-11:45 (fizetős)

2. PótPót 05.19. 12:15-13:45 (fizetős)

A pótlásokra jelentkezni kell, hogy készüljek feladattal. A pótások felülírják a már megszerzett jegyet.

Page 3: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Open Source Computer Vision

Open Source Computer Vision Library: http://opencv.org

Képfeldolgozási API gyűjtemény

C++-ban készül az OpenCV2-től, de egyéb nyelveken is meghívható (pl.: python)

Előszeretettel használják gépi látási/képfeldolgozási feladatokra

Könnyen használható webkamerákkal, videókkal álló képekkel

Tartalmaz kamera kalibrációs eljárásokat

Számításra/futásidőre optimalizált algoritmusok

A számítások egy része futtathatók GPU-n is

Több objektumdetektálásra alkalmas mesterséges intelligencia eljárási is beépítésre került.

Page 4: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Telepítés

Letöltés: https://github.com/opencv/opencv/releases

Page 5: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Telepítés

Kicsomagolási könyvtár: C:\

Kicsomagolást követően lesz egy C:\opencv könyvtárunk

Page 6: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Telepítés

A C:\opencv\build\x64\vc15\bin elérési utat adjuk hozzá a Path-hoz!

Control panel -> System -> Advanced system settings

Ha elkészültünk, indítsuk újra a gépet!

Page 7: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Visual Stúdió beállítások

Készítsünk egy új konzol alkalmazást!

Állítsuk át a projektet 64 bitesre!

Project -> Properties…

Page 8: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Visual Stúdió beállítások

Adjuk hozzá az include könyvtárakhoz a c:\opencv\build\include könyvtárat!

Page 9: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Visual Stúdió beállítások

Adjuk hozzá a library könyvtárakhoz a c:\opencv\build\x64\vc15\lib könyvtárat!

Page 10: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Visual Stúdió beállítások

Debug módnál adjuk hozzá az összes modult tartalmazó opencv_world452d.lib fájlt!

Page 11: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Visual Stúdió beállítások

Release módnál adjuk hozzá az összes modult tartalmazó opencv_world452.lib fájlt!

Page 12: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Ellenőrizzük le a működést#include <opencv2/opencv.hpp> // minden opencv funkciót tartalmazó header

using namespace cv; // opencv névterülete

int main()

{

Mat kep = Mat::zeros(300, 600, CV_8UC3); // kép létrehozása

circle(kep, Point(250, 150), 100, Scalar(0, 255, 128), -100); // kör rajzolása

circle(kep, Point(350, 150), 100, Scalar(255, 255, 255), -100);// kör rajzolása

imshow("Display Window", kep); // megjelenítés

waitKey(0); // várakozás gombnyomásra

}

Page 13: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Kép beolvasása webkameráról#include <opencv2/opencv.hpp> // minden opencv funkciót tartalmazó header

using namespace cv; // opencv névterülete

int main()

{

Mat kep;

VideoCapture cap;

cap.open(0); //elsődleges kamera megnyitása

cap >> kep; //kép beolvasása

imshow("Display Window", kep); // megjelenítés

waitKey(0); // várakozás gombnyomásra

}

Page 14: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Kép beolvasása fájlból#include <opencv2/opencv.hpp> // minden opencv funkciót tartalmazó header

using namespace cv; // opencv névterülete

int main()

{

Mat kep;

kep = imread("c:\\opencv\\sources\\samples\\data\\Lena.jpg");

imshow("Display Window", kep); // megjelenítés

waitKey(0); // várakozás gombnyomásra

}

Page 15: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Szűrkére konvertálás#include <opencv2/opencv.hpp> // minden opencv funkciót tartalmazó header

using namespace cv; // opencv névterülete

int main()

{

Mat kep,gray;

kep = imread("c:\\opencv\\sources\\samples\\data\\Lena.jpg");

imshow("Display Window", kep); // megjelenítés

// szürkére konvertálás

cvtColor(kep, gray, COLOR_BGR2GRAY);

imshow("Gray Window", gray);

waitKey(0); // várakozás gombnyomásra

}

Page 16: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

HSV színtér

A hue-saturation-value színteret a képfeldolgozás kívánalmai érdekében hozták létre

Page 17: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

HSV színtérbe konvertálás#include <opencv2/opencv.hpp> // minden opencv funkciót tartalmazó header

using namespace cv; // opencv névterülete

int main()

{

Mat kep,gray,kep_HSV;

kep = imread("c:\\opencv\\sources\\samples\\data\\Lena.jpg");

imshow("Display Window", kep); // megjelenítés

// HSV színtérbe konvertálás

cvtColor(kep, kep_HSV, COLOR_BGR2HSV);

imshow("HSV Window", kep_HSV);

waitKey(0); // várakozás gombnyomásra

}

Page 18: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Szűrők - blur

A szűrés egy 2D-os konvolúció a képfeldolgozásban.

A konvolúciós kernel 3x3-as blur esetén:

A konvolúciós kernel 5x5-ös blur esetén:

1

25

1 1 1 1 11 1 1 1 11 1 1 1 11 1 1 1 11 1 1 1 1

1

9

1 1 11 1 11 1 1

Page 19: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Szűrők - blur#include <opencv2/opencv.hpp> // minden opencv funkciót tartalmazó header

using namespace cv; // opencv névterülete

int main()

{

Mat kep;

kep = imread("c:\\opencv\\sources\\samples\\data\\Lena.jpg");

imshow("Display Window", kep); // megjelenítés

// elmosás – 5x5-ös kernellel

blur(kep, kep, Size(5, 5));

imshow("Blur Window 5x5", kep);

waitKey(0); // várakozás gombnyomásra

}

Page 20: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Szűrők - blurEredeti blur 3x3-as kernel blur 5x5-ös kernel

Page 21: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

A Gauss szűrő képlete:

A konvolúciós kernelei:

Szűrők - GaussianBlur

Page 22: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Szűrők - GaussianBlur#include <opencv2/opencv.hpp> // minden opencv funkciót tartalmazó header

using namespace cv; // opencv névterülete

int main()

{

Mat kep;

kep = imread("c:\\opencv\\sources\\samples\\data\\Lena.jpg");

imshow("Display Window", kep); // megjelenítés

// Gauss szűrő 5x5

GaussianBlur(kep, kep, Size(5, 5),0);

imshow("GaussianBlur Window 5x5", kep);

waitKey(0); // várakozás gombnyomásra

}

Page 23: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Szűrők – Filter2D

Az élesítés kernele:

Page 24: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Szűrők – Filter2D#include <opencv2/opencv.hpp> // minden opencv funkciót tartalmazó header

using namespace cv; // opencv névterülete

int main()

{

Mat kep;

kep = imread("c:\\opencv\\sources\\samples\\data\\Lena.jpg");

imshow("Display Window", kep); // megjelenítés

// élesítés konvolúciós kernele

Mat kern = Mat::zeros(3, 3, CV_32F); //CV_32F ha float

kern.at<float>(0, 1) = -1; kern.at<float>(1, 0) = -1;

kern.at<float>(1, 2) = -1; kern.at<float>(2, 1) = -1;

kern.at<float>(1, 1) = 5;

filter2D(kep, kep, -1, kern);

imshow("Filter2D Window", kep);

waitKey(0); // várakozás gombnyomásra

}

Page 25: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Szűrők – Filter2D

Az éldetektáló kernele:

Page 26: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Szűrők – Filter2D#include <opencv2/opencv.hpp> // minden opencv funkciót tartalmazó header

using namespace cv; // opencv névterülete

int main()

{

Mat kep;

kep = imread("c:\\opencv\\sources\\samples\\data\\Lena.jpg");

imshow("Display Window", kep); // megjelenítés

// éldeteltáló konvolúciós kernel

Mat kern = Mat::zeros(3, 3, CV_32F); //CV_32F ha float

kern.at<float>(0, 1) = 1; kern.at<float>(1, 0) = 1;

kern.at<float>(1, 2) = 1; kern.at<float>(2, 1) = 1;

kern.at<float>(1, 1) = -4;

filter2D(kep, kep, -1, kern);

imshow("Filter2D Window", kep);

waitKey(0); // várakozás gombnyomásra

}

Page 27: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Éldetektálás – Canny#include <opencv2/opencv.hpp> // minden opencv funkciót tartalmazó header

using namespace cv; // opencv névterülete

int main()

{

Mat kep, gray;

kep = imread("c:\\opencv\\sources\\samples\\data\\Lena.jpg");

imshow("Display Window", kep); // megjelenítés

cvtColor(kep, gray, COLOR_BGR2GRAY);

// éldetektálás – szürke képen

Canny(gray, gray, 100, 200);

imshow("Canny Window", gray);

waitKey(0); // várakozás gombnyomásra

}

Page 28: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Feladat

Töltsük be a kupakok.jpg fájlt és jelenítsük meg!Mat kep, gray;kep = imread("kupakok.jpg");imshow("Display Window", kep);waitKey(0); // várakozás gombnyomásra

Page 29: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Feladat

Alakítsuk át szűrkeárnyalatúra!Mat kep, gray;kep = imread("kupakok.jpg");cvtColor(kep, gray, COLOR_BGR2GRAY);imshow("Gray Window", gray);waitKey(0); // várakozás gombnyomásra

Page 30: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Feladat

Kerestessük meg az éleket!Mat kep, gray;kep = imread("kupakok.jpg");cvtColor(kep, gray, COLOR_BGR2GRAY);Canny(gray, gray, 20, 100);imshow("Canny Window", gray);waitKey(0); // várakozás gombnyomásra

Page 31: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Feladat

Kerestessünk köröket!Mat kep, gray;kep = imread("kupakok.jpg");cvtColor(kep, gray, COLOR_BGR2GRAY);Canny(gray, gray, 20, 100);//kör keresése – szűrke képenvector<Vec3f> circles;HoughCircles(gray, circles, HOUGH_GRADIENT, 1,gray.rows / 10, // távolság egymástól100, 40, 10, 100); // min, max sugár

//körök kirajzolása a színes képrefor (size_t i = 0; i < circles.size(); i++){Vec3f c = circles[i];Point center = Point(c[0], c[1]);int radius = c[2];circle(kep, center, radius,

Scalar(255, 0, 255), 3,LINE_AA);}imshow("Detected circles", kep);waitKey(0); // várakozás gombnyomásra

Page 32: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Feladat

Számoljuk meg mennyi kupak látható a képen!

Mennyi kicsi? (sugár < 50)

Mennyi nagy? (sugár >= 50)

Számoljuk meg mennyi CocaCola-t

ittam a félév során?

(szűrjük ki a piros kupakokat!)

Page 33: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Maszkolások

A piros szín meghatározásához át kell konvertálni a színteret HSV-re!Mat kep_HSV;// HSV színrendszerbe konvertáláscvtColor(kep, kep_HSV, COLOR_BGR2HSV);imshow("HSV Window", kep_HSV);

Page 34: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Maszkolások

A pirosas színek 2 tartományban helyezkednek el, azért két maszkot használunk!// Piros szín kiszűrése két maszkkalMat mask1, mask2;

// HSV tartományai az opencvben – H [0..179], S [0..255], V [0..255]inRange(kep_HSV, cv::Scalar(0, 150, 70), cv::Scalar(10, 255, 255), mask1);inRange(kep_HSV, cv::Scalar(170, 120, 70), cv::Scalar(179, 255, 255), mask2);

imshow("mask1 Window", mask1);imshow("mask2 Window", mask2);

Page 35: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Maszkolások

A pirosas színek 2 tartományban helyezkednek el, azért két maszkot használunk!

Page 36: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Maszkolások

A két maszk eredője!//a két maszk összevonásaMat mask = mask1 + mask2;imshow("mask Window", mask);

Page 37: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Maszkolások

Az eredeti kép bitenkénti ÉS művelete a maszkkal!//eredeti összemaszkolásaMat red;bitwise_and(kep, kep, red, mask);imshow("Red Window", red);

Page 38: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Maszkolások

Maszk invertálása!//invertálás, ha ki akarjuk törölniMat inv_mask;bitwise_not(mask, inv_mask);imshow("inv_mask Window", inv_mask);

Page 39: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Maszkolások

Az eredeti kép bitenkénti ÉS művelete az invertált maszkkal!//piros terület törléseMat rem_red;bitwise_and(kep, kep, rem_red, inv_mask);imshow("Removed Red Window", rem_red);

Page 40: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Maszkolások

A maszk blur segítségével finomabb átmenetet ad!//a két maszk összevonásaMat mask = mask1 + mask2;imshow("mask Window", mask);

blur(mask, mask, Size(3, 3));imshow("blured mask Window", mask);

Page 41: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Feladat

A megtalált piros kupakokon futtassuk le az éldetektálást!

Page 42: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Feladat

Keressük meg a piros köröket és rajzoljuk be az eredeti képbe!

Page 43: OpenCV használataszakaly/kie/data/OpenCV.pdf · Ellenőrizzük le a működést #include  // minden opencv funkciót tartalmazó header using namespace

Jó vizsgaidőszakot kívánok!