Вы находитесь на странице: 1из 18

Ââåäåíèå â OpenCV

Øîêóðîâ Àíòîí Â.

shokurov.anton.v@yandex.ru

http://ìàøèííîåçðåíèå.ðô

17 ñåíòÿáðÿ 2018 ã.

Âåðñèÿ: 0.12

Àííîòàöèÿ
 äàííîé çàìåòêå íà÷íåòñÿ òâîå çíàêîìñòâî ñ áèáëèîòåêîé opencv.
Öåëü: Ôîðìèðîâàíèå ðàñòðîâûõ èçîáðàæåíèé. Ðèñîâàíèå êðèâûõ, â ÷àñò-
íîñòè, òåêñòà íà èçîáðàæåíèÿõ (êàðòèíêàõ). Èçìåíåíèå ÿðêîñòè, êîíòðàñòà
è öâåòîâîãî ïðîñòðàíñòâà (ïðåäñòàâëåíèÿ) èçîáðàæåíèé.

1 Ââåäåíèå
 äàííîé çàìåòêå áóäåò ïîêàçàíî êàê ôîðìèðîâàòü èçîáðàæåíèÿ, ïóòåì ðèñîâà-
íèÿ, â ÷àñòíîñòè, èçìåíÿòü ñóùåñòâóþùèå èçîáðàæåíèÿ. Òàêæå áóäåò ïðîèëëþ-
ñòðèðîâàíî êàê ââîäèòü/ñ÷èòûâàòü èçîáðàæåíèÿ, íàêëàäûâàòü èçîáðàæåíèÿ ðóã
íà äðóãà. Âûïîëíÿòü îòðèñîâêó ëèíèé, îêðóæíîñòåé è òåêñòà. Èçìåíÿòü ÿðîêñòü,
êîíòðàñò è öâåòîâîå ïðîñòðàíñòâî.

1.1 Ïåðâàÿ ïðîãðàììà

Äàëåå ïîêàçàíî êàê ñîçäàòü èçîáðàæåíèå ñ ôðàçîé ïðèâåòñâóþùåé ìèð.

Ñîçäàíèå è ïîêàç èçîáðàæåíèÿ Íà÷íåì ñ ïåðâîé ïðîãðàììû, êîòîðàÿ ñîçäà-


åò èçîáðàæåíèå ðàçìåðà 500 íà 400, ò.å. 500 ïèêñåëîâ â øèðèíó è 400 â âûñîòó è,
êàê àíàëîã ïðè èçó÷åíèè ÿçûêîâ ïðîãðàìèðîâàíèÿ, âûâîäèò íà íåì ñîîòâåòñóþ-
ùóþ òðàäèöèîííóþ ôðàçó  ïðèâåòñòâèå â ìèðó:

1 #include <o p e n c v 2 / c o r e / c o r e . hpp>


2 #include <o p e n c v 2 / h i g h g u i / h i g h g u i . hpp>

1
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

3 #include <s t r i n g >


4
5 using namespace cv ;
6 using namespace std ;
7
8 int main ( )
9 {
10 5 0 0 , CV_8UC3 ) ; //Ñîçäàíèå èçîáðàæåíèÿ
Mat img ( 4 0 0 ,
11 //èìåþùåå ðàçìåð 500 â øèðèíó íà 400 â âûñîòó.
12
13 //Äëÿ óäîáñòâà, àðãóìåíòû âûçûâàåìîé ôóíêöèè:
14 s t r i n g t e x t = " H e l l o World ! " ; //Öåëåâàÿ ôðàçà.
15 P o i n t t e x t O r g ( 1 0 0 , img . r o w s / 2 ) ; //Ìåñòîïîëîæåíèå.
16 int f o n t F a c e = FONT_HERSHEY_SCRIPT_SIMPLEX ; //Ôîíò.
17 double f o n t S c a l e = 2 ; //Åãî ìàñøòàá, ðàçìåð.
18 S c a l a r c o l o r ( 2 0 0 , 1 0 0 , 5 0 ) ; //Öâåò òåêñòà.
19
20 //Äàëåå âûïîëíÿåòñÿ îòðèñîâêà ôðàçû èç ïåðåìåííîé
21 // text â èçîáðàæåíèå img â ïîëîæåíèå textOrg.
22 //Ôîíò/ãàðíèòóðà çàäàåòñÿ ñëåäóþùèìè ïåðåìåííûìè:
23 // fontFace , fontScale , thickness .
24 p u t T e x t ( img , text , textOrg , fontFace , fontScale ,
25 color );
26
27 imshow ( "My World " , img );
28 waitKey ( 0 ) ;
29 return 0;
30 }

Ðàññìîòðèì äàëåå áîëåå äåòàëüíî äàííûé êîä.

Çàãîëîâî÷íûå ôàéëû Ñòðî÷êà 1 ðàíåå ïðèâåäåííîé ïðîãðàììû ññûëàåòñÿ íà


çàãîëîâî÷íûé ôàéë core.hpp, îòâå÷àþùèé çà áàçîâûé íàáîð ôóíêöèé ïðåäîñòàâ-
ëÿåìûé áèáëèîòåêîé OpenCV, à ñòðî÷êà 2  íà highgui.hpp, ñîäåðæàùèé ôóíêöèè
äëÿ âçàèìîäåéñòâèÿ ñ ãðàôè÷åñêèì äâèæêîì îïåðàöèîííîé ñèñòåìû: ñ÷èòûâàíèå
è çàïèñü ãðàôè÷åñêèõ ôàéëîâ, à òàêæå âçàèìîäåéñòâèå ñ ãðàôè÷åñêèì îêîííûì
èíòåðôåéñîì.
Ôóíêöèîíàëüíîñòü ïðîãðàìì äîïîëíÿåòñÿ ñîòîððíèìè ôóíêöèÿìè èç çðóãèõ
áèáëèîòåê. Áèáëèîòåêè îïðåäåëÿþòñÿ ñâîèìè çàãîëîâî÷íûìè ôàéëàìè. Ê íàèáî-
ëåå âàæíûì â îïåíñâ ñëåäóåò îòíåñòè ñëåäóþùèå:

Ñòðàíèöà 2
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

• opencv2/core/core.hpp  îïðåäåëÿåò êàê áàçîâûå îáúåêòû (íàïðèìåð, êëàñ-


ñû) áèáëèîòåêè OpenCV: èçîáðàæåíèå, öâåò è äð, òàê è ôóíêöèè: ïðåîáðà-
çîâàíèå ñàìèõ èçîáðàæåíèé è èõ öâåòîâ;

• opencv2/highgui/highgui.hpp  îïðåäåëÿåò êðîññ-ïëàòôîðìåííûå ôóíêöèè


âçàèìîäåéñòâèÿ ñ îêîííîé ñèñòåìîé;

• opencv2/imgproc/imgproc.hpp  îïðåäåëÿåò îñíîâíûå/òðàäèöèîííûå ôóíê-


öèè öèôðîâîé îáðàáîòêè èçîáðàæåíèé: îòðèñîâêà êðèâûõ è òîìó ïîäîáíîå.

Âåñü êîä, â ÷àñòíîñòè, óïîìÿíóòûé ïîñëåäíèì ïðåäïîëàãàåò êðîññ-ïëàòôîð-


ìåííîñòü, ò.å. âîçìîæíîñòü ñáîðêè ïîä ðàçíûìè îïåðàöèîííûìè ñèñòåìàìè è, ñî-
îòâåòñòâåííî, èäåíòè÷íóþ ðàáîòó ïðîãðàììû. Äðóãèì ïîäõîäîì ÿâëÿëñÿ áû èñ-
ïîëüçîâàíèÿ ôóíêöèé êîíêðåòíîé îïåðàöèîííîé ñèñòåìû: X-Windows äëÿ *nix
ñèñòåì èëè WinAPI äëÿ Windows. Òàêîé ïîäõîä äàë áû áîëüøèé êîíòðîëü íàä
âûâîäîì ãðàôè÷åñêîé èíôîðìàöèè â óùåðá âîçìîæíîñòè áûñòðîãî ïåðåíîñà êîä
ìåæäó ñèñòåìàìè.
 ðàìêàõ äàííûõ çàìåòîê áóäåì ïðèäåðæèâàòüñÿ êðîñ-ïëàòôîðìåííîãî ïîäõî-
äà.

Ðàñòðîâîå èçîáðàæåíèå Â ñòð. 10 ïîêàçàíî êàê ñîçäàâàòü ðàñòðîâûå èçîáðà-


æåíèå.  ðàìêàõ áèáëèîòåêè OpenCV ñ÷èòàåòñÿ, ÷òî èçîáðàæåíèå  ýòî ìàòðèöà,
ýëåìåíòû êîòîðîé ñîîòâåòñòâóþò ïèêñåëÿì. Èìåííî ïî ýòîé ïðè÷èíå ðàçìåð èçîá-
ðàæåíèÿ çàäàåòñÿ êàê ýòî òðàäèöèîííî ïðèíÿòî äëÿ ìàòðèö: âûñîòà íà øèðèíó
(à íå êàê ýòî ïðèíÿòî äëÿ èçîáðàæåíèé: øèðèíà íà âûñîòó). Ïîñëåäíèé àðãóìåíò
êîíñòðóêòîðà óêàçûâàåò íà òèï äàííûõ.  äàííîì ñëó÷àå CV_8UC3 óêàçûâàåò íà 8
áèòîâîå áåç-çíàêîâîå öåëîå ÷èñëî íà êîìïîíåíòó êîèõ 3, ò.å. çàäàíî òðàäèöèîííîå
24-áèòîå öâåòíîå èçîáðàæåíèå.
Áîëåå ïîäðîáíî äàííûé îáúåêò áóäåò îïèñàí â ïîäðàçäåëå 1.2.

Îòðèñîâêà òåêñòà  ñòðî÷êàõ 14 - 18 ïðîèçâîäèòñÿ èíèöèàëèçàöèÿ ïåðåìåííûõ


îòâå÷àþùèõ çà àðãóìåíòû ôóíêöèè putText, êîòîðàÿ âûâîäèò òåêñòîâóþ ñòðî÷-
êó â çàäàííîå ìåñòî èçîáðàæåíèÿ. Ýòî ñäåëàíî äëÿ óäîáñòâà ÷òåíèÿ ïðîãðàììû.
Òàê, ïåðåìåííàÿ text (ñì. ñòð. 14) ñîäåðæèò òåêñòîâóþ ñòðî÷êó, êîòîðóþ íåîáõî-
äèìî íàðèñîâàòü íà èçîáðàæåíèè â òî÷êå çàäàííîé ïåðåìåííîé textOrg (ñì. ñòð.
15). Äëÿ îòðèñîâêè òåêñòà èñïîëüçóåòñÿ ãàðíèòóðà òåêñòà çàäàííàÿ ïåðåìåííîé
fontFace (ñì. 16), ãäå ðàçìåð çàäàåòñÿ ïåðåìåííîé fontScale (ñì. ñòð. 17), à öâåò
 color (ñì. ñòð. 18).
Âñå ýòè ïåðåìåííûå ïåðåäàþòñÿ â êà÷åñòâå àðãóìåíòîâ ôóíêöèè putText â
ñòðî÷êå 24, ïåðâûì àðãóìåíòîì êîòîðîé êàê ðàç óêàçûâàåòñÿ èçîáðàæåíèå (â äàí-
íîì ñëó÷àå, ïåðåìåííàÿ img) íà êîòîðîì áóäåò ïðîèçâåäåíà îòðèñîâêà òåêñòà ñî-
ãëàñíî ðàíåå óêàçàííûì ïàðàìåòðàì.

Ñòðàíèöà 3
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

Äðóãèå ôóíêöèè îòðèñîâêè îïèñàíû â ïîäðàçäåëå 1.7.

Èíòåðàêòèâíîå âçàèìîäåéñòâèå Âûïîëíÿåìàÿ ïðîãðàììà äîëæíà êàê-òî âçà-


èìîäåéñòâîâàòü ñ ïîëüçîâàòåëåì (èíà÷å îíà áåññìûñëåííà). Êàê äàëåå áóäåò ïî-
êàçàíî, ìîæíî, íàïðèìåð, èçîáðàæåíèÿ ñîõðàíÿòü/ñ÷èòûâàòü â/èç ôàéë(û)/îâ.
Íî ýòî äîëãî (ñîõðàíèë, ïîòîì ïîñìîòðåë ÷åðåç âíåøíþþ ïðîãðàììó) è íå âñåãäà
óäîáíî. Ïîýòîìó óæå â äàííîé ïåðâîé ïðîãðàììå ïîêàçàíî êàê âûâîäèòü èçîáðà-
æåíèÿ íà ýêðàí â îêîøêî è îæèäàòü íàæàòèå êëàâèøè îò ïîëüçîâàòåëÿ.
Èçîáðàæåíèå îòðèñîâûâàåòñÿ â îêíå ñòðî÷êîé 27, ãäå ïåðâûì àðãóìåíòîì óêà-
çûâàåòñÿ åãî íàçâàíèå. Âòîðîé àðãóìåíò çàäàåò òðåáóåìîå äëÿ îòîáðàæåíèÿ â ñî-
çäàâàåìîì îêíå èçîáðàæåíèå.  äàííîì ñëó÷àå ðàçìåð îêíà áóäåò ïîäñòðîåí ïîä
ðàçìåð èçîáðàæåíèÿ, ò.å. åñëè îíî áóäåò ãðîìàäíûì, òî îíî âûëàçèò çà ïðåäåëû
òâîåãî ýêðàíà.
Áîëåå ïîáðîáíî îïèñàíèå âçàèìîäåéñòâèÿ ñ îêîííîé ñèñòåìîé áóäåò îïèñàíî â
ïîäðàçåäåëå 1.3.
Åñëè íàïèñàòü ïðîãðàììó áåç âûçîâà ôóíêöèè waitKey(ñì. ñòð. 28), òî ïðî-
ãðàììà çàâåðøèò ñâîþ ðàáîòó ñðàçó ïîñëå îòîáðàæåíèÿ èçîáðàæåíèÿ. Ïîñëåäíåå
îçíà÷àåò, ÷òî îêîøêî ñ èçîáðàæåíèåì áóäåò êðàòêîâðåìåííî ïîêàçàíî, à ïîòîì ñðà-
çó âñå çàêðîåòñÿ. Äàáû ýòî ïðåäîòâðàòèòü êàê ðàç è âûçûâàåòñÿ ôóíêöèÿ waitKey,
êîòîðàÿ îæèäàåò ââîäà ëþáîé êëàâèøè. Âìåñòî íå¼ êîíå÷íî ìîæíî áûëî áû ïðî-
ñòî âûçâàòü scanf, íî òàê ñ òî÷êè çðåíèÿ áèáëèîòåêè OpenCV áîëåå êîððåêòíî è
ïðàâèëüíåé. Ïîäðîáíîñòè òàêæå äàíû â ïîäðàçåäåëå 1.3.

Óïðàæíåíèÿ Äàëåå ñëåäóåò ñïèñîê óïðàæíåíèé äàáû ìîæíî áûëî ïîèãðàòüñÿ


ñ äàííîé ïðîãðàììîé.
Óïðàæíåíèå. Ïîèãðàéñÿ ñ ïðîãðàììîé èçìåíÿÿ çíà÷åíèÿ ïåðåìåííûõ îòâå÷à-
þùèõ çà àðãóìåíòû ôóíêöèè putText.
Óïðàæíåíèå.  öèêëå îáíîâëÿé èçîáðàæåíèå, íàïðèìåð, íàïå÷àòàâ îáðàòíûé
îòñ÷åò ïî íàæàòèþ êëàâèøè.

1.2 Îáúåêò ìàòðèöà Mat

Áàçîâûì îáúåêò áèáëèîòåêè OpenCV ÿâëÿåòñÿ ìàòðèöà, êîòîðûé ñîîòâåòñòâóåò


ñóùíîñòè ðàñòðîâîãî èçîáðàæåíèÿ. Áåç íåãî ôàêòè÷åñêè íèêàê.
Ðàñòðîâîå èçîáðàæåíèå (â îòëè÷èå îò âåêòîðíûõ) ñîñòîèò èç ïèêñåëåé. Ïèêñåëü
îòâå÷àåò çà öâåò èçîáðàæåíèÿ â îïðåäåëåííîé åãî òî÷êå è çàäàåòñÿ ôèêñèðîâàí-
íûì íàáîðîì ÷èñåë (÷èñëîâûõ õàðàêòåðèñòèê 1 èëè 3 èëè 4). Èçîáðàæåíèå ñâî-
äèòñÿ ê ìàòðèöå ýëåìåíòû êîòîðîé ñîîòâåòñòâóþò ïèêñåëÿì, ò.å. îíè ìîãóò áûòü
âåêòîðàìè, íàïðèìåð, ðàçìåðà 3. Ââèäó òîãî, ÷òî èçîáðàæåíèé ýòî ìàòðèöà, íàä
èçîáðàæåíèÿìè äîñòóïíû âñå ñòàíäàðòíûå îïåðàöèè îòíîñÿùèåñÿ ê ìàòðèöàì:

Ñòðàíèöà 4
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

ñëîæåíèå, âû÷èòàíèå, óâåëè÷åíèå íà êîíñòàíòó è òîìó ïîäîáíîå. Äàííàÿ ìûñëü


áóäåò ðàçâèòà â ðàçäåëå 1.5.
Ìàòðèöó ìîæíî ñîçäàâàòü áåçîòíîñèòåëüíî èçîáðàæåíèÿ, òîãäà å¼ ýëåìåíòû
çàäàþò óæå íå îáÿçàòåëüíî öâåò. Ïîýòîìó, â êà÷åñòâå å¼ ýëåìåíòîâ ìîæíî èñïîëü-
çîâàòü âåêòîðà ïðîèçâîëüíîãî ðàçìåðà, íî îïðåäåëåííîãî òèïà.

Òèï äàííûõ Äàííûé ïàðàìåòð âëèÿåò ñ îäíîé ñòîðîíû íà òî÷íîñòü, à ñ äðó-


ãîé íà ñêîðîñòü îáðàáîòêè.  ðàññìàòðèâàåìîé ïðîãðàììå äîñòàòî÷íî öåëûõ 8-
áèòîâûõ ÷èñåë.  ñëó÷àå êàêèõ-òî ñåðüåçíûõ âû÷èñëåíèé (íàïðèìåð, Ôóðüå ïðå-
îáðàçîâàíèå) âîçìîæíî ïîòðåáóåòñÿ èñïîëüçîâàòü äðóãèå òèïû äàííûõ, íàïðèìåð,
÷èñëà ñ ïëàâàþùåé òî÷êîé.
Ïèêñåëü, à òî÷íåå ýëåìåíò ìàòðèöû, ÿâëÿåòñÿ âåêòîðîì îïðåäåëåííîãî òèïà
èìåþùèé ôèêñèðîâàííûé ðàçìåð.Ðàçìåð âåêòîðà îïðåäåëÿåòñÿ òèïîì èçîáðàæå-
íèÿ, à òî÷íåå âûáðàííûì öâåòîâûì ïðîñòðàíñòâîì äëÿ äàííîãî èçîáðàæåíèÿ, òè-
ïîì ïèêñåëåé. Òàê, äëÿ öâåòíûõ èçîáðàæåíèé èñïîëüçóþòñÿ âåêòîðà äëèíû 3 (íà-
ïðèìåð, ñîîòâåòñòâóþùèå öâåòîâûì êîìïîíåíòàì êðàñíûé, çåëåíûé è ñèíèé), à
äëÿ ìîíîõðîìíûõ (íàïðèìåð, ãðàäàöèè ñåðîãî öâåòà)  âåêòîðà äëèíû 1 (íàïðè-
ìåð, ñîîòâåòñòâóþùèå ïðîñòî ÿðêîñòè). Äëÿ ñîáñòâåíûõ òèïîâ ðàçìåð âåêòîðà ìî-
æåò áûòü ïðîèçâîëüíûì.
Äëÿ íàèáîëåå ÷àñòî èñïîëüçóåìûõ òèïîâ â áèáëèîòåêè OpenCV çàäàíû êîí-
ñòàíòû. Ïðèâåäåì ñàìûå âàæíûå äëÿ äàííîãî êóðñà:

• CV_8UC3  òðè 8 áèòíûõ áåç-çíàêîâûõ ÷èñëà (âåêòîð ðàçìåðà 3). Òðàäèöèîííî


åù¼ íàçûâàåòñÿ 24 áèòà íà ïèêñåëü.

• CV_8C3  ...

Âîîáùå òàêèõ êîíñòàíò ìíîãî. Áîëåå òîãî, èõ ìîæíî ñôîðìèðîâàòü ñàìîñòîÿòåëü-


íî ïîñðåäñòâîì ñëåäóþùåé êîíñòðóêöèè:.

Ñîçäàíèå Îáúåêò  ìàòðèöà  ñîçäàåòñÿ ïîñðåäñòâîì êîíñòðóêòîðà êëàññà Mat


(ñì. ñòðî÷êó 10 â ïåðâîé ïðîãðàììå). Ïåðâûå äâà àðãóìåíòà óêàçûâàþò å¼ ðàçìåð:
êîëè÷åñòâî ñòðî÷åê è ñòîëáöîâ. Òðåòèé àðãóìåíò óêàçûâàåò íà òèï ýëåìåíòîâ ìàò-
ðèöû.
Âûáðàâ îïðåäåëåííûé òèï äàííûõ èçîáðàæåíèå ìîæíî ñîçäàâàòü òàê:

1 ...
2 5 0 0 , CV_8C1 ) ; //Ñîçäàíèå èçîáðàæåíèÿ
Mat img ( 4 0 0 ,
3 //èìåþùåå ðàçìåð 500 â øèðèíó íà 400 â âûñîòó.
4 //Òèï ïèêñåëåé: 8-áèòíûå çíàêîâûå ÷èñëà.
5 ...

Ñòðàíèöà 5
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

Ìîæíî ñîçäàâàåìûé îáúåêò ñðàçó è èíèöèàëèçèðîâàòü, ò.å. çàïîëíèòü îïðåäå-


ëåííûì çíà÷åíèåì.
::zeros ::ones ::eye êàê â matlab, octave
Èíèöèàëèçàöèÿ ÷åðåç vector.

Êîïèðîâàíèå Êàê ìîæíî ìåíüøå ïðîèñõîäèò êîïèðîâàíèå. Åãî ôàêòè÷åñêè


íåò. Èäåò ñ÷åò÷èê ññûëîê.
Êëàññ ñàì çàáîèòñÿ î âûäåëåíèè è îñâîáîæäåíèè ïàìÿòè. Ñîñòîèò èç header è
data
Îáúåêò ìàòðèöà (Mat) ñîñòîèò èç äâóõ ÷àñòåé: ìàññèâ äàííûõ, ñîäåðæàùèé
çíà÷åíèå ñàìèõ ýëåìåíòîâ ìàòðèöû, è çàãîëîâêà  ðàçìåð è ðåãèîí èíòåðåñà. Ñ
òî÷êè çðåíèÿ C++ èëè èíà÷å ãîâîðÿ îáúåêòíî îðèåíòèðîâàííîãî ïîäõîäà ïðè ñî-
çäàíèè íîâîé ìàòðèöû (Mat) íà îñíîâå òåêóùåé äàííûå (ò.å. ìàññèâ ýëåìåíòîâ)
âñåãäà îñòàþòñÿ òåìå æå, à âîò çàãîëîâîê ìåíÿåòñÿ. Ýòî îçíà÷àåò, ÷òî âñå èçìåíå-
íèÿ ñ ýëåìåíòàìè ìàòðèöû ó îäíîãî îáúåêòà Mat áóäåò ïðîÿâëÿòüñÿ è ó äðóãîãî.
Òàê, åñëè ïåðåä ïóñòîé ñòðî÷êîé 12 âñòàâèòü ñòðî÷êó

1 Mat img2 ( img ) ; //Ñîçäàíèå èçîáðàæåíèÿ ïî img.

Äàëåå, åñëè åù¼ çàìåíèòü â ñòðî÷êå 27 ïåðåìåííóþ img, íà img2, òî ïðîãðàììà


òåì íå ìåíåå âûâåäåò íà ýêðàí òîò æå ñàìûé îòâåò (èçîáðàæåíèå ñ ïðèâåòñòâèåì
ê ìèðó). Õîòÿ îòðèñîâêà ïî-ïðåæíåìó äåëàåòñÿ â Img.
Äëÿ ñîçäàíèå èñòèííîé êîïèè íóæíî â ÿâíîì âèäå âûçâàòü ìåòîä clone.

1 //Ñîçäàíèå íåçàâèñèìîãî
Mat img2=img . c l o n e ( ) ;
2 //èçîáðàæåíèÿ ïî èçîáðàæåíèþ img.

Èëè ïîñðåäñòâîì ôóíêöèè toImage.


Íî òîãäà ïðèâåòñâèÿ ïðîïàäåò.

Ðåãèîí èíòåðåñà Äàííàÿ âîçìîæíîñòü ïîçâîëÿåò îãðàíè÷èòü äîïóñòèìóþ îá-


ëàñòü èçìåíåíèÿ èçîáðàæåíèÿ. Ôàêòè÷åñêè ìû ñîçäàåì äëÿ èçîáðàæåíèÿ íîâûå
ãðàíèöû â ðàìêàõ ñòàðîãî èçîáðàæåíèÿ (êàêáû íåðàöèîíàëüíî èñïîëüçóåì ïàìÿòü,
ôàêòè÷åñêàÿ äëèíà ñòðîê ãîðàçäî áîëüøå øèðèíû èçîáðàæåíèÿ...).

1 R e c t r o i ( 1 1 0 , 8 0 , 1 0 0 , 1 0 0 ) ; // Çàäàåì ñàìó îáëàñòü.


2 // Ñîçäàåì èçîáðàæåíèå ñ íîâûìè ãðàíèöàìè.
3 Mat img2 = img ( roi );

Òîãäà, â ÷àñòíîñòè, âñå ôóíêöèè îòðèñîâêè áóäóò îáðåçàòüñÿ äàííîé îáëàñòüþ.


Íàïðèìåð, åñëè ïðè êëîíèðîâàíèè îãðàíè÷èò è îáëàñòü, òî íàäïèñü áóäåò îáðåçà-
íà. Áîëå òîãî â çàâèñèìîñòè îò òîãî êàêîå èçîáðàæåíèå ïîäàåòñÿ ôóíêöèè îòðè-

Ñòðàíèöà 6
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

ñîâêè áóäåò: ëèáî âûâåäåíà òîëüêî îáðåçàííàÿ ÷àñòü, âûâåäåíî âñå èçîáðàæåíèå ñ
îáðåçàííîé ÷àñòüþ.
Óïðàæíåíèå. Ïðîâåðèòü ïîñëåäíåå óòñâåðæäåíèå.
Íàäî ïîíèìàòü, ÷òî äàííîé ñâîéñòâî áóäåò âûïîëíåíî äëÿ âñåõ ôóíêöèé. Âñå
äàëåå ïðèâåäåííûå ïðåîáðàçîâàíèÿ áóäóò òàêæå îãðàíè÷èâàòüñÿ òàêèì ñïîñîáîì
äàííîé îáëàñòüþ. Íàïðèìåð, ïîâûøåíèå ÿðêîñòè, êîíòðàñòà, äîáàâëåíèå øóìà è
òîìó ïîäîáíîå.
Rect Range::all()
copyto.

1.3 Îêîííàÿ ñèñòåìà

Îêíà  ïåðâîé ïðîãðàììå îêíî áûëî ñîçäàíî àâòîìàòè÷åñêè ïðè åãî îòðèñîâêè.
Íà ñàìîì äåëå åãî ìîæíî ñîçäàòü â ÿâíîì âèäå, ÷òî ïîçâîëèò óêàçàòü è òåì ñàìûì
íàñòðîèòü îäèí âàæíûé ïàðàìåòð. Òàê, êàê ïîêàçàíî íèæå, îêíî çàäàåòñÿ âûçîâîì
ôóíêöèè namedWindow:
1 namedWindow ( " Display window " , WINDOW_AUTOSIZE );

 ñòðî÷êå 1 ïîêàçàíî êàê ñîçäàâàòü îêíî. Ïåðâûé àðãóìåíò âûçûâàåìîé ôóíêöèè


namedWindows çàäàåò íàçâàíèå ñîçäàâàåìîãî îêíà, íî íà ñàìîì äåëå áîëåå ïðà-
âèëüíåé ñ÷èòàòü, ÷òî îí æå ÿâëÿåòñÿ è õýíäëåðîì, ò.å. äàííîå èìÿ óêàçûâàåò íà
îáúåêò ñîîòâåòñòâóþùèé îêíó. Âòîðîé àðãóìåíò êàê ðàç íàñòðàèâàåò ïàðàìåòð
ñîçäàâàåìîãî îêíà. Îíî ìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ:

• WINDOW_AUTOSIZE  àâòîìàòè÷åñêè èçìåíÿåò ñâîé ðàçìåð ïîä ðàçìåð


èçîáðàæåíèÿ;

• WINDOW_NORMAL  îêíî îïðåäåëåííîãî ðàçìåðà, êîòîðûé ìîæíî ìåíÿòü


ìûøêîé. Èçîáðàæåíèå âïèñûâàåòñÿ â îêíî, ò.å. ìàñøòàáèðóåòñÿ ïîä òåêóùèé
ðàçìåð.

 äàííîì ñëó÷àå, îíî áóäåò èçìåíÿòü ñâîè ðàçìåðû ïîä ïîêàçûâàåìîå èçîáðà-
æåíèå. Îòìå÷ó, ÷òî äàííûé àðãóìåíò ÿâëÿåòñÿ íåîáÿçàòåëüíûì ïàðàìåòðîì (ïî
óìîë÷àíèþ  WINDOW_AUTOSIZE).
Ñòðî÷êó êîäà 1 ìîæíî âñòàâèòü â ïåðâóþ ïðîãðàììó ïåðåä ñòðî÷êîé 27. Â
òàêîì ñëó÷àå ê ïåðâîìó àðãóìåíòó ôóíêöèè imshow ñëåäóåò îòíåñòèñü êàê ê õýíä-
ëåðó ðàíåå ñîçäàííîãî îêíà.
moveWindow
Óïðàæíåíèå. Ñîçäàé áîëüøå îäíîãî îêíà è èçîáðàæåíèÿ.

Ïîëçóíîê trackbar, callback

Ñòðàíèöà 7
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

Äîïîëíèòåëüíûå âîçìîæíîñòè waitKey Ïîìèìî ãðàôè÷åñêîé âçàèìîäåé-


ñòâèÿ ñ ïîëüçîâàòåëåì, íåîáõîäèìî óìåòü è ïîíèìàòü êàêóþ êëàâèøó íàæàë ïîëü-
çîâàòåëü. Òàê, íàïðèìåð, ìîæíî îáðàáîòàòü íàæàòèå òàêèõ êëàâèø êàê âåðõ, âíèç,
âëåâî è âïðàâî ÷òî ìîæåò ïîçâîëèòü íàïðèìåð óïðàâëÿòü ïåðåìåùåíèåì êóðñî-
ðà â îêîøêå. Äàííàÿ âîçìîæíîñòü ïîçâîëèò ñîçäàòü èíòåðàêòèâíóþ ïðîãðàììó.
Íàïðèìåð, äâèãàòü îáúåêò ïî êàðòèíêå.
Ëåã÷å âñåãî îïðåäåëÿòü êîäû ñîîòâåòñòâóþùèå ýòèì êëàâèøàì ïóòåì îòëàäî÷-
íîé ïå÷àòè.
 ñêîáêàõ ìîæíî óêàçàòü â ìèëëèñåêóíäàõ ìàêñèìàëüíîå âðåìÿ îæèäàíèÿ.
Ïðè ýòîì 0 îáîçíà÷àåò áåñêîíå÷íîå îæèäàíèå.
 ëþáîì ñëó÷àå äàæå ïðè ïîñëåäíåì çíà÷åíèè ôóíêöèÿ çàâåðøàåò ñâîþ ðàáîòó
ïðè íàæàòèè ëþáîé êëàâèøè.

1.4 Ââîä/âûâîä èçîáðàæåíèé

Èçîáðàæåíèÿ ìîæíî íå òîëüêî ôîðìèðîâàòü â ïðîãðàììå, íî è çàãðóæàòü èç ôàé-


ëà è çàïèñûâàòü â ôàéë.

Âûâîä Ïîìèìî âûâîäà íà ýêðàí, èçîáðàæåíèå ìîæíî âûâåñòè (ò.å. çàïèñàòü) è


â ôàéë. Çàïèñü èçîáðàæåíèÿ â ôàéë îñóùåñòâëÿåòñÿ ôóíêöèåé imwrite (îò ñëîâà
image write):

1 #include <o p e n c v 2 / c o r e / c o r e . hpp>


2 #include <o p e n c v 2 / h i g h g u i / h i g h g u i . hpp>
3 #include <s t r i n g >
4 using namespace cv ;
5 using namespace std ;
6 int main ( int argc , char ∗∗ argv )
7 {
8 Mat img ( 4 0 0 , 5 0 0 , CV_8UC3 ) ;
9 string text = " Hello World ! " ;
10 Point textOrg (100 , img . r o w s / 2 ) ;
11 int f o n t F a c e = FONT_HERSHEY_SCRIPT_SIMPLEX ;
12 double f o n t S c a l e = 2 ;
13 Scalar color (200 ,100 ,50);
14
15 p u t T e x t ( img , text , textOrg , fontFace , fontScale ,
16 color );
17
18 //Çàïèñü èçîáðàæåíèÿ img â ôàéë ./ output.bmp:
19 i m w r i t e ( " . / o u t p u t . bmp" , img ) ;

Ñòðàíèöà 8
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

20 return 0;
21 }

Çàìå÷ó, ÷òî â äàííîì ñëó÷àå, ìû òîëüêî âûâîäèì èçîáðàæåíèå â ôàéë è íåò íåîá-
õîäèìîñòè åãî âûâîäà íà ýêðàí (îòñóòñòâóåò ñòðîêà 27 ïðåäûäóùåé ïðîãðàììû).
Òåì íå ìåíåå çàãîëîâî÷íûé ôàéë (ñòð. 2) íåîáõîäèì äëÿ âûçîâà ôóíêöèè imwrite.
Ïåðâûé àðãóìåíò ôóíêöèè imwrite óêàçûâàåò íà èìÿ èçîáðàæåíèÿ, ïóòü ê âû-
õîäíîìó ôàéëó. Êàê îáû÷íî, ïóòü ìîæåò áûòü êàê îòíîñèòåëüíûì ("./lena.bmp"),
òàê è ïîëíûì ("/home/vasay/girls/lena.bmp").
Ðàñøèðåíèå ôàéëà (íàïðèìåð, ".bmp") ôàêòè÷åñêè óêàçûâàåò íà ôîðìàò õðà-
íåíèÿ èçîáðàæåíèÿ. Èçîáðàæåíèÿ ìîæåò áûòü çàïèñàíî äëÿ øèðîêîãî êðóãà ôîð-
ìàòîâ, íî âñå çàâèñèò îò ñáîðêè áèáëèîòåêè. Îáû÷íî ïîääåðæèâàþòñÿ òðàäèöèîí-
íûå ôîðìàòû: bmp, jpeg, png è äðóãèå.
Öâåòîâîå ïðîñòðàíñòâî ôàéëà çàâèñèò îò ôîðìàòà ìàòðèöû. Òàê, åñëè ýëåìåí-
òû ìàòðèöû ÿâëÿþòñÿ ïðîñòî ÷èñëàìè, òî èòîãîâîå èçîáðàæåíèå áóäåò ìîíîõðîì-
íûì. Åñëè æå âåêòîðà äëèíû 3, òî  ñêîðåå âñåãî òðåõêîìïîíåíòíîå öâåòíîå èçîá-
ðàæåíèå â ôîðìàòå RGB (red  êðàñíûé, green  çåëåíûé, blue  ñèíèé), íî ìîæåò
áûòü â ïðîñòðàíñòâå HSV (hue  òîí, saturation  íàñûùåííîñòü, value  çíà÷åíèå).
Ïðè íåîáõîäèìîñòè ê èçîáðàæåíèþ äîáàâëÿåòñÿ è àëüôà êàíàë (ïðîçðà÷íîñòü).
Ìîæíî òàêæå âûïîëíèòü è áîëåå òîíêóþ íàñòðîéêó êîäåêà (3é íåîáÿçàòåëüíûé
àðãóìåíò).
Çàïèñàííîå ïðîãðàììîé âûõîäíîå èçîáðàæåíèå ("./output.bmp") ìîæíî ïðî-
ñìîòðåòü ñòàíäàðòíûìè ïðîãðàììàìè ïðîñìîòðà èçîáðàæåíèé.
Óïðàæíåíèå. Âîñïîëüçóéñÿ ïåðåìåííûìè argc è argv äëÿ îïðåäåëåíèÿ âõîäíîãî
ôàéëà, êîòîðûé íåîáõîäèìî ïðåîáðàçîâàòü â ñåðîå. Çàïèøè ìîíîõðîìíîå èçîáðà-
æåíèå äîáàâèâ íåêèé ñóôôèêñ ê åãî èìåíè.

Ââîä Ïîìèìî âûâîäà ïðîãðàììà äîëæíà óìåòü è ââîäèòü äàííûå, ò.å. â íàøåì
ñëó÷àå èçîáðàæåíèÿ. Ââåñòè èçîáðàæåíèå, à òî÷íåå ñ÷èòàòü åãî èç ôàéëà, ìîæíî
ïîñðåäñòâîì ôóíêöèè imread:
Ïåðâûé àðãóìåíò óêàçûâàåò ïóòü ê èçîáðàæåíèþ, à âòîðîé íåîáÿçàòåëüíûé
àðãóìåíò òðåáóåìîå öâåòîâîå ïðîñòðàíñòâî ó èòîãîâîãî èçîáðàæåíèÿ, ò.å. âîçâðà-
ùàåìîé ìàòðèöû:

• IMREAD_COLOR  öâåòíîå RGB èçîáðàæåíèå,

• IMREAD_GRAYSCALE - ìîíîõðîìíîå èçîáðàæåíèå.

Ôóíêöèåé ÷òåíèÿ ñòàíäàðòíî ïîääåðæèâàåòñÿ øèðîêèé íàáîð ôîðìàòîâ èçîá-


ðàæåíèÿ: bmp, jpeg/jpg, png.

Ñòðàíèöà 9
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

Öâåòîâîå ïðîñòðàíñòâî óêàçûâàåòñÿ ïîñðåäñòâîì ïðåäîïðåäåëåííîé êîíñòàí-


òû.  ÷àñòíîñòè, êîíñòàíòà IMREAD_COLOR ñîîòâåòñòâóåò öâåòíîìó èçîáðàæåíèþ,
ò.å. ïèêñåëÿì ñîñòîÿùèì èç òðåõ êîìïîíåíò: êðàñíûé, çåëåíûé è ñèíèé.

1 #include <o p e n c v 2 / c o r e / c o r e . hpp>


2 #include <o p e n c v 2 / h i g h g u i / h i g h g u i . hpp>
3 #include <s t r i n g >
4 using namespace cv ;
5 using namespace std ;
6 int main ( )
7 {
8 Mat img ;//Ñîçäàíèå îáúåêòà ïîä èçîáðàæåíèå.
9 //Ñ÷èòûâàíèå èçîáðàæåíèÿ èç ôàéëà.
10 img = i m r e a d ( " . / l e n a . bmp" , IMREAD_COLOR ) ; //è
11 //èíèöèàëèçàöèÿ èì ìàòðèöû img.
12
13 imshow ( " Display window " , img );
14 waitKey ( 0 ) ;
15 return 0;
16 }

Äðóãàÿ âàæíàÿ êîíñòàíòà, IMREAD_GRAYSCALE, ñîîòâåòñòâóåò öâåòîâîìó ïðîñòðàí-


ñòâó ñîñòîÿùåìó èç ãðàäàöèé ñåðîãî öâåòà, òåì ñàìûì êîìïîíåíòà áóäåò ñîñòîÿòü
èç îäíîãî çíà÷åíèÿ: ãðàäàöèè ñåðîãî öâåòà. Ýòî ïîçâîëÿåò ïðè ñ÷èòûâàíèè èçîá-
ðàæåíèÿ ñðàçó æå åãî ïðåîáðàçîâàòü â ìîíîõðîìíîå.
Ìåòîä empty ìîæåò áûòü èñïîëüçîâàí äëÿ ïðîâåðêè óñïåøíîñòè ñ÷èòûâàíèÿ
èçîáðàæåíèÿ.  ñëó÷àå íåóäà÷è îáúåêò Mat áóäåò ïóñòûì. Èëè img.data/// ò.å.
êîððåêòíûé ñïîñîá ñ÷èòûâàòü èçîáðàæåíèå òàêîé: ...
Óïðàæíåíèå. Âûâåäè ñåðèþ èçîáðàæåíèé, à èìåííî  ïóñòü èìååòñÿ íàáîð èç
èçîáðàæåíèé òèïà image_00.jpeg, ..., image_99.jpeg. Íåîáõîäèìî ïîñëåäîâàòåëü-
íî âûâåñòè åãî íà ýêðàí. Ïðè íåîáõîäèìîñòè ñåðèþ èçîáðàæåíèé ìîæíî ñôîðìè-
ðîâàòü èñõîäÿ èç ðàíåå ïðåäñòàâëåíîãî ìàòåðèàëà.
argc argv[]!!

1.5 Îïåðàöèè íàä èçîáðàæåíèÿìè

 äàííîì ïîäðàçäåëå ïîêàçàíî êàê âûïîëíÿòü ïðîñòåéøèå ïðåîáðàçîâàíèÿ íàä


èçîáðàæåíèÿìè: óâåëè÷åíèå ÿðêîñòè, êîíòðàñòà, ñëîæåíèå.

Ìàòðèöû Ñ òî÷êè çðåíèÿ ïðîãðàììèðîâàíèÿ â äàííîé áèáëèîòåêè èçîáðàæå-


íèÿ ïî ñóòè ÿâëÿþòñÿ ìàòðèöàìè. Íàä ìàòðèöàìè äîñòóïíû ñîîòâåòñòâóþùèå îïå-

Ñòðàíèöà 10
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

ðàöèè: ñëîæåíèå, óìíîæåíèå íà êîíñòàíòó. Ïîñëåäíåå ïîçâîëÿåò äàííûå îïåðàöèè


ïðèìåíèòü ê èçîáðàæåíèÿì.
Ñ äðóãîé ñòîðîíû, ïðåîáðàçîâàíèÿì íàä èçîáðàæåíèÿìè ðàíåå îáîçíà÷åííûå
âî ââåäåíèè ê ïîäðàçäåëó ñîîòâåòñòâóþò îïåðàöèè íàä ìàòðèöàìè. Ïîêàæåì äàëåå
êàê îíè ñîîòíîñÿòñÿ.

Èçìåíåíèå êîíòðàñòà Èçìåíåíèå êîíòðàñòà èçîáðàæåíèÿ îñóùåñòâëÿåòñÿ ïó-


òåì äîìíîæåíèÿ âñåõ çíà÷åíèé èçîáðàæåíèÿ íà êîíñòàíòó. Ñ òî÷êè çðåíèÿ ìàò-
ðè÷íûõ îïåðàöèè ýòîìó ñîîòâåòñòâóåò óìíîæåíèå èñêîìîé ìàòðèöû íà íåêóþ êîí-
ñòàíòó.

1 #include <o p e n c v 2 / c o r e / c o r e . hpp>


2 #include <o p e n c v 2 / h i g h g u i / h i g h g u i . hpp>
3 #include <s t r i n g >
4 using namespace cv ;
5 using namespace std ;
6 int main ( )
7 {
8 Mat img ;
9 img = i m r e a d ( " . / l e n a . bmp" , IMREAD_COLOR ) ;
10 img ∗= 1.1;
11
12 imshow ( " Display window " , img );
13 waitKey ( 0 ) ;
14 return 0;
15 }

Óïðàæíåíèå. ×òî áóäåò ïðîèñõîäèòü ñ óâåëè÷åíèåì ÷èñëà (1.1)? Îáîñíîâàòü


ðåçóëüòàò. ×òî áóäåò ïðè óìåíüøåíèè?
Êàê êàæäóþ êîìïîíåíòó ïî îòäåëüíîñòè? ×òî ñ îòðèöàòåëüíûì ÷èñëîì?

Èçìåíåíèå ÿðêîñòè Óâåëè÷åíèþ ÿðêîñòè èçîáðàæåíèÿ îñóùåñòâëÿåòñÿ ïóòåì


äîáàâëåíèÿ íåêîé êîíñòàíòû (îïðåäåëåííîãî öâåòà) êî âñåìó èçîáðàæåíèþ. Ñ òî÷-
êè çðåíèÿ ìàòðè÷íûõ îïåðàöèè ýòîìó ñîîòâåòñòâóåò äîáàâëåíèå ê èñêîìîé ìàòðè-
öå íåêîãî ýëåìåíòà.

1 #include <o p e n c v 2 / c o r e / c o r e . hpp>


2 #include <o p e n c v 2 / h i g h g u i / h i g h g u i . hpp>
3 #include <s t r i n g >
4 using namespace cv ;
5 using namespace std ;

Ñòðàíèöà 11
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

6 int main ( )
7 {
8 Mat img ;
9 img = i m r e a d ( " . / l e n a . bmp" , IMREAD_COLOR ) ;
10 img += 3 0 ;
11 namedWindow ( " Display window " , WINDOW_AUTOSIZE );
12 imshow ( " Display window " , img );
13 waitKey ( 0 ) ;
14 return 0;
15 }

Óïðàæíåíèå. ×òî áóäåò ïðîèñõîäèòü ñ óâåëè÷åíèåì ÷èñëà (30)? Îáîñíîâàòü


ðåçóëüòàò. Òîæå ÷òî è ðàíüøå... óìåíüøåíèå è îòðèöàòåëüíûå.
Äëÿ ïðàâèëüíîãî äîáàâëåíèÿ êîíñòàíòû íóæíî ÷èñëî ïðåîáðàçîâàòü â ïðà-
âèëüíûé îáúåêò:

1 img += S c a l a r ( 3 0 ) ;

Óïðàæíåíèå. Ïðîäåëàòü ïðîøëîå óïðàæíåíèå çàíîâî.


Óïðàæíåíèå. Äîáàâèòü ïîëçóíîê êîòîðûé èíòåðàêòèâíî ìåíÿåò ÿðêîñòü èçîá-
ðàæåíèÿ.

Öâåò !!Ìîæåò ðàíåå Scalar (çíà÷åíèå ïèêñåëÿ)? 4 ýëåìåíòíûé. Point...


Âîñïðèíèìàåìûé ÷åëîâåêîì öâåò çàäàåòñÿ òðåìÿ ÷èñëàìè, êîìïîíåíòàìè. Òðà-
äèöèîííî èìè ÿâëÿþòñÿ: êðàñíûé, çåëåíûé è ñèíèé. Â áèáëèîòåêè îïåíñâ îíè ïî
èñòîðè÷åñêèì ïðè÷èíàì (ñâÿçàíî ñ ïîðÿäêîì áàéò â 4 áàéòîâûõ âåëè÷èíàõ) çà-
äàþòñÿ â îáðàòîì ïîðÿäêå: ñèíèé, çåëåíûé è êðàñíûé. Òàê, ðàíåå ïðèìåíåííàÿ
ñóùíîñòü Scalar ïîçâîëÿåò çàäàâàòü öâåò òðåìÿ ÷èñëàìè çàäàííûìè èìåííî â
òàêîì ïîðÿäêå.
Èñõîäÿ èç ïîñëåäíåãî, ÷òîáû äîáàâèòü êî âñåìó èçîáðàæåíèþ îòòåíîê êðàñíîãî
öâåòà íóæíî ñäåëàòü òàê:

1 img += S c a l a r ( 0 , 0, 30);

Óïðàæíåíèå. Äîáåéòåñü èäåíòè÷íîãî ðåçóëüòàòà ñ ïðîãðàììîé èç ïðîøëîãî


ïàðàãðàôà.
Îáëàñòü îïðåäåëåíèÿ. Òèï öåëûé/âåùåñòâåííûé. Äèàïàçîí èçìåíåíèÿ. saturate

Ñëîæåíèå Ïðåîáðàçîâàíèÿ ìîæíî âûïîëíÿòü íå òîëüêî íà åäèíè÷íûõ èçîáðà-


æåíèÿõ, íî è íà ïàðàõ. Òàê, ìîæíî ñëîæèòü äâà èçîáðàæåíèÿ, ÷òî ïîçâîëèò èõ
íàëîæèòü äðóã íà äðóãà. Ñ òî÷êè çðåíèÿ ìàòðè÷íûõ âû÷èñëåíèé äàííîìó áóäåò
ñîîòâåòñòâîâàòü ñëîæåíèå ìàòðèö.

Ñòðàíèöà 12
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

addWeighted ôîðèðóåò âçâåøåííóþ ñóììó äâóõ èçîáðàæåíèé.

min max

1.6 Ïðåîáðàçîâàíèå öâåòîâ

Öâåòíûå ïðîñòðàíñòâà. Ðàçíàÿ öåëü. Èíòåíñèâíîñòü, rgb? hsv...


Ïîêàçàíà êàê ìîæíî ïðåîáðàçîâûâàòü öâåòà èçîáðàæåíèÿ. Äàííàÿ îïåðàöèÿ
âàæíà ïðè ðàñïîçíàâàíèè îáðàçîâ ââèäó óïðîùåíèÿ èçîáðàæåíèÿ (îòáðàñûâàíèÿ
öâåòîâîé ÷àñòè äàííûõ). Òàêæå ýòî ÿâëÿåòñÿ öâåòîâûì ôèëüòðîì, êîòîðûé îáëà-
äàåò íåêîé ýñòåòèêîé. Öâåòà òàêæå ïîçâîëÿþò îòäåëèòü íà èçîáðàæåíèè îïðåäå-
ëåííûé öâåò, íàïðèìåð, öâåò êîæè.
Ñ òî÷êè çðåíèÿ ìàòåìàòèêè ðàññìàòðèâàåìûå ðàíåå ïðåîáðàçîâàíèÿ äåéñòâî-
âàëè íàä âñåìè êîìïîíåíòàìè âñåõ ïèêñåëåé ïî îòäåëüíîñòè. Äàííûå îïåðàöèè
äåéñòâóþò âíóòðè ïèêñåëÿ, ò.å. ÿâëÿþòñÿ îïåðàöèåé íàä êîìïîíåíòàìè (âíóòðè
ïèêñåëÿ).

Ãðàäàöèè ñåðîãî Ðàíåå áûëî îòìå÷åíî, ÷òî èçîáðàæåíèå ìîæíî ñðàçó çàãðó-
çèòü èç ôàéëà â ìîíîõðîìíîì öâåòîâîì ïðîñòðàíñòâå óêàçàâ ñîîòâåòñòâóþ êîí-
ñòàíòó â ôóíêöèè imread. Íî ìîæíî âûïîëíèòü ïðåîáðàçîâàíèå öâåòíîãî èçîáðà-
æåíèÿ â ãðàäàöèè ñåðîãî â ÿâíîì âèäå.

1 #include <o p e n c v 2 / c o r e / c o r e . hpp>


2 #include <o p e n c v 2 / h i g h g u i / h i g h g u i . hpp>
3 #include <s t r i n g >
4 using namespace cv ;
5 using namespace std ;
6 int main ( int argc , char ∗∗ argv )
7 {
8 Mat img ;
9 img = i m r e a d ( " . / l e n a . bmp" , IMREAD_COLOR ) ;
10 //Ñîçäàíèå îáúåêòà ïîä âûõîäíîå
Mat img_gray ;
11 //èçîáðàæåíèå. Â íåãî áóäåò çàïèñàí ðåçóëüòàò.
12 //Ïðåîáðàçóåì èçîáðàæåíèå èç öâåòíîãî â ñåðîå.
13 cvtColor ( img , img_gray , COLOR_BGR2GRAY ) ;
14 //Çàïèñûâàåì ñåðîå èçîáðàæåíèå â ôàéë.
15 i m w r i t e ( " . / l e n a _ g r a y . bmp" , img_gray ) ;
16 return 0;
17 }

Ñòðàíèöà 13
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

 äàííîì ïðèìåðå áûëà âûçâàíà ôóíêöèÿ cvtColor ïåðâûé àðãóìåíò êîòîðîé


óêàçûâàåò íà èñõîäíîå èçîáðàæåíèå, âòîðîé íà ðåçóëüòèðóþùåå, à òðåòèé íà òèï
ïðåîáðàçîâàíèÿ. Êîíñòàíòà COLOR_BGR2GRAY îòâå÷àåò çà ïðåîáðàçîâàíèå öâåòíîãî
òðåõêîìïîíåíòíîãî èçîáðàæåíèÿ â ìîíîõðîìíîå.
Ôîðìóëà....

Íåãàòèâ Äëÿ íåãàòèâà íóæíî "îáðàòèòü öâåòà"(ò.å. ñîîòâåòñòâóþùèå êîìïîíåí-


òû), à èìåííî  ÿðêàÿ êîìïîíåíòà äîëæíà ñòàòü òóñêëîé, à òóñêëàÿ ÿðêîé. Ìèíè-
ìàëüíàÿ ÿðêîñòü ÿâëÿåòñÿ 0, à ìàêñèìàëüíàÿ 255. Ôàêòè÷åñêè íåîáõîäèìî âû÷åñòü
èç ìàòðèöû ñîñòîÿùåé îäíèõ ÷èñëå 255 èñêîìóþ ìàòðèöó.
Êàê áûëè ñêàçàíî ðàíåå ââèäó òîãî, ÷òî èçîáðàæåíèÿ ïðåäñòàâëÿþòñÿ â âè-
äå ìàòðèö, íàä èçîáðàæåíèÿìè äîñòóïíû îïåðàöèè, êîòîðûå ïðåäíàçíà÷åíû äëÿ
ìàòðèöû.  ÷àñòíîñòè, âû÷èòàíèå. Òîãäà ïðîãðàììà ïðåâðàòèòüñÿ â:

1 #include <o p e n c v 2 / c o r e / c o r e . hpp>


2 #include <o p e n c v 2 / h i g h g u i / h i g h g u i . hpp>
3 #include <s t r i n g >
4 using namespace cv ;
5 using namespace std ;
6 int main ( )
7 {
8 Mat img ;
9 img = i m r e a d ( " . / l e n a . bmp" , IMREAD_COLOR ) ;
10 Mat img_neg ;//Ñîçäàíèå îáúåêòà ïîä âûõîäíîå
11 //èçîáðàæåíèå. Â íåãî áóäåò çàïèñàí ðåçóëüòàò.
12 img_neg = S c a l a r ( 2 5 5 ) − img ; //Âû÷èñëÿåì íåãàòèâ.
13 namedWindow ( " Display window " , WINDOW_AUTOSIZE );
14 imshow ( " Display window " , img );
15 waitKey ( 0 ) ;
16 return 0;
17 }

Ìîíîõðîìíîå Ìîíîõðîìíîñòü ïîäðàçóìåâàåò, ÷òî â èçîáðàæåíèè âìåñòî ãðàäà-


öèé ñåðîãî èñïîëüçóþòñÿ ãðàäàöèè êàêîãî-òî äðóãîãî öâåòà. Îïÿòü æå ìû ìîæåì
âîñïîëüçîâàòüñÿ ìàòåìàòè÷åñêèìè îïåðàöèÿìè äëÿ äîñòèæåíèÿ íóæíîé öåëè.

Ñåïèÿ Ñåïèÿ ýòî êîðè÷íåâàòûé öâåò. Èçîáðàæåíèå ìîæíî ïðåâðàòèòü â ìîíî-


õðîìíîå, íî â îòòåíêàõ ñåïèè. Äëÿ íóæíî ñíà÷àëà ïðåâðàòèòü èçîáðàæåíèå â ìîíî-
õðîìíîå, à ïîòîì óìíîæèòü âñå êîìïîíåíòû íà öâåò ñåïèè. Äàëåå íóæíî óñðåäíèòü
èçîáðàæåíèåì èç ãðàäàöèé ñåðîãî.

Ñòðàíèöà 14
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

Îòîáðàæåíèå ñåðîãî íà öâåòà Äàííîå ïðåîáðàçîâàíèå ïîçâîëÿåò ëó÷øå îòîá-


ðàçèòü ñåðûå (ìîíîõðîìíûå) èçîáðàæåíèÿ. Ê òàêèì èçîáðàæåíèÿì îòíîñÿòñÿ èñ-
õîäíûå èçîáðàæåíèÿ ñ áîëüøîé áèòíîñòüþ è êàê ðåçóëüòàò íåêèõ ïðåîáðàçîâàíèé
(íàïðèìåð, ïëâàþùàÿ òî÷êà). Íàïðèìåð, ìîäóëü Ôóðüå ïðåîáðàçîâàíèÿ èëè ïðî-
èçâîäíàÿ èçîáðàæåíèÿ. Èñïîëüçîâàíèÿ îáû÷íîé ñåðîé øêàëû íå ïîçâîëèò óâèäåòü
ìåëêèå äåòàëè â èçìåíåíèè èíòåíñèâíîñòè.
Ïîñëåäíåå ñâÿçàíî ñ òåì, ÷òî âñåãî òàêèõ ãðàäàöèé îáû÷íî (íà 8-áèòíûõ ìî-
íèòîðàõ) 255. Áîëåå òîãî, è ó ÷åëîâåêà åñòü è ñâîè îãðàíè÷åíèÿ. Îòîáðàæåíèå
ìîíîõðîìíûõ èçîáðàæåíèé íà öâåòíûå ïîçâîëèò ñóùåñòâåííî ðàñøèðèòü äàííóþ
áèòíîñòü. Äàííîå ïðåîáðàçîâàíèå ôàêòè÷åñêè óïëîòíÿåò öâåòà.
Îñóùåñòâëÿåòñÿ äàííîå ïðåîáðàçîâàíèå ôóíêöèåé applyColorMap:
1 Mat img_dst ; // Íå íóæíî èíèöèàëèçèðîâàòü!
2 a p p l y C o l o r M a p ( img_src , img_dst , COLORMAP_HOT) ;

Ïåðâûé àðãóìåíò çàäàåò èñõîäíîå èçîáðàæåíèå, âòîðîé öåëåâîå èçîáðàæåíèå, ïðè


ýòîì, îíî áóäåò ñôîðìèðîâàíî, à ïîñëåäíèé àðãóìåíò çàäàåò êîíêðåòíûé òèï èñ-
ïîëüçóåìîãî ïðåîáðàçîâàíèÿ.
Óïðàæíåíèå. Íàéäèòå äðóãèå êîíñòàíòû è ñðàâíèòå ïîëó÷àåìûé ðåçóëüòàò.

1.7 Îòðèñîâêà êðèâûõ

Ïîìèìî òåêñòà, OpenCv ïîçâîëÿåò îòðèñîâàòü íà èçîáðàæåíèè è ñòàíäàðòíûå êðè-


âûå: ëèíèÿ (îòðåçîê), îêðóæíîñòü, ýëëèïñ, ïðÿìîóãîëüíèê è ìíîãîóãîëüíèê (poly).
à òàêæå èõ äóãè.

Òî÷êà Äëÿ îòðèñîâêè ïåðå÷èñëåííûõ âûøå ïðèìèòèâîâ íåîáõîäèìî óêàçàíèå, â


÷àñòíîñòè, òî÷êè(åê). Òî÷êè çàäàþòñÿ êàê ïàðà ÷èñåë:

1 Point ( 50 , 7 0 ) ; //Çàäàíà òî÷êà ñ êîîðäèíàòàìè 50, 70.

Êîíñòðóêòîð Ïåðâîå ÷èñëî çàäàåò êîîðäèíàòó âäîëü îñè àáñöèññ, à âòîðîå  âäîëü
îñè îðäèíàò. Îòìå÷ó, ÷òî îñü y (îðäèíàò) òðàäèöèîííî ó èçîáðàæåíèé íàïðàâëåíà
âíèç. (Âàæíî ïðè âûâîäå èçîáðàæåíèÿ íà ýêðàí.)
Äîñòóï ê îòäåëüíûì êîìïîíåíòàì îñóùåñòâëÿåòñÿ òàê: p.x p.y

Îòðåçîê Äëÿ âûâîäà ëèíèè íà èçîáðàæåíèè èñïîëüçóåòñÿ ôóíêöèÿ line, êîòî-


ðàÿ ÿâëÿåòñÿ òðàäèöèîííûì íàçâàíèåì ôóíêöèè äëÿ îòðèñîâêè êàê ðàç íå ëèíèé,
à ôàêòè÷åñêè îòðåçêîâ. Èñõîäÿ èç ïîñëåäíåãî îòìå÷åííàÿ ôóíêöèÿ ïðèíèìàåò â
êà÷åñòâå àðãóìåíòîâ êîíöåâûå òî÷êè îòðåçêà â èçîáðàæåíèè, öâåòà è ïàðàìåòðû
ñàìîé ëèíèè.

Ñòðàíèöà 15
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

1 #include <o p e n c v 2 / c o r e / c o r e . hpp>


2 #include <o p e n c v 2 / h i g h g u i / h i g h g u i . hpp>
3 #include <s t r i n g >
4 using namespace cv ;
5 using namespace std ;
6 int main ( int argc , char ∗ argv [])
7 {
8 Mat img ( 3 0 0 , 3 0 0 , CV_8U ) ;
9 img ∗= 0;
10
11 line ( img , Point (50 , 90) , Point (300 , 400) ,
12 Scalar (50 , 100 , 200) );
13
14 imshow ( " Display window " , img );
15 waitKey ( 0 ) ;
16 return 0;
17 }

Ïåðâûå äâà àðãóìåíòà çàäàþò êîíöåâûå êîîðäèíàòû ëèíèè (îòðåçêà). Çàìå÷ó,


÷òî îäíà èç òî÷åê ëåæèò âíå èçîáðàæåíèÿ. Òåì íå ìåíåå îòðåçîê îòðèñîâàí ïóòåì
îòñå÷åíèÿ òåõ ÷àñòåé êîòîðûå îêàçàëèñü âíå èçîáðàæåíèÿ.  áîëåå îáùåì ñëó÷àå,
êàê áûëî ïîêàçàíî âûøå, îáëàñòü îòñå÷åíèÿ ìîæíî ÿâíî çàäàâàòü ñàìèì Mat.
Òàêèì îáðàçîì ïîëó÷èì êîä: ...
Òðåòèé àðãóìåíò çàäàåò öâåò ëèíèè.

Òîëùèíà ëèíèè Ó äàííîé ôóíêöèè (êàê è ó äðóãèõ èç äàííîé ñåðèè, â ÷àñò-


íîñòè, PutText) åù¼ åñòü è íåÿâíûé ïàðàìåòð (â äàííîì ñëó÷àå, ÷åòâåðòûé) çàäà-
þùèé òîëùèíó ëèíèè.

1 line ( img , Point (50 , 90) , Point (300 , 400) ,


2 Scalar (50 , 100 , 200) , 4 );

Òîëùèíà èçìåðÿåòñÿ â êîëè÷åñòâå ïèêñåëåé.

Îêðóæíîñòü Äëÿ âûâîäà îêðóæíîñòè íà èçîáðàæåíèè èñïîëüçóåòñÿ ôóíêöèÿ


circle, êîòîðàÿ ïðèíèìàåò â êà÷åñòâå àðãóìåíòîâ: öåíòð îêðóæíîñòè, ðàäèóñ è
öâåò.

1 circle ( img , Point (100 , 150) , 70 , Scalar (50 , 100 , 200) );

Ñòðàíèöà 16
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

 äàííîì ñëó÷àå áóäåò íàðèñîâàíà îêðóæíîñòü ñ öåíòðîì â òî÷êå (100, 150) ðàäè-
óñà â 70 ïèêñåëåé. Öâåò îêðóæíîñòè áóäåò çàäàí òðîéêîé ÷èñåë (50, 100, 200).
Ïî àíàëîãèè ñî ñõîæèìè ìåòîäàìè ×åòâåðòûé àðãóìåíò çàäàåò òîëùèíó ëè-
íèè. Íî áîëåå èíòåðåñíûì ÿâëÿåòñÿ òî, ÷òî îòðèöàòåëüíàÿ òîëùèíà îáîçíà÷àåò
çàêðàñêó âíóòðåííîñòè îêðóæíîñòè, ò.å. áóäåò íàðèñîâàí êðóã.

rectangle FILLED

Ýëëèïñ

llpoly

1.8 Ñëó÷àéíûå ÷èñëà

Îòðèñîâêà îáúåêòîâ ìîæåò áûòü èñïîëüçîâàíà äëÿ êîððåêòíîãî ïðåäñòàâëåíèÿ


ðåçóëüòàòîâ ðàáîòû ìåòîäà. Íàïðèìåð, äëÿ îáâåäåíèÿ íàéäåííîãî îáúåêòà èëè
ïðè èíòåðàêòèâíîì âûäåëåíèè èñêîìûõ îáúåêòîâ íà èçîáðàæåíèè.
Íî ïîìèìî ïðÿìîãî íàçíà÷åíèÿ îòðèñîâêà îáúåêòîâ ïîçâîëÿåò ôîðìèðîâàòü
ñàìè òåñòîâûå èçîáðàæåíèÿ. Ïîñëåäíåå îçíà÷àåò, ÷òî äëÿ ïðîâåðêè ðàáîòîñïîñîá-
íîñòè íåêîãî ìåòîäà, ìîæíî âçÿòü ôîòî èç æèçíè, à ìîæíî äëÿ íåãî ñèíòåçèðîâàòü
òåñòîâûå èçîáðàæåíèÿ (â ìàøèííîì îáó÷åíèè äàííîå ïîäõîä ïðåâðàùàåòñÿ â àóã-
ìåíòàöèè). Íàïðèìåð, äëÿ ïðîâåðêè ìåòîäà ïîèñêà îêðóæíîñòåé ìîæíî ñîçäàòü
ìíîãî èçîáðàæåíèé íà êîòîðûõ íàðèñîâàíû îêðóæíîñòè.
Äëÿ óïðîùåíèÿ îòìå÷åííîé âûøå ïðîöåäóðó ïîòðåáóþòñÿ ñëó÷àéíûå ÷èñëà.
Îíè êîíå÷íî ñóùåñòâóþò îòäåëüíî êàê â ñòàíäàðòíîé áèáëèîòåêè ÿçûêà Ñ, òàê è
â Ñ++. Íî ëó÷øå èñïîëüçîâàòü âåðñèþ ïðåäîñòàâëÿåìóþ ñàìèì îïåíñâ. Äàííûé
îáúåêò îáîçíà÷åí êàê RNG.
Äëÿ ôîðìèðîâàíèÿ âûáîðêè èç íîðìàëüíîãî ðàñïðåäåëåíèÿ èñïîëüçóåòñÿ ìå-
òîä gaussian äàííîãî îáúåêòà, àðãóìåíò êîòîðîé çàäàåò ñðåäíåå îòêëîíåíèå Ãàóñ-
ñîâîé ñëó÷àéíîé âåëè÷èíû.

1 // Èíèöèàëèçèðóåì ãåðåíàðòîð ñëó÷àéíûõ ÷èñåë:


2 RNG r n g ( 0 x 1 2 3 4 ) ;
3 c o u t << r n g . g a u s s i a n ( 0 . 5 ) << e n d l ;

Êîíñòðóêòîð äàííîãî îáúåêòà ïîçâîëÿåò çàäàòü ïåðâîíà÷àëüíîå çíà÷åíèå ïåðåìåí-


íîé ñòàòóñà. Òàêàÿ âîçìîæíîñòü ïîçâîëÿåò èìåòü ïîâòîðÿåìûé ðåçóëüòàò îò çàïóñ-
êà ê çàïóñêó. Òàê, â êà÷åñòâå îòâåòà âñåãäà äîëæíî ïîëó÷èòñÿ ÷èñëî 0.000148816.
Ïîìèìî gaussian ó êëàññà RNG åñòü è ìåòîä uniform, êîòîðûé ãåíåðèðóåò ðàâ-
íîìåðíóþ ñëó÷àéíóþ âåëè÷èíó.

Ñòðàíèöà 17
Çàìåòêè ïî OpenCV http://ìàøèííîåçðåíèå.ðô

Óïðàæíåíèå. Íàïèøèòå ïðîãðàììó ðèñóþùàÿ îòðåçêè èìåþùèå ñëó÷àéíîå ïî-


ëîæåíèå êîíöîâ âíóòðè èçîáðàæåíèÿ.
Óïðàæíåíèå. Õðàíèòåëü ýêðàíà.
Ïîìèìî äàííîé ôóíêöèè èìååòñÿ è âñïîìîãàòåëüíàÿ, êîòîðàÿ ïîçâîëÿåò çà-
ïîëíèòü âñå èçîáðàæåíèå (â îáùåì ñëó÷àå, âñþ ìàòðèöó) ñëó÷àéíûì ÷èñëàìè.

1 Mat n o i s e = img . c l o n e ( ) ; // Ôîðìèðóåì êîïèþ èçîáðàæåíèÿ.


2 RNG r n g ( 0 x 1 2 3 4 ) ;
3 // Çàïîëíÿåì ìàòðèöó/èçîáðàæåíèå ãàóññîâûì øóìîì:
4 rng . f i l l ( n o i s e , RNG : : NORMAL, 0, 50);

1 img + n o i s e ; // Äîáàâëÿåì ê èçîáðàæåíèþ øóì.

randu??
Óïðàæíåíèå. Ïðåâðàòèòå ýòè êóñêè êîäà â ïðîãðàììó, êîòîðàÿ ê âõîäíîìó
èçîáðàæåíèþ äîáàâëÿåò øóì è ïîêàçûâàåò ðåçóëüòèðóþùåå èçîáðàæåíèå â îêîø-
êå.

Ñòðàíèöà 18