Բովանդակություն:
- Քայլ 1: Լուսանկարեք
- Քայլ 2: Պատկերները տեղադրեք MATLAB- ում
- Քայլ 3: Պատկերի վերլուծություն
- Քայլ 4. Հաշվարկեք վահանակի սպիտակ քառակուսիների լայնությունը:
- Քայլ 5. Կրկնեք փորձարկման պատկերի 3 -րդ և 4 -րդ քայլերը
- Քայլ 6: Հաշվիր ոսպնյակի խոշորացումը:
- Քայլ 7: Գտնել R- քառակուսին և Օգտատիրոջ դեղատոմսը միջամտության միջոցով
- Քայլ 8. Օգտվողի դեղատոմսը գրաֆիկի վրա ցուցադրելը
- Քայլ 9: Նեղացրեք ձեր դեղատոմսը:
Video: Eyeballing Your Eyeball- ի դեղատոմսը. BME60B նախագիծ. 9 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:45
Հաննա Սիլոս, Սանգ Հի Քիմ, Թոմաս Վասկես, Պատրիկ Վիստ
Խոշորացումը ընթերցման ակնոցների հիմնական հատկություններից մեկն է, որոնք դասակարգվում են ըստ դիոպտերի նշանակման: Ըստ Միչիգանի տեխնոլոգիական համալսարանի, դիոպտերը օբյեկտիվի կիզակետային երկարությունն է, որը սովորաբար չափվում է մմ -ով, մետրերի միավորով (Միչիգանի տեխնոլոգիական համալսարան): Քանի որ ընթերցանության ակնոցներն ունեն ուռուցիկ ոսպնյակներ, կիզակետային հեռավորությունը դրական կլիներ, ինչը կհանգեցներ նաև դիոպտերի դրական լինելուն (HyperPhysics): Կիզակետային երկարությունը մեծանում է, երբ օբյեկտի միջև եղած հեռավորությունը ավելի է հեռանում իրական ոսպնյակից, և դա հանգեցնում է դիոպտերի նվազման, քանի որ դրանք հակադարձ համեմատական են: Հետևաբար, լրացուցիչ դիոպտերներով ընթերցանության ակնոցներ ունենալը կօգնի ոսպնյակին մեծացնել տեսադաշտը, այնպես որ այն կարող է թվալ, թե կիզակետային հեռավորությունն ավելի փոքր է `բարձրացնելով դիոպտերի արժեքը:
Ներկայացված ծածկագիրը կօգտագործվի անհայտ դեղատոմսով ոսպնյակի դիոպտերը կանխատեսելու համար: Դեղատոմսը հաշվարկելու համար օգտագործվում է երկու մուտք ՝ վերահսկվող ֆոնի լուսանկար ՝ առանց ոսպնյակներ օգտագործելու, և նույն ֆոնի մեկ այլ լուսանկար, բայց ընտրության օբյեկտիվի միջոցով: Willրագիրը չափելու է այս երկու լուսանկարների միջև աղավաղումը: Այնտեղից մենք կկարողանանք գնահատել ոսպնյակի դիոպտրիան և արդյունք տալ օգտվողի համար:
Այս հրահանգի համար ձեզ հարկավոր է.
- Սև-սպիտակ շախմատային նախշ ՝ տպված 11x8.5 թղթի վրա
- Տեսախցիկ ՝ իր ֆոկուսը փակելու ունակությամբ
- Եռոտանի կամ նման բան ՝ տեսախցիկն ամրացնելու համար
- Ընթերցանության բաժակների տարբեր դեղատոմսեր
- MATLAB
Քայլ 1: Լուսանկարեք
Ոսպնյակի խոշորացումը հաշվարկելու համար հարկավոր է կարողանալ այն համեմատել օբյեկտի իրական չափի հետ: Այս նախագծի համար մենք համեմատելու ենք խոշորացված պատկերը վերահսկիչ պատկերի հետ:
Այսպիսով, առաջին քայլը նույն լուսանկարից երկու լուսանկար անելն է `առաջինը պարզապես տեսախցիկի միջոցով, իսկ երկրորդը` ընթերցման ակնոցների ոսպնյակի միջոցով, որը ցանկանում եք փորձարկել:
Դուք նկարելու եք 8,5x11in չափսերով սև ու սպիտակ վահանակ ՝ 1 դյույմ ցանցով: Տեղադրեք ձեր տեսախցիկը շախմատային տախտակից 11 հեռավորության վրա: Լուսանկարներ անելուց առաջ կողպեք կենտրոնացումը շախմատային տախտակի վրա:
Լուսանկարեք շախմատային տախտակը ՝ առանց ընթերցանության ակնոցների: Այնուհետեւ, առանց որեւէ բան շարժելու, ընթերցանության ակնոցները տեղադրեք տեսախցիկի առջեւ եւ երկրորդ լուսանկարը կատարեք:
Համոզվեք, որ տեսախցիկի դիրքը չի շարժվում կադրերի միջև: Երկու լուսանկարների միջև միակ բանը, որ պետք է փոխվի, տեսախցիկի առջև դրված ակնոցի ոսպնյակի առկայությունն է:
Երբ ավարտեք լուսանկարները, դրանք վերբեռնեք ձեր համակարգչում:
Քայլ 2: Պատկերները տեղադրեք MATLAB- ում
Բացեք նոր սցենար:
Նախ նշեք գրացուցակը, որտեղ պահվում են լուսանկարները: Այնուհետեւ, օգտագործեք dir գործառույթը:
Dir = 'C: / Users / kuras / Desktop / class / SQ2 / BME60b / Sandbox / testphotos'; GetDir = dir ('*. Jpg');
Մեր նախագծի համար մենք ցանկանում էինք հուշել ծրագրի օգտագործողին, թե որ ֆայլերի հետ են նրանք ցանկանում համեմատել: Առաջին բաժինը օգտվողին խնդրում է նշել վերահսկիչ պատկերը, իսկ երկրորդը `թեստային պատկերը:
- %Հարցրեք օգտվողին, թե որ ֆայլն է կառավարման պատկերը:
- Control = մուտքագրում ('# վերահսկման պատկերի. / N');
- ControlFile = [GetDir (Control).անուն]
- %Հարցրեք օգտվողին, թե որ ֆայլն է պատկերը, որը նա ցանկանում է վերլուծել:
- ChooseFile = մուտքագրում ('\ n# պատկերը, որը ցանկանում եք վերլուծել: / n');
- PrescripFile = [GetDir (ChooseFile). Անունը];
Քայլ 3: Պատկերի վերլուծություն
MATLAB- ում գունավոր պատկերը MxNx3 չափի է, մինչդեռ մոխրագույն մասշտաբի պատկերը MxN է: Սա նշանակում է, որ ավելի արագ է բարելավել/խմբագրել մոխրագույն մասշտաբի պատկերը, քանի որ ավելի քիչ տվյալներ կան հետևելու համար: Օգտագործեք rgb2gray ՝ պատկերը գորշ մասշտաբի փոխարկելու համար: (Իմրոտատ ֆունկցիան օգտագործվել է, քանի որ մեր լուսանկարները հորիզոնական են հայտնվել. Կոդի այս տողը կարող է անհրաժեշտ լինել կամ չլինել ձեր տարբերակում):
- %փոխակերպել մոխրագույնի և պտտել
- I = imread (ControlFile);
- I = rgb2gray (I);
- I = իմոտատ (I, 90);
Հաջորդը, ցուցադրեք պատկերը: Ենթածրագրի գործառույթը օգտագործվում է այնպես, որ փորձարկման պատկերը հետագայում կարողանա լինել կառավարման կողքին:
- %ցուցադրում
- գործիչ (1);
- ենթահող (1, 2, 1)
- ցուցադրել (I);
- վերնագիր (ControlFile);
Օգտագործեք imcrop ՝ օգտվողին հուշելու համար, որ տախտակը կտրի ամբողջական պատկերից: Հետևյալ ծածկագիրը ցույց է տալիս նաև հաղորդագրության տուփ ՝ օգտվողին ցուցումներ տալու համար:
- %կտրատել checkerboard վերլուծության համար
- waitfor (msgbox ({'Օգտագործեք խաչմերուկներ `ստուգիչ տախտակ կտրելու համար:', 'Այնուհետեւ կրկնակի սեղմեք հետաքրքրության տարածքը:'}));
- I_crop = imcrop (I);
Օգտագործեք imbinarize ՝ պատկերը երկուականացնելու համար:
I_binary = imbinarize (I_crop);
Քայլ 4. Հաշվարկեք վահանակի սպիտակ քառակուսիների լայնությունը:
Հաջորդը, օգտագործողին հուշեք գծի գծել պատկերի վրա ՝ օգտագործելով imline: Այս գիծը պետք է հորիզոնական անցնի շախմատային տախտակի վրայով: Այն պետք է սկսվի և ավարտվի սև քառակուսու վրա (նշանակություն չունի, թե որտեղ)- սա այն պատճառով է, որ մենք չափելու ենք ոչ թե սև, այլ սպիտակ քառակուսիների լայնությունը:
- %գծի գիծ
- գործիչ (1)
- ենթահող (1, 2, 1)
- imshow (I_binary);
- waitfor (msgbox ({'Կտտացրեք և քաշեք ՝ 9 տուփեր ընդգրկող գիծ գծելու համար ՝ սև տարածությունից մինչև սև տարածություն:', 'Կրկնակի սեղմեք `հաստատելու համար:'}));
- տող = իմլին;
- դիրք = սպասել (տող);
- վերջնակետեր = line.getPosition;
Քաշված գծի վերջնակետերի համար հանեք X և Y կոդինատները:
- X = վերջնակետեր (:, 1)
- Y = վերջնակետեր (:, 2);
Օգտագործեք improfile ՝ գրաֆիկ ստեղծելու համար ՝ հիմնված գծված գծի երկայնքով հայտնաբերված ինտենսիվության վրա: Սա պետք է նմանվի քառակուսի ալիքի ՝ սկսած 0 -ից (սև) մինչև 1 (սպիտակ): Հաշվիր նաև գագաթները և դրանց գտնվելու վայրը:
- գործիչ (2)
- ենթահող (1, 2, 1)
- վերնագիր ('Պատկերի ինտենսիվությունը անպատշաճ գծի վրայով (Կառավարում)')
- անպատշաճ (I_binary, X, Y); ցանցը միացված է;
- [~, ~, c1,, ~] = անպատշաճ (I_binary, X, Y);
- [գագաթներ, loc] = գտնելու գագաթներ (c1 (:,:, 1));
- սպասիր
- հողամաս (loc, peaks, 'ro');
- հետաձգել
Գտեք յուրաքանչյուր սարահարթի երկարությունը իմպրոֆիլային գրաֆիկի վրա ՝ օգտագործելով for loop: Գործարկեք for loop- ը նույն քանակությամբ գագաթների համար, որոնք կան անպատրաստ գրաֆիկում: Յուրաքանչյուր սարահարթի երկարությունը հաշվարկելու համար օգտագործեք «գտնել» գործառույթը ՝ գտնելու բոլոր այն վայրերը, որտեղ «1» -ի փոխարեն կա «0» ինտենսիվության արժեք: Այնուհետև հաշվարկեք այդ զանգվածի երկարությունը ՝ ստանալու բարձրավանդակի ընդհանուր երկարությունը, որը պետք է հավասար լինի պիքսելներով սպիտակ քառակուսի լայնությանը: ControlPlateauList = զրոներ (1, երկարություն (loc));
i = 1 համար: երկարություն (տեղ)
եթե ես == երկարություն (տեղ)
սարահարթ = գտնել (c1 (loc (i): վերջ,,, 1));
ուրիշ
սարահարթ = գտնել (c1 (loc (i): loc (i+1) -1,,,, 1));
վերջ
ControlPlateauList (i) = երկարություն (սարահարթ);
վերջ
Քայլ 5. Կրկնեք փորձարկման պատկերի 3 -րդ և 4 -րդ քայլերը
*Նշում. Փորձարկման պատկերի վրա անպատշաճ գիծը գծելիս համոզվեք, որ այն գծեք այն քառակուսիներով, որոնք համապատասխանում են վերահսկման պատկերի գծած գծին:
Քայլ 6: Հաշվիր ոսպնյակի խոշորացումը:
Խոշորացված չափումները հաշվարկվում են բարձրավանդակի երկարության միջինը, որը հաշվարկվել է 5 -րդ քայլում, հսկիչ սարահարթի երկարության միջինով, որը հաշվարկվել է 4 -րդ քայլում: Սա հաշվարկված է 1.0884:
խոշորացում = միջին (սարահարթ)/միջին (ControlPlateauList);
Քայլ 7: Գտնել R- քառակուսին և Օգտատիրոջ դեղատոմսը միջամտության միջոցով
Օգտագործելով ծածկագիրը.
- md1 = fitlm (GivenPrescription, MagArray);
- Rsquared = md1. Rsquared. Սովորական;
Մենք կարող ենք գտնել GivenPresciption (մեր ոսպնյակներին տրված արժեքները) գրաֆիկի R- քառակուսու արժեքը ընդդեմ MagArray- ի (ավելի վաղ հաշվարկված խոշորացման չափումների գործակիցների զանգված): Ունենալով բավականաչափ բարձր R- քառակուսի արժեք, կարելի է եզրակացնել, որ գոյություն ունի բավականաչափ ուժեղ հարաբերակցություն ՝ արդարացնելու այս մեթոդի կիրառումը: Այս կոնկրետ դեպքի համար R- քառակուսի արժեքը կազմել է 0.9912, ինչը ենթադրում է ուժեղ փոխկապակցվածություն և, հետևաբար, արդարացված է այս մեթոդը վերլուծության մեջ օգտագործելու մեջ:
Օգտագործելով գործառույթը.
Դեղատոմս = interp1 (MagArray, GivenPrescription, խոշորացում, «գծային»);
Մենք կարող ենք միջամտել մեր խոշորացման հարաբերակցության համապատասխան դեղատոմսի արժեքը (x առանցքի վրա) (արժեքը y առանցքի վրա) և գտնել, թե որն է օգտագործողի դեղատոմսը:
Տվյալների միջամտությունը կարևոր է այս մեթոդի աշխատանքի համար, քանի որ այն թույլ է տալիս մեզ ենթադրություններ անել մեր ունեցած տեղեկատվության վերաբերյալ ՝ հիմնվելով եղած տեղեկատվության վրա: Թեև ամենալավ պիտանի գիծը տեխնիկապես այս ենթադրության համար ավելի ուժեղ թեկնածու կլիներ, ելքերի քանակը նվազեցնելու համար սահմաններ ստեղծելը նույն ազդեցությունն է թողնում, ինչ դեղատոմսով ակնոցները, այնուամենայնիվ, ձեռք են բերում լրացուցիչ միասնական արժեքներ: Սա բացատրվում է հետագա քայլերում:
Քայլ 8. Օգտվողի դեղատոմսը գրաֆիկի վրա ցուցադրելը
Օգտագործելով հետևյալ ծածկագիրը.
- գործիչ;
- սյուժե (GivenPrescription, MagArray, '-g')
- սպասիր
- հողամաս (դեղատոմս, խոշորացում, «bp»)
- հետաձգել
- ցանց
- լեգենդ («Տվյալներ», «Մեջտեղադրված միավորներ», «Տեղակայություն», «ԲԱ»)
Մենք կարող ենք գծել մի գրաֆիկ, որը ցույց է տալիս Կանաչ գծով «Խոշորացման հարաբերակցությունը ընդդեմ տրված դեղատոմսի» և մեր հաշվարկված խոշորացման գտած տվյալները ՝ կապույտ աստղով դեղատոմսի դիմաց: Այնուհետև լեգենդը պիտակավորում է վերնագիրը, x առանցքը և y առանցքը և տեղադրում լեգենդը վերին ձախ անկյունում:
Քայլ 9: Նեղացրեք ձեր դեղատոմսը:
Հետևյալ ծածկագիրը օգտագործվում է դեղատոմսի կլորացման համար.
-
եթե դեղատոմս <= 1.125
CalculatedPrescription = '1.0';
-
elseif Դեղատոմս <= 1.375
CalculatedPrescription = '1.25';
-
elseif Դեղատոմս <= 1.625
CalculatedPrescription = '1.5';
-
elseif Դեղատոմս <= 1.875
CalculatedPrescription = '1.75';
-
elseif Դեղատոմս <= 2.25
CalculatedPrescription = '2.0';
-
elseif Դեղատոմս <= 2.625
CalculatedPrescription = '2.5';
-
elseif Դեղատոմս <= 3
CalculatedPrescription = '2.75';
-
elseif Դեղատոմս <= 3.375
CalculatedPrescription = '3.25';
-
ուրիշ
CalculatedPrescription = 'անհայտ';
- վերջ
Ինտերպոլացիայի միջոցով հայտնաբերված դեղատոմսը պարտադիր չէ, որ արտացոլի իրական դեղատոմսը, քանի որ մարդկային սխալի պատճառով լուսանկարը վերլուծելիս միշտ կլինեն փոքր տատանումներ: Այսպիսով, մեզ անհրաժեշտ է այս քայլը `իրական դեղատոմսը դասակարգելու համար:
Սովորաբար տրվող դեղատոմսերը սկսվում են 1.0 դիոպտերից և դրանց դեղատոմսերում ավելանում են 0.25 -ով, ուստի դեղատոմսը հաշվարկելուց հետո մենք ցանկանում ենք որոշել այն դեղատոմսը, որը լավագույնս համապատասխանում է այն, ինչ օգտվողին կարող է անհրաժեշտ լինել: Դեղատոմսը հաշվարկելուց հետո մենք այն անցնում ենք տրված If հայտարարությունների միջոցով `դրա արժեքը ստուգելու և որոշելու համար, թե որ դեղատոմսն է անհրաժեշտ: Thingանկացած բան պակաս կամ հավասար 1.125 -ի, ապա դեղատոմսը 1.0 է: 1.375 -ից փոքր կամ հավասար ցանկացած բան, դեղատոմսը 1.25 է: Ինչ -որ բան պակաս կամ հավասար 1.625 -ի, դեղատոմսը 1.5 է: 1.845 -ից փոքր կամ հավասար ցանկացած բան, դեղատոմսը 1.75 է: Եվ այսպես շարունակ:
Մեզ մոտ արժեքներն աճում են, քանի որ մենք ստուգում ենք, թե արդյոք արժեքները փոքր են: Եթե մենք անենք արժեքների նվազում, ապա առաջին if հայտարարությունը կկարդա առաջին if հայտարարությունը ամբողջ ժամանակ: Եթե դեղատոմսը ամենափոքրն է, մենք ցանկանում ենք, որ այն անմիջապես ճանաչվի որպես ամենափոքրը, ուստի այդ պատճառով ամենափոքր արժեքն այն է, ինչից սկսել ենք: Ամենաբարձր արժեքից բարձր որևէ բան նշանակում է, որ դեղատոմսը մեր տվյալների տիրույթում չէ, ուստի այն թույլ կտա կարդալ «Անհայտ» տողը:
Խորհուրդ ենք տալիս:
Կենդանիների սննդի ամանի ավտոմատ նախագիծ. 13 քայլ
Կենդանիների սննդի գավաթների ավտոմատ նախագիծ. Այս հրահանգը կներկայացնի և կբացատրի, թե ինչպես կարելի է կառուցել ավտոմատացված, ծրագրավորվող ընտանի կենդանիների սնուցող սարք `կցված սննդի ամաններով: Ես կցել եմ այստեղ տեսանյութ, որը պատկերում է, թե ինչպես են գործում ապրանքները և ինչ տեսք ունի
(IOT նախագիծ) Եղանակի տվյալներ ստացեք ՝ օգտագործելով ESP8266 և Openweather API ՝ 5 քայլ
(IOT նախագիծ) Եղանակի տվյալներ ձեռք բերեք ESP8266- ի և Openweather API- ի միջոցով. Այս ուսանելի ծրագրում մենք պատրաստվում ենք կառուցել մի պարզ IOT նախագիծ, որը մեր քաղաքի եղանակի տվյալները կբերի openweather.com/api կայքից և կցուցադրի այն մշակման ծրագրակազմի միջոցով:
CPE 133 Վերջնական նախագիծ տասնորդականից երկուական `5 քայլ
CPE 133 Վերջնական նախագիծը տասնորդականից երկուական. Երկուական թվերն առաջին բաներից են, որոնք գալիս են մտքում, երբ մտածում ենք թվային տրամաբանության մասին: Այնուամենայնիվ, Երկուական թվերը կարող են դժվար հասկացություն լինել նորեկների համար: Այս նախագիծը կօգնի նրանց, ովքեր և՛ նոր են, և՛ փորձառու երկուական թվերով mas
10 հիմնական Arduino նախագիծ սկսնակների համար: Կատարեք առնվազն 15 նախագիծ մեկ տախտակով: 6 քայլ
10 հիմնական Arduino նախագիծ սկսնակների համար: Կատարեք առնվազն 15 նախագիծ մեկ տախտակով: Arduino Project & Ուսուցողական խորհուրդ; Ներառում է 10 հիմնական Arduino նախագիծ: Բոլոր կոդերը, Gerber ֆայլը և այլն: Ոչ SMD! Հեշտ զոդում բոլորի համար: Հեշտ շարժական և փոխարինելի բաղադրիչներ: Դուք կարող եք կատարել առնվազն 15 նախագիծ մեկ բո
LED լամպի վերազինում Halo 998 Eyeball Trim- ի համար `8 քայլ
LED Bulb Retrofit for Halo 998 Eyeball Trim: Այս հրահանգը նկարագրում է, թե ինչպես փոփոխել Halo 998 ակնագնդի զարդանախշերը `ընդունելու LumiSelect PAR/R16 լուսամփոփ լամպը earthled.com- ից: LED լամպը չափազանց մեծ է տեղավորելու համար հարդարման ակնախնձորի բացման միջով: կտոր, բայց մի փոքր էլֆ