আউটপুট স্ট্রীম, ক্রপিং এবং জুম

আউটপুট স্ট্রীম

ক্যামেরা সাবসিস্টেম সমস্ত রেজোলিউশন এবং আউটপুট ফর্ম্যাটের জন্য শুধুমাত্র ANativeWindow-ভিত্তিক পাইপলাইনে কাজ করে। একাধিক টার্গেট যেমন GPU, ভিডিও এনকোডার, রেন্ডারস্ক্রিপ্ট বা অ্যাপ-দৃশ্যমান বাফার (RAW Bayer, প্রক্রিয়াকৃত YUV বাফার, বা JPEG-এনকোডেড বাফার) এর মতো অনেকগুলি লক্ষ্যে একটি একক ফ্রেম পাঠাতে একাধিক স্ট্রীম একবারে কনফিগার করা যেতে পারে।

একটি অপ্টিমাইজেশান হিসাবে, এই আউটপুট স্ট্রীমগুলিকে অবশ্যই সময়ের আগে কনফিগার করতে হবে এবং একবারে শুধুমাত্র একটি সীমিত সংখ্যা থাকতে পারে৷ এটি মেমরি বাফারগুলির প্রাক-বরাদ্দকরণ এবং ক্যামেরা হার্ডওয়্যারের কনফিগারেশনের অনুমতি দেয়, যাতে তালিকাভুক্ত একাধিক বা বিভিন্ন আউটপুট পাইপলাইনের সাথে অনুরোধগুলি জমা দেওয়া হলে, অনুরোধটি পূরণ করতে বিলম্ব বা বিলম্ব না হয়।

সমর্থিত হার্ডওয়্যার স্তরের উপর নির্ভর করে এমন গ্যারান্টিযুক্ত স্ট্রিম আউটপুট সংমিশ্রণ সম্পর্কে আরও তথ্যের জন্য, createCaptureSession() দেখুন।

ক্রপিং

সম্পূর্ণ পিক্সেল অ্যারের ক্রপিং (ডিজিটাল জুম এবং অন্যান্য ব্যবহারের ক্ষেত্রে যেখানে একটি ছোট FOV পছন্দসই) ANDROID_SCALER_CROP_REGION সেটিং এর মাধ্যমে যোগাযোগ করা হয়। এটি প্রতি-অনুরোধের সেটিং, এবং প্রতি-অনুরোধের ভিত্তিতে পরিবর্তন হতে পারে, যা মসৃণ ডিজিটাল জুম বাস্তবায়নের জন্য গুরুত্বপূর্ণ।

অঞ্চলটিকে একটি আয়তক্ষেত্র (x, y, প্রস্থ, উচ্চতা) হিসাবে সংজ্ঞায়িত করা হয়েছে, যেখানে (x, y) আয়তক্ষেত্রের উপরের-বাম কোণে বর্ণনা করা হয়েছে। আয়তক্ষেত্রটি সেন্সর সক্রিয় পিক্সেল অ্যারের স্থানাঙ্ক সিস্টেমে সংজ্ঞায়িত করা হয়েছে, (0,0) সক্রিয় পিক্সেল অ্যারের শীর্ষ-বাম পিক্সেল। অতএব, প্রস্থ এবং উচ্চতা ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY স্ট্যাটিক ইনফো ফিল্ডে রিপোর্ট করা মাত্রার চেয়ে বড় হতে পারে না। সর্বনিম্ন অনুমোদিত প্রস্থ এবং উচ্চতা HAL দ্বারা ANDROID_SCALER_MAX_DIGITAL_ZOOM স্ট্যাটিক তথ্য ক্ষেত্রের মাধ্যমে রিপোর্ট করা হয়, যা সর্বাধিক সমর্থিত জুম ফ্যাক্টর বর্ণনা করে। অতএব, ন্যূনতম ফসল অঞ্চলের প্রস্থ এবং উচ্চতা হল:

  {width, height} =
   { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM),
     floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM) }

যদি শস্য অঞ্চলের নির্দিষ্ট প্রয়োজনীয়তাগুলি পূরণ করতে হয় (উদাহরণস্বরূপ, এটিকে জোড় স্থানাঙ্কে শুরু করতে হবে এবং এর প্রস্থ/উচ্চতা সমান হওয়া প্রয়োজন), এইচএএলকে অবশ্যই প্রয়োজনীয় রাউন্ডিং করতে হবে এবং আউটপুটে ব্যবহৃত চূড়ান্ত ফসল অঞ্চলটি লিখতে হবে। ফলাফল মেটাডেটা। একইভাবে, যদি HAL ভিডিও স্থিতিশীলতা প্রয়োগ করে, তাহলে ভিডিও স্থিতিশীলতা প্রয়োগ করার পরে আউটপুটে প্রকৃতপক্ষে অন্তর্ভুক্ত অঞ্চলটি বর্ণনা করার জন্য ফলাফল ক্রপ অঞ্চলটিকে অবশ্যই সামঞ্জস্য করতে হবে। সাধারণভাবে, একটি ক্যামেরা-ব্যবহারকারী অ্যাপ অবশ্যই ক্রপ অঞ্চল, ইমেজ সেন্সরের মাত্রা এবং লেন্সের ফোকাল দৈর্ঘ্যের উপর ভিত্তি করে প্রাপ্ত দৃশ্যের ক্ষেত্র নির্ধারণ করতে সক্ষম হবে।

যেহেতু শস্য অঞ্চলটি সমস্ত স্ট্রীমের জন্য প্রযোজ্য, যেগুলির আকৃতির অনুপাত শস্য অঞ্চলের থেকে আলাদা হতে পারে, তাই প্রতিটি স্ট্রিমের জন্য ব্যবহৃত সঠিক সেন্সর অঞ্চলটি ফসল অঞ্চলের চেয়ে ছোট হতে পারে৷ বিশেষত, প্রতিটি স্ট্রীমের বর্গাকার পিক্সেল এবং এর আকৃতির অনুপাত বজায় রাখা উচিত সংজ্ঞায়িত শস্য অঞ্চলকে ন্যূনতমভাবে আরও ক্রপ করে। যদি স্ট্রিমের আকৃতির অনুপাত ফসলের অঞ্চলের চেয়ে প্রশস্ত হয়, তাহলে স্ট্রীমটিকে আরও উল্লম্বভাবে ক্রপ করা উচিত, এবং যদি স্ট্রিমের আকৃতির অনুপাত ফসলের অঞ্চলের চেয়ে সংকীর্ণ হয়, তাহলে স্ট্রীমটিকে আরও অনুভূমিকভাবে ক্রপ করা উচিত৷

সব ক্ষেত্রে, স্ট্রিম ক্রপ অবশ্যই পূর্ণ শস্য অঞ্চলের মধ্যে কেন্দ্রীভূত হতে হবে, এবং প্রতিটি স্ট্রীম শুধুমাত্র অনুভূমিকভাবে বা উল্লম্বভাবে পূর্ণ শস্য অঞ্চলের সাপেক্ষে ক্রপ করা হয়, উভয়ই নয়।

উদাহরণস্বরূপ, যদি দুটি স্ট্রীম সংজ্ঞায়িত করা হয়, একটি 640x480 স্ট্রীম (4:3 দিক), এবং একটি 1280x720 স্ট্রীম (16:9 দিক), নীচে কয়েকটি নমুনা ক্রপ অঞ্চলের জন্য প্রতিটি স্ট্রিমের জন্য প্রত্যাশিত আউটপুট অঞ্চলগুলি দেখায়, একটি অনুমানিক 3-এ এমপি (2000 x 1500 পিক্সেল অ্যারে) সেন্সর।

ফসলের অঞ্চল: (500, 375, 1000, 750) (4:3 আকৃতির অনুপাত)
640x480 স্ট্রিম ক্রপ: (500, 375, 1000, 750) (ফসল অঞ্চলের সমান)
1280x720 স্ট্রিম ক্রপ: (500, 469, 1000, 562)

ফসল-অঞ্চল-43-অনুপাত

চিত্র 1. 4:3 আকৃতির অনুপাত

ফসলের অঞ্চল: (500, 375, 1333, 750) (16:9 আকৃতির অনুপাত)
640x480 স্ট্রিম ক্রপ: (666, 375, 1000, 750)
1280x720 স্ট্রিম ক্রপ: (500, 375, 1333, 750) (ফসল অঞ্চলের সমান)

ফসল-অঞ্চল-169-অনুপাত

চিত্র 2. 16:9 আকৃতির অনুপাত

ফসলের অঞ্চল: (500, 375, 750, 750) (1:1 আকৃতির অনুপাত)
640x480 স্ট্রিম ক্রপ: (500, 469, 750, 562)
1280x720 স্ট্রিম ক্রপ: (500, 543, 750, 414)

ফসল-অঞ্চল-11-অনুপাত

চিত্র 3. 1:1 আকৃতির অনুপাত

এবং একটি চূড়ান্ত উদাহরণ, 480p স্ট্রিমের পরিবর্তে একটি 1024x1024 বর্গক্ষেত্র অনুপাত স্ট্রীম:
ফসলের অঞ্চল: (500, 375, 1000, 750) (4:3 আকৃতির অনুপাত)
1024x1024 স্ট্রিম ক্রপ: (625, 375, 750, 750)
1280x720 স্ট্রিম ক্রপ: (500, 469, 1000, 562)

ফসল-অঞ্চল-43-বর্গ-অনুপাত

চিত্র 4. 4:3 অনুপাত, বর্গক্ষেত্র

রিপ্রসেসিং

RAW Bayer ডেটার জন্য রিপ্রসেসিং সমর্থন দ্বারা কাঁচা চিত্র ফাইলগুলির জন্য অতিরিক্ত সমর্থন প্রদান করা হয়। এই সমর্থন ক্যামেরা পাইপলাইনকে একটি নতুন রেন্ডার করা YUV বা JPEG আউটপুট তৈরি করতে পূর্বে ক্যাপচার করা RAW বাফার এবং মেটাডেটা (একটি সম্পূর্ণ ফ্রেম যা আগে রেকর্ড করা হয়েছিল) প্রক্রিয়া করতে দেয়।

জুম

অ্যান্ড্রয়েড 11 বা উচ্চতর সংস্করণে চলমান ডিভাইসগুলির জন্য, একটি অ্যাপ ANDROID_CONTROL_ZOOM_RATIO সেটিংসের মাধ্যমে ক্যামেরার জুম (ডিজিটাল এবং অপটিক্যাল) ব্যবহার করতে পারে।

জুম অনুপাত একটি ফ্লোটিং পয়েন্ট ফ্যাক্টর হিসাবে সংজ্ঞায়িত করা হয়. ক্রপ এবং জুমের জন্য ANDROID_SCALER_CROP_REGION ব্যবহার করার পরিবর্তে, একটি অ্যাপ জুম স্তর নিয়ন্ত্রণ করতে ANDROID_CONTROL_ZOOM_RATIO ব্যবহার করতে পারে এবং নেটিভ ক্যামেরার থেকে ভিন্ন আকৃতির অনুপাত অর্জন করতে অনুভূমিক এবং উল্লম্ব ক্রপিংয়ের জন্য ANDROID_SCALER_CROP_REGION ব্যবহার করতে পারে৷

একটি মাল্টি-ক্যামেরা সিস্টেমে বিভিন্ন ফোকাল দৈর্ঘ্য সহ একাধিক লেন্স থাকতে পারে এবং ব্যবহারকারী লেন্সগুলির মধ্যে স্যুইচ করে অপটিক্যাল জুম ব্যবহার করতে পারেন। নীচের পরিস্থিতিতে ANDROID_CONTROL_ZOOM_RATIO ব্যবহার করার সুবিধা রয়েছে:

  • একটি প্রশস্ত লেন্স থেকে টেলিফটো লেন্সে জুম করা: একটি ফ্লোটিং পয়েন্ট অনুপাত ANDROID_SCALER_CROP_REGION এর পূর্ণসংখ্যা মানের তুলনায় আরও ভাল নির্ভুলতা প্রদান করে।
  • চওড়া লেন্স থেকে আল্ট্রাওয়াইড লেন্সে জুম আউট করা: ANDROID_CONTROL_ZOOM_RATIO জুম-আউট (<1.0f) সমর্থন করে যেখানে ANDROID_SCALER_CROP_REGION করে না।

ব্যাখ্যা করার জন্য, এখানে পূর্ববর্তী বিভাগে সংজ্ঞায়িত একই অনুমানমূলক ক্যামেরা ব্যবহার করে বিভিন্ন জুম অনুপাত, ক্রপ অঞ্চল এবং আউটপুট স্ট্রীমের বেশ কয়েকটি দৃশ্য রয়েছে।

জুম অনুপাত: 2.0; মূল ক্ষেত্র অফ ভিউ এর 1/4
ক্রপ অঞ্চল: (0, 0, 2000, 1500) (4:3 আকৃতির অনুপাত)
640x480 স্ট্রিম ক্রপ: (0, 0, 2000, 1500) (ফসল অঞ্চলের সমান)
1280x720 স্ট্রিম ক্রপ: (0, 187, 2000, 1125)

জুম-অনুপাত-2-ফসল-43

চিত্র 5. 2.0 জুম, 4:3 অনুপাত

জুম অনুপাত: 2.0; মূল ক্ষেত্র অফ ভিউ এর 1/4
ক্রপ অঞ্চল: (0, 187, 2000, 1125) (16:9 আকৃতির অনুপাত)
640x480 স্ট্রিম ক্রপ: (250, 187, 1500, 1125) (স্তম্ভযুক্ত)
1280x720 স্ট্রিম ক্রপ: (0, 187, 2000, 1125) (ফসল অঞ্চলের সমান)

জুম-অনুপাত-2-ফসল-169

চিত্র 6. 2.0 জুম, 16:9 অনুপাত

জুম অনুপাত: 0.5; 4x মূল ক্ষেত্র অব ভিউ (ওয়াইড লেন্স থেকে আল্ট্রাওয়াইড লেন্সে স্যুইচ করা হয়েছে)
ক্রপ অঞ্চল: (250, 0, 1500, 1500) (1:1 আকৃতির অনুপাত)
640x480 স্ট্রিম ক্রপ: (250, 187, 1500, 1125) (লেটারবক্সযুক্ত)
1280x720 স্ট্রিম ক্রপ: (250, 328, 1500, 844) (লেটারবক্সযুক্ত)

ছবি/জুম-অনুপাত-0.5-ক্রপ-11

চিত্র 7. 0.5 জুম, 1:1 অনুপাত

উপরের গ্রাফগুলি থেকে যেমন দেখা যায়, ক্রপ অঞ্চলের স্থানাঙ্ক সিস্টেমটি কার্যকরী জুম পরবর্তী দৃশ্যের ক্ষেত্রে পরিবর্তিত হয় এবং নিম্নলিখিত মাত্রাগুলির সাথে আয়তক্ষেত্র দ্বারা প্রতিনিধিত্ব করা হয়: ( 0 , 0 , activeArrayWith , activeArrayHeight )। একই AE/AWB/AF অঞ্চল এবং মুখের ক্ষেত্রে প্রযোজ্য। এই স্থানাঙ্ক সিস্টেম পরিবর্তনটি RAW ক্যাপচার এবং এর সাথে সম্পর্কিত মেটাডেটা যেমন intrinsicCalibration এবং lensShadingMap ক্ষেত্রে প্রযোজ্য নয়।

উপরের একই অনুমানমূলক উদাহরণ ব্যবহার করে, এবং আউটপুট স্ট্রীম #1 (640x480) হল ভিউফাইন্ডার স্ট্রীম, 2.0x জুম দুটি উপায়ের মধ্যে একটিতে অর্জন করা যেতে পারে:

  • zoomRatio = 2.0 , scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (ডিফল্ট), scaler.cropRegion = (500, 375, 1000, 750)

একটি অ্যাপের জন্য android.control.aeRegions ভিউফাইন্ডার ফিল্ড অফ ভিউ-এর উপরের-বাম কোয়ার্টারে সেট করতে, android.control.aeRegions এর সাথে android.control.zoomRatio কে (0, 0, 1000, 750) সেট করুন 2.0 বিকল্পভাবে, অ্যাপটি 1.0 এর android.control.zoomRatio এর জন্য (500, 375, 1000, 750) এর সমতুল্য অঞ্চলে android.control.aeRegions সেট করতে পারে।