opencv használataszakaly/kie/data/opencv.pdf · ellenőrizzük le a működést #include //...
TRANSCRIPT
OpenCV használata
Korszerű informatikai eszközök 2021L03-as kurzus
Szakály Norbert
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.
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.
Telepítés
Letöltés: https://github.com/opencv/opencv/releases
Telepítés
Kicsomagolási könyvtár: C:\
Kicsomagolást követően lesz egy C:\opencv könyvtárunk
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!
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…
Visual Stúdió beállítások
Adjuk hozzá az include könyvtárakhoz a c:\opencv\build\include könyvtárat!
Visual Stúdió beállítások
Adjuk hozzá a library könyvtárakhoz a c:\opencv\build\x64\vc15\lib könyvtárat!
Visual Stúdió beállítások
Debug módnál adjuk hozzá az összes modult tartalmazó opencv_world452d.lib fájlt!
Visual Stúdió beállítások
Release módnál adjuk hozzá az összes modult tartalmazó opencv_world452.lib fájlt!
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
}
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
}
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
}
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
}
HSV színtér
A hue-saturation-value színteret a képfeldolgozás kívánalmai érdekében hozták létre
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
}
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
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
}
Szűrők - blurEredeti blur 3x3-as kernel blur 5x5-ös kernel
A Gauss szűrő képlete:
A konvolúciós kernelei:
Szűrők - GaussianBlur
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
}
Szűrők – Filter2D
Az élesítés kernele:
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
}
Szűrők – Filter2D
Az éldetektáló kernele:
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
}
É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
}
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
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
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
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
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!)
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);
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);
Maszkolások
A pirosas színek 2 tartományban helyezkednek el, azért két maszkot használunk!
Maszkolások
A két maszk eredője!//a két maszk összevonásaMat mask = mask1 + mask2;imshow("mask Window", mask);
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);
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);
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);
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);
Feladat
A megtalált piros kupakokon futtassuk le az éldetektálást!
Feladat
Keressük meg a piros köröket és rajzoljuk be az eredeti képbe!
Jó vizsgaidőszakot kívánok!