- 1. Сегментација и контуре
- 2. Хијерархија и начин претраживања
- 3. Приближавање контура и проналажење њиховог конвексног трупа
- 4. Конвексни труп
- 5. Подударање контуре по облицима
- 6. Препознавање облика (круг, правоугаоник, троугао, квадрат, звезда)
- 7. Детекција линије
- 8. Откривање мрља
- 9. Филтрирање блобова - бројање кругова и елипса
У претходним водичима користили смо ОпенЦВ за основну обраду слика и извршили неке претходне операције уређивања слика. Као што знамо, ОпенЦВ је Опен Соурце Цоммутер Висион Либрари која има Ц ++, Питхон и Јава интерфејсе и подржава Виндовс, Линук, Мац ОС, иОС и Андроид. Тако да се лако може инсталирати у Распберри Пи са Питхон и Линук окружењем. А Распберри Пи са ОпенЦВ-ом и прикљученом камером може се користити за стварање многих апликација за обраду слика у стварном времену као што су откривање лица, закључавање лица, праћење предмета, откривање регистарске плочице аутомобила, систем кућне безбедности итд. У овом упутству научићемо како то да урадите сегментација слика помоћу ОпенЦВ-а. Операције које ћемо извршити наведене су у наставку:
- Сегментација и контуре
- Режим хијерархије и претраживања
- Приближавање контура и проналажење њиховог конвексног трупа
- Цонек Хулл
- Матцхинг Цонтоур
- Препознавање облика (круг, правоугаоник, троугао, квадрат, звезда)
- Детекција линије
- Откривање мрља
- Филтрирање мрља - бројање кругова и елипса
1. Сегментација и контуре
Сегментација слика је процес којим слике делимо на различите регионе. Док су контуре непрекидне линије или кривине које ограничавају или покривају пуну границу објекта на слици. И овде ћемо користити технику сегментације слике која се назива контуре за издвајање делова слике.
Такође су контуре веома важне у
- Откривање предмета
- Анализа облика
И они имају веома широко поље примене од анализе стварног света до медицинске анализе слика као што је МР
Знајмо како да имплементирамо контуре у опенцв, извлачењем контура квадрата.
импорт цв2 импорт нумпи као нп
Учитајмо једноставну слику са 3 црна квадрата
имаге = цв2.имреад ('скуарес.јпг') цв2.имсхов ('улазна слика', слика) цв2.ваитКеи (0)
Сиве нијансе
сива = цв2.цвтЦолор (слика, цв2.ЦОЛОР_БГР2ГРАИ)
Пронађите смешне ивице
едгед = цв2.Цанни (сива, 30.200) цв2.имсхов ('чврсте ивице', обрубљене) цв2.ваитКеи (0)
Проналажење контура
#користите копију слике, нпр. - едгед.цопи (), јер проналажење контура мења слику # морамо додати _, пре контура као празан аргумент због надоградње верзије ОпенЦВ _, цонтоурс, хиерарцхи = цв2.финдЦонтоурс (обрубљени, цв2.РЕТР_ЕКСТЕРНАЛ, цв2.ЦХАИН_АППРОКС_НОНЕ) цв2.имсхов ('оштри рубови након контуре', обрубљени) цв2.ваитКеи (0)
Штампање датотеке контуре да би се знало које се контуре састоје од
принт (контуре) принт ('Пронађени бројеви контура =' + стр (лен (контуре)))
Нацртајте све контуре
#користите -1 као 3. параметар за цртање свих контура цв2.дравЦонтоурс (слика, контуре, -1, (0,255,0), 3) цв2.имсхов ('контуре', слика) цв2.ваитКеи (0) цв2. уништитиАллВиндовс ()
Излаз конзоле -],],], …,],],]], дтипе = инт32), низ (],],
], …,
],],]], дтипе = инт32), низ (],],], …,],],]], дтипе = инт32)]
Пронађени бројеви контура = 3. Дакле, пронашли смо укупно три контуре.
Сада, у горњем коду који смо такође одштампали датотеку контуре , ова датотека говори како изгледају ове контуре, као што је одштампано у горњем излазу конзоле.
У горњем излазу конзоле имамо матрицу која изгледа као координате к, и тачака. ОпенЦВ чува контуре на листама листа. Једноставно можемо приказати горњи излаз конзоле на следећи начин:
ЦОНТОУР 1 ЦОНТОУР 2 ЦОНТОУР 3
], низ (], низ (],],],],],],],
…,…,…,],],],],],],]], дтипе = инт32),]], дтипе = инт32),]], дтипе = инт32)]
Сада, док користимо функцију дужине у датотеци контуре, добијамо дужину једнаку 3, што значи да су у тој датотеци постојале три листе списка, односно три контуре.
Сада, замислимо да је ЦОНТОУР 1 први елемент у том низу и та листа садржи листу свих координата, а те координате су тачке дуж контура које смо управо видели, као зелени правоугаони оквири.
Постоје различите методе за чување ових координата и оне се зову методе апроксимације, у основи су методе апроксимације две врсте
- цв2.ЦХАИН_АППРОКС_НОНЕ
- цв2.ЦХАИН_АППРОКС_СИМПЛЕ
цв2.ЦХАИН_АППРОКС_НОНЕ чува све граничне тачке, али не морају нам нужно све граничне тачке, ако тачка чини праву линију, требају нам само почетна и завршна тачка на тој линији.
цв2.ЦХАИН_АППРОКС_СИМПЛЕ уместо тога пружа само почетну и крајњу тачку ограничавајућих контура, резултат је много ефикасније чување информација о контурама.
_, контуре, хијерархија = цв2.финдЦонтоурс (обрубљени, цв2.РЕТР_ЕКСТЕРНАЛ, цв2.ЦХАИН_АППРОКС_НОНЕ)
У горе код цв2.РЕТР_ЕКСТЕРНАЛ је преузимање режим, док је цв2.ЦХАИН_АППРОКС_НОНЕ је
метода апроксимације.
Дакле, научили смо о контурама и методи апроксимације, сада истражимо хијерархију и начин проналажења.
2. Хијерархија и начин претраживања
Режим проналажења дефинише хијерархију у контурама попут под контура, или спољне контуре или свих контура.
Сада постоје четири начина претраживања разврстана по типовима хијерархије.
цв2.РЕТР_ЛИСТ - преузима све контуре.
цв2.РЕТР_ЕКСТЕРНАЛ - преузима само спољне или спољне контуре.
цв2.РЕТР_ЦЦОМП - преузима све у хијерархији на 2 нивоа.
цв2.РЕТР_ТРЕЕ - преузима све у пуној хијерархији.
Хијерархија се чува у следећем формату
Сада илуструјмо разлику између прва два начина проналажења, цв2.РЕТР_ЛИСТ и цв2.РЕТР_ЕКСТЕРНАЛ.
импорт цв2 импорт нумпи као нп
Омогућујемо учитавање једноставне слике са 3 црна квадрата
имаге = цв2.имреад ('скуаре донут.јпг') цв2.имсхов ('инпут имаге', имаге) цв2.ваитКеи (0)
Сиве нијансе
сива = цв2.цвтЦолор (слика, цв2.ЦОЛОР_БГР2ГРАИ)
Пронађите Цанни Едгес
едгед = цв2.Цанни (сива, 30.200) цв2.имсхов ('чврсте ивице', обрубљене) цв2.ваитКеи (0)
Проналажење контура
#користите копију ваше слике, нпр. - едгед.цопи (), јер проналажење контура мења слику # морамо додати _, пре контура као празан аргумент због надоградње отворене цв верзије _, цонтоурс, хиерарцхи = цв2.финдЦонтоурс (обрубљени, цв2.РЕТР_ЕКСТЕРНАЛ, цв2.ЦХАИН_АППРОКС_НОНЕ) цв2.имсхов ('чврсте ивице након контуре', обрубљене) цв2.ваитКеи (0)
Штампање датотеке контуре да би се знало које се контуре састоје од.
принт (контуре) принт ('Пронађени бројеви контура =' + стр (лен (контуре)))
Нацртајте све контуре
#користите -1 као 3. параметар за цртање свих контура цв2.дравЦонтоурс (слика, контуре, -1, (0,255,0), 3) цв2.имсхов ('контуре', слика) цв2.ваитКеи (0) цв2. уништитиАллВиндовс
импорт цв2 импорт нумпи као нп
Омогућујемо учитавање једноставне слике са 3 црна квадрата
имаге = цв2.имреад ('скуаре донут.јпг') цв2.имсхов ('инпут имаге', имаге) цв2.ваитКеи (0)
Сиве нијансе
сива = цв2.цвтЦолор (слика, цв2.ЦОЛОР_БГР2ГРАИ)
Пронађите смешне ивице
едгед = цв2.Цанни (сива, 30.200) цв2.имсхов ('чврсте ивице', обрубљене) цв2.ваитКеи (0)
Проналажење контура
#користите копију ваше слике, нпр. - едгед.цопи (), јер проналажење контура мења слику # морамо додати _, пре контура као празан аргумент због надоградње отворене цв верзије _, цонтоурс, хиерарцхи = цв2.финдЦонтоурс (обрубљени, цв2.РЕТР_ЛИСТ, цв2.ЦХАИН_АППРОКС_НОНЕ) цв2.имсхов ('чврсте ивице након контуре', обрубљене) цв2.ваитКеи (0)
Штампање датотеке контуре да би се знало које се контуре састоје од.
принт (контуре) принт ('Пронађени бројеви контура =' + стр (лен (контуре)))
Нацртајте све контуре
#користите -1 као 3. параметар за цртање свих контура цв2.дравЦонтоурс (слика, контуре, -1, (0,255,0), 3) цв2.имсхов ('контуре', слика) цв2.ваитКеи (0) цв2. уништитиАллВиндовс ()
Дакле, кроз демонстрацију горњих кодова могли смо јасно да видимо разлику између цв2.РЕТР_ЛИСТ и цв2.РЕТР_ЕКСТЕРННАЛ , у цв2.РЕТР_ЕКСТЕРННАЛ узимају се у обзир само спољне контуре док се унутрашње контуре игноришу.
Док се у цв2.РЕТР_ЛИСТ такође узимају у обзир унутрашње контуре.
3. Приближавање контура и проналажење њиховог конвексног трупа
У апроксимационим контурама, облик контуре се апроксимира преко другог облика контуре, који можда није толико сличан првом облику контуре.
За приближавање користимо аппрокПолиДП функцију ОпенЦВ што је објашњено у наставку
цв2.аппрокПолиДП (контура, тачност апроксимације, затворено)
Параметри:
- Контура - је појединачна контура коју желимо да приближимо.
- Тачност апроксимације - важан параметар у одређивању тачности апроксимације, мале вредности дају прецизну апроксимацију, велике вредности дају више општих информација. Добро правило палца је мање од 5% обода контуре.
- Затворено - логичка вредност која наводи да ли би приближна контура могла бити отворена или затворена.
Покушајмо да приближимо једноставну фигуру куће
увоз нумпи као нп увоз цв2
Учитајте слику и задржите копију
имаге = цв2.имреад ('хоусе.јпг') ориг_имаге = имаге.цопи () цв2.имсхов ('оригинал имаге', ориг_имаге) цв2.ваитКеи (0)
Сива скала и бинаризујте слику
сива = цв2.цвтЦолор (слика, цв2.ЦОЛОР_БГР2ГРАИ) рет, тхресх = цв2.тхресхолд (сива, 127.255, цв2.ТХРЕСХ_БИНАРИ_ИНВ)
Пронађите контуре
_, контуре, хијерархија = цв2.финдЦонтоурс (тхресх.цопи (), цв2.РЕТР_ЛИСТ, цв2.ЦХАИН_АППРОКС_НОНЕ)
Прелистајте сваку контуру и израчунајте њихов ограничавајући правоугаоник
за ц у контурама: к, и, в, х = цв2.боундингРецт (ц) цв2.рецтангле (ориг_имаге, (к, и), (к + в, и + х), (0,0,255), 2) цв2.имсхов ('Ограничавајући рект', ориг_имаге) цв2.ваитКеи (0)
Прелистајте сваку контуру и израчунајте приближну контуру
за ц у контурама:
# израчунати тачност као проценат тачности обода контуре = 0,03 * цв2.арцЛенгтх (ц, Труе) приближно = цв2.аппрокПолиДП (ц, тачност, тачно) цв2.дравЦонтоурс (слика,, 0, (0,255,0), 2) цв2.имсхов ('Приближно полиДП', слика) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
4. Конвексни труп
Конвексни труп су у основи спољне ивице, представљене цртањем линија преко дате фигуре.
То би могао бити најмањи полигон који може да стане око самог предмета.
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('стар.јпг') греи = цв2.цвтЦолор (имаге, цв2.ЦОЛОР_БГР2ГРАИ) цв2.имсхов ('оригинал имаге', имаге) цв2.ваитКеи (0)
Ограничите слику
рет, тхресх = цв2.тхресхолд (сива, 176.255,0)
Пронађите контуре
_, контуре, хијерархија = цв2.финдЦонтоурс (тхресх.цопи (), цв2.РЕТР_ЛИСТ, цв2.ЦХАИН_АППРОКС_НОНЕ)
Сортирајте контуре по површини, а затим уклоните највећу контуру оквира
н = лен (контуре) -1 контуре = сортирано (контуре, кључ = цв2.цонтоурАреа, реверс = Фалсе)
Прелистајте контуре и нацртајте конвексни труп
за ц у контурама:
труп = цв2.цонвекХулл (ц) цв2.дравЦонтоурс (слика,, 0, (0,255,0), 2) цв2.имсхов ('конвексни труп', слика) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
5. Подударање контуре по облицима
цв2.матцхСхапес (контурни образац, контурна метода, параметар методе)
Излаз - вредност подударања (нижа вредност значи ближе подударање)
шаблон контуре - Ово је наша референтна контура коју покушавамо да пронађемо на новој слици.
контура - појединачна контура против које се проверавамо.
Метод - Тип подударања контура (1,2,3).
параметар методе - оставите на миру као 0.0 (не користи се у питхон опенцв)
импорт цв2 импорт нумпи као нп
Учитајте образац облика или референтну слику
темплате = цв2.имреад ('стар.јпг', 0) цв2.имсхов ('темплате', темплате) цв2.ваитКеи (0)
Учитајте циљану слику облицима са којима покушавамо да се подударамо
таргет = цв2.имреад ('схапестоматцх.јпг') греи = цв2.цвтЦолор (таргет, цв2.ЦОЛОР_БГР2ГРЕИ)
Прво граничите обе слике пре употребе цв2.финдЦонтоурс
рет, тхресх1 = цв2.тхресхолд (предложак, 127,255,0) рет, тхресх2 = цв2.тхресхолд (сиви, 127,255,0)
Пронађите контуре у предлошку
_, контуре, хијерархија = цв2.финдЦонтоурс (тхресх1, цв2.РЕТР_ЦЦОМП, цв2.ЦХАИН_АППРОКС_СИМПЛЕ) # требамо сортирати контуре по површини да бисмо могли уклонити највећу контуру која је
Обрис слике
сортед_цонтоурс = сортед (цонтоурс, кеи = цв2.цонтоурАреа, реверсе = Труе) # извлачимо другу највећу контуру која ће бити наш образац контура темпелате_цонтоур = цонтоурс # ектрацт тхе цонтоурс фром тхе сецонд таргет имаге _, цонтоурс, хиерарцхи = цв2.финдЦонтоурс (тхресх2, цв2.РЕТР_ЦЦОМП, цв2.ЦХАИН_АППРОКС_СИМПЛЕ) за ц у контурама: # пређите кроз сваку контуру на циљаној слици и користите цв2.матцхСхапе за упоређивање подударања облика контуре = цв2.матцхСхапес (темпелате_цонтоур, ц, 1,0.0) принт ("матцх") # ако је вредност подударања мања од 0,15 ако је матцх <0,16: најближа_контура = ц остало: најближа_контура = цв2.дравЦонтоурс (циљ,, - 1, (0,255,0), 3) цв2.имсхов ('оутпут', таргет) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Излаз конзоле -
0,16818605122199104
0,19946910256158912
0.18949760627309664
0.11101058276281539
Постоје три различите методе са различитим математичким функцијама, можемо експериментисати са сваком методом заменом само вредности цв2.матцхСхапес (темпелате_цонтоур, ц, 1, 0.0) која варира од 1,2 и 3, за сваку вредност добићете различито подударање вредности у излазу конзоле.
6. Препознавање облика (круг, правоугаоник, троугао, квадрат, звезда)
ОпенЦВ се такође може користити за аутоматско откривање различитих врста облика са слике. Коришћењем доњег кода моћи ћемо да откријемо круг, правоугаоник, троугао, квадрат и звезде са слике.
импорт цв2 импорт нумпи као нп
Учитајте слике у сивој скали
имаге = цв2.имреад ('схапе.јпг') греи = цв2.цвтЦолор (слика, цв2.ЦОЛОР_БГР2ГРАИ) цв2.имсхов ('идентификовање облика', слика) цв2.ваитКеи (0) рет, тхресх = цв2.тхресхолд (сива, 127,255,1)
Издвој контуре
_, контуре, хијерархија = цв2.финдЦонтоурс (тхресх.цопи (), цв2.РЕТР_ЛИСТ, цв2.ЦХАИН_АППРОКС_НОНЕ)
За цнт у контурама:
Набавите приближне полигоне приближно = цв2. АппрокПолиДП (цнт, 0,01 * цв2.арцЛенгтх (цнт, Труе), Труе) ако је лен (приближно) == 3: схапе_наме = "Триангле" цв2.дравЦонтоурс (слика,, 0, (0,255, 0), - 1)
пронађите контурно средиште за постављање текста у центар
М = цв2.моментс (цнт) цк = инт (М / М) ци = инт (М / М) цв2.путТект (слика, име_ облика, (цк-50, ци), цв2.ФОНТ_ХЕРСХЕИ_СИМПЛЕКС, 1, (0,0, 0), 1) елиф лен (приближно) == 4: к, и, в, х = цв2.боундингРецт (цнт) М = цв2.моментс (цнт) цк = инт (М / М) ци = инт (М / М)
Проверите да ли је четворострани многоугао квадрат или правоугаоник
# цв2.боундингРецт враћа леву ширину и висину у пикселима, почевши од горњег # левог угла, за квадрат би било приближно исто ако је абс (вх) <= 3: схапе_наме = " скуаре " # пронађи контурни центар да се стави текст на центар цв2.дравЦонтоурс (слика,, 0, (0,125,255), - 1) цв2.путТект (слика, име_ облика, (цк-50, ци), цв2.ФОНТ_ХЕРСХЕИ_СИМПЛЕКС, 1, (0,0,0), 1) остало: схапе_наме = "Реацтангле" # пронађи контурни центар за постављање текста у средиште цв2.дравЦонтоурс (слика,, 0, (0,0,255), - 1) М = цв2.моментс (цнт) цк = инт (М / М) ци = инт (М / М) цв2.путТект (слика, назив_имена, (цк-50, ци), цв2.ФОНТ_ХЕРСХЕИ_СИМПЛЕКС, 1, (0,0,0), 1) елиф лен (приближно) == 10: схапе_наме = 'Звезда' цв2.дравЦонтоурс (слика,, 0, (255,255,0), - 1) М = цв2.моментс (цнт) цк = инт (М / М) ци = инт (М / М) цв2.путТект (слика, облик_име, (цк-50, ци), цв2.ФОНТ_ХЕРСХЕИ_СИМПЛЕКС, 1, (0,0,0), 1) елиф лен (приближно)> = 15: схапе_наме = 'цирцле' цв2.дравЦонтоурс (слика,, 0, (0,255,255), -1) М = цв2.моментс (цнт) цк = инт (М / М) ци = инт (М / М) цв2.путТект (слика, име_ облика, (цк-50, ци), цв2.ФОНТ_ХЕРСХЕИ_СИМПЛЕКС, 1, (0,0,0), 1) цв2.имсхов ('идентификовање облика', слика) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
7. Детекција линије
Откривање линија је веома важан концепт у ОпенЦВ- у и има обећавајућу употребу у стварном свету. Аутономни аутомобили користе алгоритме за детекцију линија за откривање трака и путева.
У линијској детекцији бавићемо се са два алгоритма,
- Алгоритам Хоугх линије
- Пробалистички алгоритам Хоугх Лине-а.
Можда сте се сетили приказа линије из математике у средњој школи са једначином, и = мк + ц.
Међутим, у ОпенЦВ линија је представљена на други начин
Једначина изнад ρ = кцосӨ + исинцосӨ је ОпенЦВ приказ линије, при чему је ρ окомита удаљеност линије од исходишта, а Ө угао формиран нормалом ове линије до исходишта (мерено у радијанима, при чему 1пи радијана / 180 = 1 степен).
Функција ОпенЦВ за откривање линије дата је као
цв2.ХоугхЛинес (бинарна слика, ρ тачност, Ө тачност, праг), при чему је праг минимални глас да би се сматрао линијом.
Хајде сада да детектујемо линије за слику кутије уз помоћ функције Хоугх линије у опенцв.
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('бок.јпг')
Извучене ивице сиве и чврсте ивице
сива = цв2.цвтЦолор (слика, цв2.ЦОЛОР_БГР2ГРАИ) ивице = цв2.Цанни (сива, 100.170, апертуреСизе = 3)
Покрените Хоугх линије користећи рхо тачност од 1 пиксела
#та тачност (нп.пи / 180) која је 1 степен # праг линије постављен је на 240 (број тачака на линији) линија = цв2.ХоугхЛинес (ивице, 1, нп.пи / 180, 240) # итерате кроз сваки ред и претворити у формат # потребан цв2.линес (тј. захтевају крајње тачке) за и у опсегу (0, лен (линије)): за рхо, тхета у редовима: а = нп.цос (тхета) б = нп.син (тхета) к0 = а * рхо и0 = б * рхо к1 = инт (к0 + 1000 * (- б)) и1 = инт (и0 + 1000 * (а)) к2 = инт (к0-1000 * (-б)) и2 = инт (и0-1000 * (а)) цв2.лине (слика, (к1, и1), (к2, и2), (0,255,0), 2) цв2.имсхов ('Хоугх линије', слика) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Поновимо сада откривање горње линије са другим алгоритмом пробабилистичке Хоугх линије.
Идеја вероватноће Хоугх линије је да се узме насумични подскуп тачака довољан за откривање линија.
Функција ОпенЦВ за вероватноћа Хоугх линије представљена је као цв2.ХоугхЛинесП (бинарисана слика, ρ тачност, Ө тачност, праг, минимална дужина линије, максималан размак између линија)
Хајде сада да откријемо линије кутија уз помоћ вероватноћа Хоугх линија.
импорт цв2 импорт нумпи као нп
Ивице сивих тонова и љупке ивице Извучене
имаге = цв2.имреад ('бок.јпг') греи = цв2.цвтЦолор (имаге, цв2.ЦОЛОР_БГР2ГРАИ) едге = цв2.Цанни (греи, 50,150, апертуреСизе = 3) # опет користимо исту рхо и тхета тачност # међутим, одредујемо минимални глас (бодова дуж линије) од 100 # и мин дужину линије од 5 пиксела и максимални размак између линија од 10 пиксела линија = цв2.ХоугхЛинесП (ивице, 1, нп.пи / 180,100,100,10) за и у опсегу (0, лен (линије)): за к1, и1, к2, и2 у линијама: цв2.лине (слика, (к1, и1), (к2, и2), (0,255,0), 3) цв2. имсхов ('пробалистичке линије Хоугх-а', слика) цв2.ваитКеи (0) цв2.дестроиАллВиндовс
8. Откривање мрља
Блобс се могу описати као група повезаних пиксела који сви деле заједничко својство. Начин коришћења ОпенЦВ детектора блоб-а описан је кроз овај дијаграм тока.
За цртање кључних тачака користимо цв2.дравКеипоинтс који узима следеће аргументе.
цв2.дравКеипоинтс (улазна слика, кључне тачке, бланк_оутпут_арраи, боја, заставице)
где би у заставама могло бити
цв2.ДРАВ_МАТЦХЕС_ФЛАГС_ДЕФАУЛТ
цв2.ДРАВ_МАТЦХЕС_ФЛАГС_ДРАВ_РИЦХ_КЕИПОИНТС
цв2.ДРАВ_МАТЦХЕС_ФЛАГС_ДРАВ_ОВЕР_ОУТИМГ
цв2.ДРАВ_МАТЦХЕС_ФЛАГС_НОТ_ДРАВ_СИНГЛЕ_ПОИНТС
а празно овде је готово ништа осим једне по једне матрице нула
Извршимо сада детекцију мрља на слици сунцокрета, где би мрље биле централни делови цвећа, јер су уобичајене међу свим цветовима.
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('Сунфловерс.јпг', цв2.ИМРЕАД_ГРАИСЦАЛЕ)
Поставите детектор са подразумеваним параметрима
детектор = цв2.СимплеБлобДетецтор_цреате ()
Откривање мрља
кеипоинтс = детецтор.детецт (слика)
Откривене мрље нацртајте као црвене кругове
# цв2.ДРАВ_МАТЦХЕС_ФЛАГС_ДРАВ_РИЦХ_КЕИПОИНТС осигуравају да # величина круга одговара величини блоб-а бланк = нп.зерос ((1,1)) блобс = цв2.дравКеипоинтс (слика, кључне тачке, празно, (0,255,255), цв2.ДРАВ_МАГЦХЕС_ЛАГАТС_
Прикажи тачке кључа
цв2.имсхов ('блобс', блобс) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Иако код добро функционише, али неке мрље су пропуштене због неуједначених величина цветова, јер су цветови напред велики у поређењу са цветовима на крају.
9. Филтрирање блобова - бројање кругова и елипса
Можемо користити параметре за филтрирање мрља према њиховом облику, величини и боји. За употребу параметара са блоб детектором користимо функцију ОпенЦВ
цв2.СимплеБлобДетецтор_Парамс ()
Видећемо филтрирање блобова углавном према ова четири параметра наведена у наставку:
Површина
парамс.филтерБиАреа = Тачно / Нетачно парамс.минАреа = пиксели парамс.макАреа = пиксели
Кружност
парамс.филтерБиЦирцуларити = Тачно / Нетачно парамс.минЦирцуларити = 1 је савршено, 0 је супротно
Конвексност - Површина мрље / површина конвексног трупа
парамс.филтерБиЦонвекити = Тачно / Нетачно парамс.минЦонвекити = Подручје
Инерција
парамс.филтерБиИнертиа = Тачно / Нетачно парамс.минИнертиаРатио = 0,01
Покушајмо сада да филтрирамо блобс по горе поменутим параметрима
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('блобс.јпг') цв2.имсхов ('оригинал имаге', имаге) цв2.ваитКеи (0)
Иницијализујте детектор помоћу задатих параметара
детектор = цв2.СимплеБлобДетецтор_цреате ()
Откривање мрља
кеипоинтс = детецтор.детецт (слика)
Нацртајте мрље на нашој слици као црвене кругове
бланк = нп.зерос ((1,1)) блобс = цв2.дравКеипоинтс (слика, кључне тачке, празно, (0,0,255), цв2.ДРАВ_МАТЦХЕС_ФЛАГС_ДРАВ_РИЦХ_КЕИПОИНТС) нумбер_оф_блобс = лен (кеипоинтс) тект = "тотал но блобс" + стр (лен (кључне тачке)) цв2.путТект (блобс, тект, (20,550), цв2.ФОНТ_ХЕРСХЕИ_СИМПЛЕКС, 1, (100,0,255), 2)
Прикажите слику са блоб тачкама
цв2.имсхов ('блоб користећи подразумеване параметре', блобс) цв2.ваитКеи (0)
Поставите наше параметре филтрирања
#иницијализујте подешавање параметара помоћу цв2.СимплеБлобДетецтор парамс = цв2.СимплеБлобДетецтор_Парамс ()
Поставите параметре филтрирања подручја
парамс.филтерБиАреа = Истините парамс.минАреа = 100
Поставите параметре филтрирања кружности
парамс.филтерБиЦирцуларити = Истините парамс.минЦирцуларити = 0,9
Поставите параметар филтрирања конвексности
парамс.филтерБиЦонвекити = Лажни парамс.минЦонвекити = 0,2
Поставите параметар филтрирања инерције
парамс.филтерБиИнертиа = Истинити парамс.минИнертиаРатио = 0,01
Направите детектор са параметром
детектор = цв2.СимплеБлобДетецтор_цреате (парамс)
Откривање мрља
кеипоинтс = детецтор.детецт (слика)
Нацртајте мрље на сликама у облику црвених кругова
бланк = нп.зерос ((1,1)) блобс = цв2.дравКеипоинтс (слика, кључне тачке, празно, (0,255,0), цв2.ДРАВ_МАТЦХЕС_ФЛАГС_ДРАВ_РИЦХ_КЕИПОИНТС) нумбер_оф_блобс = лен (кеипоинтс) тект = "тотал но цирцулар блобс" + стр (лен (кључне тачке)) цв2.путТект (блобс, тект, (20,550), цв2.ФОНТ_ХЕРСХЕИ_СИМПЛЕКС, 1, (0,100,255), 2)
Покажи мрље
цв2.имсхов ('филтрирање кружних мрља', блобс) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Дакле, овако се може извршити сегментација слике у Питхон-ОпенЦВ. Да бисте добро разумели рачунарски вид и ОпенЦВ, прођите кроз претходне чланке (Почетак рада са Питхон ОпенЦВ-ом и манипулисањем сликама у Питхон ОпенЦВ-у и моћи ћете да направите нешто кул са Цомпутер Висион-ом.