{"id":1846,"date":"2011-05-31T02:27:06","date_gmt":"2011-05-31T00:27:06","guid":{"rendered":"http:\/\/yeti.albascout.ro\/blog\/?p=1846"},"modified":"2011-05-31T02:27:06","modified_gmt":"2011-05-31T00:27:06","slug":"reconstructie-scena-3d-cu-opencv","status":"publish","type":"post","link":"https:\/\/yeti.albascout.ro\/blog\/reconstructie-scena-3d-cu-opencv\/","title":{"rendered":"Reconstruc\u021bie scen\u0103 3D cu OpenCV"},"content":{"rendered":"<p>O idee care mie mi s-a p\u0103rut foarte tare \u0219i pe care am sus\u021binut-o p\u00e2n\u0103 cu o zi \u00eenainte de RobotX a fost folosirea unor camere video (camere de telefoane mobile, spre exemplu ;) ) pe cele trei locuri de baliz\u0103 care sunt disponibile unei echipe la Eurobot, pentru a determina permanent unde sunt obiectele pozi\u021bionate pe mas\u0103. Am mai scris despre ideea asta <a href=\"http:\/\/yeti.albascout.ro\/blog\/?p=1605\">aici<\/a>.<\/p>\n<p>Ideea mi s-a p\u0103rut bun\u0103 pentru c\u0103 (1) masa este colorat\u0103 optim din punct de vedere al contrastului pentru a face computer vision pe ce iese din camere, (2) telefoane mobile ar avea suficient\u0103 putere de procesare, camere suficient de bune \u0219i un factor de form\u0103 ideal pentru ce aveam noi nevoie.<\/p>\n<p>De\u0219i p\u00e2n\u0103 la urm\u0103 solu\u021bia nu a putut fi folosit\u0103 cu <em>Pufo\u0219enia, <\/em>pentru c\u0103 nu am avut vreme s\u0103 o definitiv\u0103m, ni\u0219te rezultate tot am ob\u021binut, \u0219i poate pot p\u0103rea interesante.<!--more--><strong>Ideea de baz\u0103 <\/strong>e simpl\u0103: putem pune trei balize pe mas\u0103. Dou\u0103 \u00een col\u021burile de pe latura scurt\u0103 apropiat\u0103 de zona noastr\u0103 de start, \u0219i una pe jum\u0103tatea laturii opuse. St\u00e2lpii de baliz\u0103 sunt la 35 de cm \u00een\u0103l\u021bime, \u0219i baliza trebuie s\u0103 se \u00eencadreze \u00een 8 x 8 x 16cm.<\/p>\n<p>Ipoteza noastr\u0103 a fost c\u0103, prelu\u00e2nd imagini din cele 3 locuri, putem face cumva s\u0103 reconstruim o privire de deasupra a mesei (sau o vedere completa 2D a suprafe\u021bei de joc).<\/p>\n<p>Ca s\u0103 ne \u00een\u021belegem, am pornit de la ni\u0219te imagini de genul:<\/p>\n<figure id=\"attachment_1847\" aria-describedby=\"caption-attachment-1847\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test3.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1847\" title=\"test3\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test3-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test3-300x225.jpg 300w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test3.jpg 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-1847\" class=\"wp-caption-text\">Colt latura noastra, departe<\/figcaption><\/figure>\n<figure id=\"attachment_1848\" aria-describedby=\"caption-attachment-1848\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1848\" title=\"test2\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test2-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test2-300x225.jpg 300w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test2.jpg 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-1848\" class=\"wp-caption-text\">Colt latura noastra, aproape<\/figcaption><\/figure>\n<figure id=\"attachment_1849\" aria-describedby=\"caption-attachment-1849\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1849\" title=\"test1\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test1-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test1-300x225.jpg 300w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/test1.jpg 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-1849\" class=\"wp-caption-text\">Latura opusa<\/figcaption><\/figure>\n<p>\u00cen mod evident, aveam nevoie de definirea unei func\u021bii de perspectiv\u0103, care s\u0103 transforme imaginile astea \u00een ni\u0219te vederi de deasupra. \u00cen mod la fel de evident, transformarea nu avea cum s\u0103 fie perfect\u0103, pentru c\u0103 pe m\u0103sur\u0103 ce obiectele sunt mai \u00eendep\u0103rtate, avem mai pu\u021bin\u0103 informa\u021bie despre ele.<\/p>\n<p>Aici intervine OpenCV care ne ajut\u0103 foarte mult. O dat\u0103, cu func\u021bia <a href=\"http:\/\/opencv.willowgarage.com\/documentation\/python\/imgproc_geometric_image_transformations.html?highlight=warp#WarpPerspective\">WarpPerspective<\/a>, care aplic\u0103 o transformare unei imaginii pentru a o despacheta, \u0219i apoi cu func\u021bia <a href=\"http:\/\/opencv.willowgarage.com\/documentation\/python\/imgproc_geometric_image_transformations.html?highlight=warp#getperspectivetransform\">GetPerspectiveTransform<\/a> care preg\u0103te\u0219te transformarea plec\u00e2nd de la pozi\u021bia a patru puncte din imaginea ini\u021bial\u0103 \u0219i pozi\u021bia acelorla\u0219i patru puncte \u00een imaginea transformat\u0103.<\/p>\n<p>Este o bucat\u0103 de cod destul de plictisitoare \u00een care se preg\u0103tesc imaginile destina\u021bie, \u0219i se calculeaz\u0103 dimensiunea lor (pentru c\u0103, evident, transformata de perspectiv\u0103 va necesita considerabil mai mult spa\u021biu de desf\u0103\u0219urare). Partea interesant\u0103 din cod e urm\u0103toarea:<\/p>\n<pre lang=\"python\"># aloca matricea de transformare \r\nmmat = cv.CreateMat(3, 3, CV_32FC1)\r\n# puncte din imaginea originala\r\nc1 = ((x_p1, y_p1), (x_p2, y_p2), (x_p3, y_p3), (x_p4, y_p4))\r\n# puncte din imaginea destinatie\r\nc2 = ((x_pd1, y_pd1), (x_pd2, y_pd2), (x_pd3, y_pd3), (x_pd4, y_pd4))\r\n# creeaza matricea (functia) de transformare\r\ncv.GetPerspectiveTransform(c1, c2, mmat)\r\ncv.WarpPerspective(imagine_in, imagine_out, mmat)<\/pre>\n<p>Secretul este la cum se aleg punctele din c1 \u0219i din c2. Ce am f\u0103cut, profit\u00e2nd de modul \u00een care este construit\u0103 masa, am luat unul dintre p\u0103tratele ro\u0219ii (la \u00eent\u00e2mplare) de pe mas\u0103 de referin\u021b\u0103. Am luat coordonatele celor patru col\u021buri (folosind un program de editare grafic\u0103, gen GIMP) \u0219i am imaginat unde ar trebui s\u0103 fie locul lor \u00een imaginea final\u0103. Am \u00eenceput cu imaginea a treia, cea cu vederea de pe latura opus\u0103.<\/p>\n<p>Apoi, pentru c\u0103 obiectivul meu era suprapunerea celor trei imagini, am considerat acela\u0219i p\u0103trat de referin\u021b\u0103 v\u0103zut din cel\u0103lalte dou\u0103 unghiuri, am p\u0103strat vectorul c2 identic, \u0219i am avut grij\u0103 s\u0103 construiesc c1 \u00een a\u0219a fel \u00eenc\u00e2t s\u0103 p\u0103strez ordinea punctelor (adica col\u021bul care era p1 pentru o imagine, s\u0103 fie tot p1 \u0219i \u00een cel\u0103lalte dou\u0103 imagini, chiar dac\u0103 vederea este rotit\u0103).<\/p>\n<p>Rezultatele, crop-uite la tabla de 6 x 6 p\u0103trate (pentru c\u0103 \u00een realitate putem scoate \u0219i din zonele verzi), dup\u0103 transfomare, arat\u0103 cam a\u0219a:<\/p>\n<figure id=\"attachment_1850\" aria-describedby=\"caption-attachment-1850\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1850\" title=\"tmp2\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp2-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp2-300x300.jpg 300w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp2-150x150.jpg 150w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp2.jpg 847w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-1850\" class=\"wp-caption-text\">colt pe latura apropiata, departe<\/figcaption><\/figure>\n<figure id=\"attachment_1851\" aria-describedby=\"caption-attachment-1851\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp3.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1851\" title=\"tmp3\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp3-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp3-300x300.jpg 300w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp3-150x150.jpg 150w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp3.jpg 847w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-1851\" class=\"wp-caption-text\">colt latura aproape, catre baza<\/figcaption><\/figure>\n<figure id=\"attachment_1852\" aria-describedby=\"caption-attachment-1852\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1852\" title=\"tmp1\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp1-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp1-300x300.jpg 300w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp1-150x150.jpg 150w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/tmp1.jpg 847w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-1852\" class=\"wp-caption-text\">latura opusa<\/figcaption><\/figure>\n<p>Se vede clar c\u0103 departe se vede mai aiurea, pentru c\u0103 informa\u021bia este interpolat\u0103, practic dintr-un num\u0103r mic de pixeli de infroma\u021bie din imagine, producem o imagine complet\u0103.<\/p>\n<p>Ok, acum s\u0103 vedem cum facem s\u0103 r\u0103m\u00e2nem numai cu pozi\u021biile concrete ale pionilor, f\u0103r\u0103 s\u0103 fim deranja\u021bi de \u00een\u0103l\u021bimea lor. Dup\u0103 mai multe \u00eencerc\u0103ri, a devenit clar c\u0103 cel mai simplu \u00een acest caz este nu s\u0103 luam spa\u021biul de culori HSV, ci s\u0103 r\u0103m\u00e2nem \u00een BGR, mai concret s\u0103 r\u0103m\u00e2nem doar cu G(reen) &#8211; s\u0103 sc\u0103p\u0103m de ro\u0219u \u0219i de albastru.<\/p>\n<p>Dup\u0103 ce r\u0103m\u00e2nem cu imagine single channel pe verde, putem binariza imaginea asta si sa ramanem doar cu lucrurile interesante. Codul relevant:<\/p>\n<pre lang=\"python\"># img sunt pe rand, imaginile (transformate) de mai sus\r\ntmp_img = cv.CreateImage(cv.GetSize(img), IPL_DEPTH_8U, 1)\r\n# scoatem componenta verde (B[G]R)\r\ncv.Split(img, None, tmp_img, None, None)\r\n# se face binarizarea cu prag fix\r\ncv.Threshold(img, img, 50, 255, CV_THRESH_BINARY)<\/pre>\n<p>\u0218i ob\u021binem ni\u0219te lucruri de genu:<\/p>\n<figure id=\"attachment_1853\" aria-describedby=\"caption-attachment-1853\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/3-tmp.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1853\" title=\"3-tmp\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/3-tmp-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/3-tmp-300x300.jpg 300w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/3-tmp-150x150.jpg 150w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/3-tmp.jpg 847w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-1853\" class=\"wp-caption-text\">vedere dinspre pozitia de start<\/figcaption><\/figure>\n<figure id=\"attachment_1854\" aria-describedby=\"caption-attachment-1854\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/2-tmp.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1854\" title=\"2-tmp\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/2-tmp-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/2-tmp-300x300.jpg 300w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/2-tmp-150x150.jpg 150w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/2-tmp.jpg 847w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-1854\" class=\"wp-caption-text\">vedere dinspre latura apropiata, coltul de &quot;departe&quot;<\/figcaption><\/figure>\n<figure id=\"attachment_1855\" aria-describedby=\"caption-attachment-1855\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/1-tmp.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1855\" title=\"1-tmp\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/1-tmp-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/1-tmp-300x300.jpg 300w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/1-tmp-150x150.jpg 150w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/1-tmp.jpg 847w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-1855\" class=\"wp-caption-text\">vedere de pe latura opusa<\/figcaption><\/figure>\n<p>Ok, acuma evident exist\u0103 \u0219i prostii \u00eentre toate cele. \u0218i de\u0219i pragul \u0103la poate s\u0103 mai fie prelucrat, mai ales \u00eentr-un scenariu real, nu se pot exclude abera\u021biile. \u0218i aici intr\u0103 \u00een partea interesant\u0103.<\/p>\n<p>Ini\u021bial, am vrut s\u0103 facem un AND \u00eentre toate imaginile, \u0219i s\u0103 primim doar un rezultat. Totu\u0219i, f\u0103c\u00e2nd ni\u0219te calcule, am descoperit c\u0103 nu avem suficient\u0103 acoperire \u00eenc\u00e2t s\u0103 luam \u00een considerare DOAR zona comun\u0103 a celor 3 camere.<\/p>\n<p>A\u0219a c\u0103 propunerea final\u0103 a fost s\u0103 facem AND \u00eentre imagini dou\u0103 c\u00e2te dou\u0103, \u0219i apoi s\u0103 facem un sau \u00eentre rezultate, ca s\u0103 avem o singur\u0103 imagine final\u0103. Practic, ar trebui s\u0103 r\u0103m\u00e2n\u0103 orice obiect care este v\u0103zut m\u0103car de dou\u0103 camere. Din fericire, pentru imagini binare, OpenCV are doua functii, And \u0219i Or, care fac exact ce avem nevoie.<\/p>\n<pre lang=\"python\"># and_img este un array format din imaginile de deasupra\r\ncv.And(and_img[0], and_img[1], final_a)\r\ncv.And(and_img[1], and_img[2], final_b)\r\ncv.And(and_img[0], and_img[2], final_c)\r\n\r\ncv.Or(final_a, final_b, final)\r\ncv.Or(final_b, final_c, final)\r\ncv.Or(final_c, final_a, final)<\/pre>\n<p>Imaginea <em>final<\/em> arat\u0103 cam a\u0219a:<\/p>\n<figure id=\"attachment_1856\" aria-describedby=\"caption-attachment-1856\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/final.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1856\" title=\"final\" src=\"http:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/final-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/final-300x300.jpg 300w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/final-150x150.jpg 150w, https:\/\/yeti.albascout.ro\/blog\/wp-content\/uploads\/2011\/05\/final.jpg 847w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-1856\" class=\"wp-caption-text\">un soi de rezultat<\/figcaption><\/figure>\n<p>Care seam\u0103n\u0103 foarte foarte mult cu o oarecare realitate. Sunt sigur c\u0103, cu un pic de tweak-ing, procedura asta poate ajuta puternic la Eurobot de-acum \u00eencolo.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O idee care mie mi s-a p\u0103rut foarte tare \u0219i pe care am sus\u021binut-o p\u00e2n\u0103 cu o zi \u00eenainte de RobotX a fost folosirea unor camere video (camere de telefoane mobile, spre exemplu ;) ) pe cele trei locuri de baliz\u0103 care sunt disponibile unei echipe la Eurobot, pentru a determina permanent unde sunt obiectele &hellip; <a href=\"https:\/\/yeti.albascout.ro\/blog\/reconstructie-scena-3d-cu-opencv\/\" class=\"more-link\">Continu\u0103 s\u0103 cite\u0219ti <span class=\"screen-reader-text\">Reconstruc\u021bie scen\u0103 3D cu OpenCV<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[564,557],"tags":[727,616,731,733,695],"class_list":["post-1846","post","type-post","status-publish","format-standard","hentry","category-roboti","category-facultate","tag-cs-pub","tag-eurobot","tag-eurobot2011","tag-opencv","tag-robot"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts\/1846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/comments?post=1846"}],"version-history":[{"count":2,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts\/1846\/revisions"}],"predecessor-version":[{"id":1858,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts\/1846\/revisions\/1858"}],"wp:attachment":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/media?parent=1846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/categories?post=1846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/tags?post=1846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}