2010-07-16 14 views
18

के कोण के कोण का निर्धारण करें, मैं एक Droid Incredible स्मार्टफ़ोन के कैमरे के क्षेत्र-दृश्य के डिग्री आकार को निर्धारित करने का प्रयास कर रहा हूं। मुझे इस एप्लिकेशन को उस एप्लिकेशन के बारे में जानने की ज़रूरत है जिसे मैं विकसित कर रहा हूं। क्या किसी को पता है कि मैं इसे प्रोग्रामेटिक रूप से कैसे ढूंढ/गणना कर सकता हूं?स्मार्टफोन कैमरा

उत्तर

10

जब तक कि इसके लिए कुछ एपीआई कॉल नहीं है (मैं एक एंड्रॉइड प्रोग्रामर नहीं हूं, मुझे नहीं पता), मैं बस एक ज्ञात दूरी से एक शासक की एक तस्वीर तस्वीर खींचूंगा, देखें कि शासक का कितना दिखाया गया है तस्वीर में, तो this तरह कोण खोजने के लिए त्रिकोणमिति का उपयोग करें:

enter image description here

अब आप आंकड़े से दो दूरी एल और डी की है। कुछ सरल goniometry के साथ, इसे प्राप्त कर सकते हैं:

तन (α/2) = (एल/2)/घ,

इसलिए

α = 2 * atan (एल/2 डी)

तो इस सूत्र के साथ आप अपने कैमरे के क्षैतिज क्षेत्र-दृश्य की गणना कर सकते हैं। बेशक लंबवत f.o.v मापने। ठीक वैसे ही चला जाता है सिवाय इसके कि आपको ऑब्जेक्ट को इसकी ऊर्ध्वाधर स्थिति में देखने की आवश्यकता है।

फिर आप इसे अपने प्रोग्राम में निरंतर के रूप में हार्ड-कोड कर सकते हैं। (निश्चित रूप से नामित एक नाम, इसलिए इसे बदलना आसान होगा: -पी)

+1

बेहतर अभी तक, इसे उपयोगकर्ता-कॉन्फ़िगर करने योग्य बनाएं ताकि लोग जिनके पास Droid Incredible नहीं है, इसे समायोजित/कैलिब्रेट कर सकते हैं। – EboMike

+0

यह मान ज़ूम स्तर के साथ बदल जाएगा। –

+0

@emddudley: सच है, मैंने कभी ज़ूम स्तर वाले फोन के बारे में सोचा नहीं। यद्यपि किसी भी ज़ूम स्तर पर दृश्य कोण दिया गया है, लेकिन किसी अन्य ज़ूम स्तर पर इसकी गणना करना संभव होना चाहिए। –

9

मेरे पास एक Droid अविश्वसनीय भी है। एंड्रॉइड 2.2 ने उन कार्यों को पेश किया जिन्हें आप ढूंढ रहे हैं। मेरे कोड में, मेरे पास है:

public double getHVA() { 
    return camera.getParameters().getHorizontalViewAngle(); 
} 

public double getVVA() { 
    return camera.getParameters().getVerticalViewAngle(); 
} 

हालांकि, इन्हें कैमरे को खोलने की आवश्यकता है। मुझे यह जानने में दिलचस्पी होगी कि क्या उन मूल्यों को प्राप्त करने के लिए हर बार कैमरा खोलने के लिए "सर्वोत्तम अभ्यास" तरीका नहीं है।

@ डेविड ज़ास्लावस्की - कैसे? ज़ूम स्तरों के बीच गणितीय संबंध क्या है? मुझे इसे कहीं भी नहीं मिला (मैंने इस प्रश्न में पूछा: What do the Android camera zoom numbers mathematically represent?)

55

कैमरा। पैरामीटर प्राप्त होरिज़ोंटल व्यूएंगल() और getVerticalViewAngle() फ़ंक्शंस आपको बेस व्यू कोण प्रदान करते हैं। मैं "बेस" कहता हूं, क्योंकि ये केवल एक अनजान स्थिति में कैमरे पर ही लागू होते हैं, और इन कार्यों द्वारा लौटाए गए मान तब भी नहीं बदलते जब दृश्य कोण स्वयं करता है।

Camera.Parameters p = camera.getParameters(); 
double thetaV = Math.toRadians(p.getVerticalViewAngle()); 
double thetaH = Math.toRadians(p.getHorizontalViewAngle()); 

दो बातें अपने "प्रभावी" दृश्य कोण बदलने के लिए कारण: ज़ूम, और एक पूर्वावलोकन पहलू अनुपात कि कैमरे पहलू अनुपात से मेल नहीं खाता का उपयोग कर।

मूलभूत गणित

क्षेत्र के देखने (Θ) की त्रिकोणमिति काफी सरल है:

तन (Θ/2) = एक्स/2z

एक्स = 2z तन (Θ/2)

x दूरी z पर रैखिक दूरी देखने योग्य है; यानी, यदि आप दूरी z = 1 मीटर पर एक शासक आयोजित करते हैं, तो आप उस शासक के एक्स मीटर देख पाएंगे।

उदाहरण के लिए मेरे कैमरे पर, क्षैतिज क्षेत्र दृश्य 52 है।68 डिग्री जबकि लंबवत क्षेत्र दृश्य 40.74 डिग्री है। इन्हें रेडियंस में कनवर्ट करें और उन्हें 100 एम के मनमानी जेड मान के साथ फॉर्मूला में प्लग करें, और आपको 99.0 मीटर (क्षैतिज) और 74.2 मीटर (लंबवत) के x मान मिलते हैं। यह एक 4: 3 पहलू अनुपात है।

ज़ूम

स्तरों ज़ूम करने के लिए इस गणित को लागू करने से थोड़ा कठिन ही है। अब, एक्स निरंतर बना रहता है और यह ज़ेड है जो ज्ञात अनुपात में बदलता है; हमें determine निर्धारित करना होगा।

तन (Θ/2) = एक्स/(2z)

तन (Θ '/ 2) = एक्स/(2z')

Θ '= 2 atan ((z/z ') तन (Θ/2))

कहाँ जेड आधार ज़ूम स्तर (100), z है' वर्तमान ज़ूम स्तर (CameraParameters.getZoomRatios से) है, Θ देखने के आधार क्षैतिज/ऊर्ध्वाधर क्षेत्र है , और Θ 'दृश्य का प्रभावी क्षेत्र है। डिग्री-> रेडियन रूपांतरणों को जोड़ने से यह वर्बोज़ बन जाता है।

private static double zoomAngle(double degrees, int zoom) { 
    double theta = Math.toRadians(degrees); 
    return 2d * Math.atan(100d * Math.tan(theta/2d)/zoom); 
} 

Camera.Parameters p = camera.getParameters(); 
int zoom = p.getZoomRatios().get(p.getZoom()).intValue(); 
double thetaH = zoomAngle(p.getHorizontalViewAngle(), zoom); 
double thetaV = zoomAngle(p.getVerticalViewAngle(), zoom); 

पहलू अनुपात

जबकि ठेठ कैमरा एक 4: 3 और 16:: 3 पहलू अनुपात, पूर्वावलोकन भी 5 में उपलब्ध हो सकती 9 अनुपात और यह वास्तव में विस्तार के द्वारा पूरा किया जा रहा है दृश्य के क्षैतिज क्षेत्र। ऐसा लगता है कि यह अनियंत्रित है, इसलिए अविश्वसनीय है, लेकिन यह मानकर कि यह कैसे काम करता है हम दृश्य के क्षेत्र की गणना कर सकते हैं।

गणित ज़ूम गणनाओं के समान है; हालांकि, इस मामले में ज़ेड स्थिर रहता है और यह एक्स है जो बदलता है। यह मानकर कि ऊर्ध्वाधर दृश्य कोण अपरिवर्तित बनी हुई है जबकि क्षैतिज दृश्य कोण पहलू अनुपात में परिवर्तन के रूप में भिन्न होता है, नए प्रभावी क्षैतिज दृश्य कोण की गणना करना संभव है।

तन (Θ/2) = v/(2z)

तन (Θ '/ 2) = ज/(2z)

2z = v/तन (Θ/2)

Θ '= 2 atan ((ज/v) तन (Θ/2))

यहाँ ज/v पहलू अनुपात है और Θ, देखने के आधार ऊर्ध्वाधर क्षेत्र है, जबकि Θ' है देखने के प्रभावी क्षैतिज क्षेत्र।

Camera.Parameters p = camera.getParameters(); 
int zoom = p.getZoomRatios().get(p.getZoom()).intValue(); 
Camera.Size sz = p.getPreviewSize(); 
double aspect = (double) sz.width/(double) sz.height; 
double thetaV = Math.toRadians(p.getVerticalViewAngle()); 
double thetaH = 2d * Math.atan(aspect * Math.tan(thetaV/2)); 
thetaV = 2d * Math.atan(100d * Math.tan(thetaV/2d)/zoom); 
thetaH = 2d * Math.atan(100d * Math.tan(thetaH/2d)/zoom); 

जैसा कि मैंने ऊपर कहा है, क्योंकि यह अनियंत्रित प्रतीत होता है, यह केवल अनुमान है कि यह सभी उपकरणों पर लागू होगा; इसे एक हैक माना जाना चाहिए। सही समाधान फंक्शंस के एक नए सेट को विभाजित कर देगा, CurrentHorizontalViewAngle और getCurrentVerticalViewAngle।

+1

GetHorizontalViewAngle() और getVerticalViewAngle() परिणाम स्वयं विभिन्न प्रकार के उपकरणों के लिए भरोसा किया जा सकता है? –

+1

क्या कैमरे 2 एपीआई में समान तरीके हैं (getVertical/क्षैतिज दृश्यमान एंजल()? मैंने उन्हें नहीं देखा, और मुझे आश्चर्य हुआ कि अगर मैं उन्हें याद करता हूं, या यदि वे मौजूद नहीं हैं।शायद कैमरा कैरेक्टरिक्स में? – Innova

+0

@ इंनोवा, मैं वही बात सोच रहा हूं - यह हो सकता है कि वे मान अत्यधिक सरल थे, लेकिन मैंने सभी कैमरा 2 दस्तावेज के माध्यम से खोज की है, और मुझे ऐसा करने का कोई आसान तरीका नहीं मिला है। – TonyTheJet

संबंधित मुद्दे