Mundarija:
- 1 -qadam: Rasmga oling
- 2 -qadam: Rasmlarni MATLAB -ga yuklang
- 3 -qadam: tasvirni tahlil qilish
- 4 -qadam: shaxmat taxtasidagi oq kvadratlarning kengligini hisoblang
- 5 -qadam: Sinov tasviri uchun 3 va 4 -qadamlarni takrorlang
- 6 -qadam: Ob'ektivning kattalashishini hisoblang
- 7-qadam: Interpolatsiya orqali R-kvadrat va foydalanuvchi retseptini topish
- 8 -qadam: Foydalanuvchining retseptini grafikda ko'rsatish
- 9 -qadam: retseptingizni toraytiring
Video: Ko'z qorachig'ining retsepti: BME60B loyihasi: 9 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:23
Muallif: Xanna Silos, Sang Xi Kim, Tomas Vaskes, Patrik Viste
Kattalashtirish - ko'zoynak o'qish uchun mavjud bo'lgan asosiy xususiyatlardan biri bo'lib, ular diopterlarning retseptiga ko'ra tasniflanadi. Michigan Texnologiya Universitetining ma'lumotlariga ko'ra, diopter - bu linzalarning fokus uzunligi, odatda mm bilan o'lchanadi, metr birligida (Michigan Texnologiya Universiteti). O'qish ko'zoynaklarining konveks linzalari bo'lgani uchun, fokus uzunligi ijobiy bo'ladi, bu esa diopterlarning ham ijobiy bo'lishiga olib keladi (HyperPhysics). Ob'ekt orasidagi masofa haqiqiy linzadan uzoqlashganda fokus uzunligi oshadi va bu diopterlarni teskari proportsional bo'lgani uchun kamayishiga olib keladi. Shuning uchun, qo'shimcha diopterli o'qish ko'zoynaklari bo'lsa, diopterlar qiymatini oshirib, fokus masofasi qisqaroq bo'lib tuyulishi uchun linzalarning ko'rinishini yaqinlashtirishga yordam beradi.
Taqdim etilgan kod noma'lum retsepti bo'lgan linzalarning diopteriyasini taxmin qilish uchun ishlatiladi. Retseptni hisoblash uchun ikkita kirish ishlatiladi: hech qanday linzalarni ishlatmasdan boshqariladigan fonning fotosurati va bir xil fonda, lekin tanlangan ob'ektiv orqali. Dastur ushbu ikkita fotosurat orasidagi buzilishlarni o'lchaydi. U erdan biz linzalarning diopterini baholay olamiz va foydalanuvchi ko'rishi uchun natija beradi.
Ushbu ko'rsatma uchun sizga kerak bo'ladi:
- 11x8,5 o'lchamdagi qog'ozga bosilgan qora-oq shashka
- Fokusni qulflash qobiliyatiga ega kamera
- Tripod yoki kamerani himoya qilish uchun shunga o'xshash narsa
- O'qish ko'zoynaklarining turli retseptlari
- MATLAB
1 -qadam: Rasmga oling
Ob'ektivning kattalashishini hisoblash uchun siz uni ob'ektning haqiqiy o'lchamiga solishtirishingiz kerak. Ushbu loyiha uchun biz kattalashtirilgan tasvirni nazorat tasviri bilan taqqoslaymiz.
Shunday qilib, birinchi qadam bir xil tasvirning ikkita fotosuratini olishdir - birinchisi - faqat kamera orqali, ikkinchisi - o'qishni xohlagan ko'zoynak linzalari orqali.
Siz 1 dyuymli 8,5x11 dyuymli qora va oq shashka rasmini olasiz. Kamerani shaxmat taxtasidan 11 dyuym masofada joylashtiring. Rasmga tushirishdan oldin, diqqatni shaxmat taxtasiga qulflang.
O'qish ko'zoynagisiz shaxmat taxtasini suratga oling. Keyin, hech narsani qimirlatmasdan, o'qish ko'zoynagini kamera oldiga qo'ying va ikkinchi rasmni oling.
Kameraning joylashuvi tortishish orasida harakat qilmasligiga ishonch hosil qiling. Ikkita fotosurat orasida o'zgarishi kerak bo'lgan yagona narsa - bu kamera oldida ko'zoynak linzalari bo'lishi.
Rasmlar tugagach, ularni kompyuteringizga yuklang.
2 -qadam: Rasmlarni MATLAB -ga yuklang
Yangi skriptni oching.
Birinchidan, fotosuratlar saqlanadigan katalogni ko'rsating. Keyin,-j.webp
Dir = 'C: / Users / kuras / Desktop / classes / SQ2 / BME60b / Sandbox / testphotos'; GetDir = dir ('*. Jpg');
Loyihamiz uchun biz faylni solishtirmoqchi bo'lgan dastur foydalanuvchisiga taklif qilmoqchi edik. Birinchi bo'lim foydalanuvchidan nazorat tasvirini, ikkinchisi esa foydalanuvchidan test tasvirini ko'rsatishni so'raydi.
- %Foydalanuvchidan qaysi rasm boshqaruvchi rasm ekanligini so'rang.
- Control = input ('nazorat tasvirining soni. / N');
- ControlFile = [GetDir (Control).name]
- %Foydalanuvchidan qaysi faylni tahlil qilmoqchi ekanligini so'rang.
- SelectFile = kiritish ('\ n# tahlil qilmoqchi bo'lgan rasm. / N');
- PrescripFile = [GetDir (SelectFile). Nomi];
3 -qadam: tasvirni tahlil qilish
MATLAB -dagi rangli tasvir MxNx3 o'lchamli, kulrang tasvir MxN. Bu shuni anglatadiki, kulrang o'lchovli tasvirni kuchaytirish/tahrir qilish tezroq, chunki uni kuzatib boradigan ma'lumotlar kamroq. Rasmni kul rangga o'tkazish uchun rgb2gray -dan foydalaning. (Imrotate funktsiyasi bizning rasmlarimiz gorizontal holatda bo'lgani uchun ishlatilgan - bu kod satri sizning versiyangizda kerak bo'lishi mumkin yoki bo'lmasligi mumkin.)
- %kul rangga aylanadi va aylanadi
- I = imread (ControlFile);
- I = rgb2gray (I);
- I = imrotat (I, 90);
Keyin rasmni ko'rsating. Subplot funktsiyasi test tasviri keyingi bosqichlarda boshqaruvning yonida bo'lishi uchun ishlatiladi.
- %ko'rsatish
- rasm (1);
- kichik reja (1, 2, 1)
- imshow (I);
- sarlavha (ControlFile);
Imcrop -dan foydalanib, foydalanuvchidan shaxmat taxtasini to'liq tasvirdan olib tashlashni so'rang. Quyidagi kod shuningdek, foydalanuvchiga ko'rsatmalar berish uchun xabar qutisini ko'rsatadi.
- %tahlil qilish uchun shaxmat taxtasini kesib tashlang
- waitfor (msgbox ({'Shaxmat taxtasini kesish uchun kesishgan sochlardan foydalaning.', 'Keyin qiziqish maydonini ikki marta bosing.')));
- I_crop = imcrop (I);
Rasmni binarizatsiya qilish uchun imbinarize -dan foydalaning.
I_binary = imbinarize (I_crop);
4 -qadam: shaxmat taxtasidagi oq kvadratlarning kengligini hisoblang
Keyin, foydalanuvchidan imline yordamida tasvir bo'ylab chiziq chizishni so'rang. Bu chiziq shaxmat taxtasi bo'ylab gorizontal ravishda o'tishi kerak. U qora kvadratdan boshlanishi va tugashi kerak (qaerda bo'lishining ahamiyati yo'q)- chunki biz qora maydonlarni emas, balki oq kvadratlarning kengligini o'lchaymiz.
- %chiziq chizish
- raqam (1)
- kichik reja (1, 2, 1)
- imshow (I_binary);
- waitfor (msgbox ({'Qora bo'shliqdan qora bo'shliqgacha 9 qutini qamrab olgan chiziq chizish uchun bosing va torting.', 'Tasdiqlash uchun ikki marta bosing.')));
- chiziq = imline;
- pozitsiya = kutish (chiziq);
- so'nggi nuqtalar = line.getPosition;
Chizilgan chiziqning oxirgi nuqtalari uchun X va Y koordinatalarini ajratib oling.
- X = oxirgi nuqtalar (:, 1)
- Y = oxirgi nuqtalar (:, 2);
Chizilgan chiziq bo'ylab aniqlangan intensivlikka asoslangan grafikni ishlab chiqarish uchun "noto'g'ri" dan foydalaning. Bu 0 (qora) dan 1 (oq) gacha bo'lgan to'rtburchaklar to'lqinga o'xshash bo'lishi kerak. Cho'qqilar va ularning joylarini ham hisoblang.
- raqam (2)
- kichik reja (1, 2, 1)
- sarlavha ('Tasvirning noto'g'ri chizig'i bo'ylab intensivligi (Boshqarish)')
- nomaqbul (I_binary, X, Y); tarmoq yoqilgan;
- [~, ~, c1, ~, ~] = mos kelmaydigan (I_binary, X, Y);
- [Peaks, loc] = findpeaks (c1 (:,,: 1));
- to'xtab tur
- uchastka (lok, tepaliklar, 'ro');
- ushlab turing
For loop yordamida har bir platoning uzunligini mos bo'lmagan grafikdan toping. Grafikda mavjud bo'lgan bir xil cho'qqilar uchun for loopini ishga tushiring. Har bir platoning uzunligini hisoblash uchun "topish" funktsiyasidan foydalanib, "0" intensivlik o'rniga "1" bo'lgan hamma joylarni toping. So'ngra, oq kvadratning kengligi pikselga teng bo'lishi kerak bo'lgan platoning umumiy uzunligini olish uchun bu qatorning uzunligini hisoblang. ControlPlateauList = nol (1, length (loc));
i = 1 uchun: uzunlik (loc)
agar men == uzunlik (joy)
plato = topish (c1 (loc (i): oxiri,:, 1));
boshqa
plato = topish (c1 (loc (i): loc (i+1) -1,:, 1)));
oxiri
ControlPlateauList (i) = uzunlik (plato);
oxiri
5 -qadam: Sinov tasviri uchun 3 va 4 -qadamlarni takrorlang
*Eslatma: test tasviriga mos bo'lmagan chiziqni chizayotganda, uni nazorat tasviriga chizilgan chiziqqa mos keladigan kvadratlar bo'ylab chizganingizga ishonch hosil qiling.
6 -qadam: Ob'ektivning kattalashishini hisoblang
Kattalashtirilgan o'lchovlar 5 -qadamda hisoblangan platoning uzunligini 4 -bosqichda hisoblangan nazorat platosining uzunligiga bo'linish yo'li bilan hisoblanadi. Bu 1,0884 ga teng.
kattalashtirish = o'rtacha (platoList)/o'rtacha (ControlPlateauList);
7-qadam: Interpolatsiya orqali R-kvadrat va foydalanuvchi retseptini topish
Kodni ishlatish:
- md1 = fitlm (GivenPrescription, MagArray);
- Rsquared = md1. Rsquared. Ordinal;
Biz GivenPresciption (bizning linzalarimiz berilgan qiymatlar) va MagArray (biz ilgari hisoblagan kattalashtirish o'lchovlari nisbatlarining massivi) grafigining R-kvadrat qiymatini topa olamiz. R-kvadratning etarlicha yuqori qiymatiga ega bo'lgan holda, bu usuldan foydalanishni asoslash uchun etarlicha kuchli korrelyatsiya mavjud degan xulosaga kelish mumkin. Bu alohida holat uchun R-kvadrat qiymati 0,9912 edi, bu kuchli korrelyatsiyani ko'rsatadi va shuning uchun tahlilda bu usuldan foydalanishga asos bo'ladi.
Funktsiyadan foydalanish:
Prescription = interp1 (MagArray, GivenPrescription, kattalashtirish, 'chiziqli');
Biz kattalashtirish koeffitsientining mos keladigan retsept qiymatini (x o'qida) interpolatsiya qilishimiz mumkin (y o'qidagi qiymat) va foydalanuvchining retsepti nima ekanligini bilib olamiz.
Bu usulning ishlashi uchun interpolyatsiya ma'lumotlari muhim ahamiyatga ega, chunki bizda mavjud bo'lmagan ma'lumotlarga asoslanib, bizda mavjud bo'lmagan ma'lumotlar haqida taxmin qilish mumkin. Texnik jihatdan bu taxminga eng mos keladigan chiziq texnik jihatdan kuchliroq nomzod bo'lardi, lekin chiqish sonini kamaytirish uchun chegaralar yaratish xuddi shunday ta'sir ko'rsatadi, chunki ko'zoynak bir xil qiymatga ega. Bu keyingi bosqichlarda tushuntiriladi.
8 -qadam: Foydalanuvchining retseptini grafikda ko'rsatish
Quyidagi kod yordamida:
- raqam;
- syujet (GivenPrescription, MagArray, '-g')
- to'xtab tur
- syujet (retsept, kattalashtirish, "bp")
- ushlab turing
- panjara
- afsona ("Ma'lumotlar", "Interpolatsiyalangan nuqtalar", "Manzil", "NW")
Biz kattalashtirish nisbatlarini berilgan retsept bo'yicha yashil chiziq bilan ko'rsatadigan grafikni va ko'k yulduzli interpolatsiyalangan retseptimizga nisbatan hisoblangan kattalashtirish ma'lumotlarini chizishimiz mumkin. Keyin afsona sarlavha, x o'qi va y o'qini belgilaydi va afsonani chap yuqori burchakka qo'yadi.
9 -qadam: retseptingizni toraytiring
Retseptni yaxlitlash uchun quyidagi kod ishlatiladi:
- agar retsept <= 1.125 bo'lsa
CalculatedPrescription = '1.0';
-
elseif retsept <= 1.375
CalculatedPrescription = '1.25';
-
elseif retsept <= 1.625
CalculatedPrescription = '1.5';
-
elseif retsept <= 1.875
CalculatedPrescription = '1,75';
-
elseif retsept <= 2.25
CalculatedPrescription = '2.0';
-
elseif retsept <= 2.625
CalculatedPrescription = '2.5';
-
elseif retsept <= 3
CalculatedPrescription = '2.75';
-
elseif retsept <= 3.375
CalculatedPrescription = '3.25';
- boshqa
CalculatedPrescription = 'noma'lum';
- oxiri
Interpolatsiya orqali topilgan retsept, albatta, haqiqiy retseptni aks ettirmaydi - buning sababi shundaki, inson xatosi tufayli fotosuratni tahlil qilishda har doim ozgina farqlar bo'ladi. Shunday qilib, haqiqiy retseptni tasniflash uchun bizga bu qadam kerak.
Beriladigan retseptlar odatda 1,0 diopterdan boshlanadi va retsept bo'yicha.25 ga ko'payadi, shuning uchun retseptni hisoblagandan so'ng biz foydalanuvchiga kerak bo'lishi mumkin bo'lgan retseptni aniqlamoqchimiz. Retseptni hisoblab chiqqandan so'ng, biz uning qiymatini tekshirish va qaysi retsept zarurligini aniqlash uchun berilgan If iboralaridan o'tamiz. Hamma narsa 1.125 dan kichik yoki unga teng bo'lsa, retsept 1,0 ga teng. 1.375 dan kam yoki teng bo'lgan narsa, retsept 1.25. 1.625 dan kam yoki teng bo'lgan narsa, retsept 1,5 ga teng. Har qanday narsa 1,845 dan kam yoki teng bo'lsa, retsept 1,75 ni tashkil qiladi. Va hokazo.
Bizda qiymatlar o'sib bormoqda, chunki biz qiymatlar kichikroqligini tekshiramiz. Agar biz qiymatlarni kamaytirgan bo'lsak, birinchi if iborasi har doim birinchi if ifodasini o'qiydi. Agar retsept eng kichik bo'lsa, biz uni darhol eng kichigi deb tan olishni xohlaymiz, shuning uchun eng kichik qiymat biz boshlagan narsadir. Eng yuqori qiymatdan yuqori bo'lgan narsa, retsept bizning ma'lumotlarga mos kelmasligini anglatadi, shuning uchun u "Noma'lum" satr o'qilishini beradi.
Tavsiya:
Zigbee yotog'ining borligini aniqlovchi: 8 qadam
Zigbi to'shagining borligi detektori: Men bir muncha vaqtdan beri yotoqda ekanligimizni aniqlash usulini qidirardim. Bu ma'lumotni Homeassistant -da ishlatish uchun. Ushbu ma'lumot bilan men kechasi chiroqlarni o'chirish uchun avtomatlashtirishni amalga oshirishim mumkin yoki masalan, uyimda signalizatsiya tizimini ishga tushirishim mumkin edi
Yo'ldosh qutisining retsepti (apparat remixi / elektron bükme): 11 qadam (rasmlar bilan)
Yo'ldosh qutisi retsepti (Uskuna remixi / O'chirish): Uskuna remixi-bu musiqiy texnologiyalarning imkoniyatlarini qayta ko'rib chiqish usuli. Hamrohlik qutilari - bu elektron bükülmüş DIY elektron musiqa asboblari. Ular chiqaradigan tovushlar ishlatiladigan sxemaga bog'liq. Men ishlab chiqargan qurilmalar ko'p effektli
Poyezd o'rindig'ining ko'rsatkichi: 6 qadam
Poezd o'rindig'ining ko'rsatkichi: Bu siz bilan sodir bo'ladimi? Poyezdning old qismida odamlar turishi kerak, poezdning oxirgi qismida esa bo'sh stullar ko'p. Agar poyezd tashqarisida qancha o'rindiq bo'sh ekanligini ko'rsatuvchi belgi bo'lsa nima bo'lardi
Havo miltig'ining xronografi, xronoskopi. 3D bosma: 13 qadam
Havo miltig'ining xronografi, xronoskopi. 3D bosma: Hammaga salom, bugun biz 2010 yilda qilgan loyihani qayta ko'rib chiqamiz. Havo miltig'ining xronografi. Bu qurilma sizga raketaning tezligini aytib beradi. Pellet, BB yoki hatto havo yumshoq BB plastik to'pi. 2010 yilda men o'yin -kulgi uchun pnevmatik miltiq sotib oldim. Bankalarga urishdi, b
DIY aqlli to'pig'ining og'irligi: 5 qadam
DIY aqlli oyoq Bilagi zo'r vazn: Siz hayotingizda to'piqdan foydalangan bo'lishingiz mumkin. Ular oyoqlaringizni kuchliroq qiladi, yugurish tezligingizni oshiradi va hatto sizni yanada faol qiladi. Biroq, siz hech qachon to'piq vaznidan ma'lumot to'play olmaysiz. Siz mashqlar uchun o'z maqsadlaringizni qo'yolmaysiz va bunga erisha olmaysiz