রাস্পবেরি পাই ক্যামেরা মডিউলটি ব্যবহার করে অল্প সময়ের মধ্যে চিত্রগুলি নিন


13

আমি এমন একটি প্রকল্পে কাজ করছি যেখানে আমার রাস্পবেরি পাই ক্যামেরা মডিউলটি ব্যবহার করে প্রতি সেকেন্ডে প্রায় 30 টি চিত্র (কোনও সিনেমা নয়) নেওয়া দরকার।

আমি তার জন্য পিকামেরা লাইব্রেরি ( http://picamera.readthedocs.org/en/latest/api.html ) ব্যবহার করছি তবে সমস্যাটি হ'ল, ছবি তুলতে প্রায় 0.2 - 0.4 সেকেন্ড লাগে যা দীর্ঘতর। আমি use_video_portসম্পত্তিটি ইতিমধ্যে সেট করে রেখেছি True, যা কিছুটা সহায়তা করেছিল, তবে সময়টি এখনও স্থায়ী নয়।

আপনারা কি জানেন যে পাইথন এবং রাস্পবেরি পাই ক্যামেরা মডিউলটি ব্যবহার করে অল্প সময়ের মধ্যে (প্রায় 0.025s) কীভাবে ছবি তুলবেন?

উত্তর:


18

পিকামেরার সাথে 0.025 সেকেন্ডে ছবি তোলার জন্য আপনার 80fps এর চেয়ে বড় বা সমান ফ্রেম-রেট দরকার। 80 টি বরং 40fps (যে 1 / 0.025 = 40 দেওয়া আছে) প্রয়োজন হওয়ার কারণটি হ'ল বর্তমানে এমন কিছু সমস্যা রয়েছে যার ফলে প্রতিটি অন্যান্য ফ্রেমটি মাল্টি-ইমেজ এনকোডারকে এড়িয়ে যেতে পারে ফলে কার্যকর ক্যাপচার হারটি ক্যামেরার ফ্রেমরেটের অর্ধেক হিসাবে বাতাসে আপ হয়ে যায়।

পাই এর ক্যামেরা মডিউলটি পরবর্তী ফার্মওয়্যারের ক্ষেত্রে 80fps সক্ষম (পিকামেরা ডক্সে ক্যামেরা মোডগুলি দেখুন ) তবে কেবলমাত্র একটি ভিজিএ রেজোলিউশনে (ফ্রেমেট্রেটস সহ উচ্চতর রেজোলিউশনের জন্য অনুরোধ> 30 এফপিএস) ভিজিএ থেকে অনুরোধিত রেজোলিউশনে উত্সাহিত করবে, তাই এটি এমন একটি সীমাবদ্ধতা আপনি এমনকি 40fps এও মুখোমুখি হবেন)। আপনি যে সমস্যার মুখোমুখি হবেন তা হ'ল এসডি কার্ডের গতি সীমাবদ্ধতা। অন্য কথায়, আপনার সম্ভবত কোনও নেটওয়ার্ক পোর্ট বা ইন-মেমরি স্ট্রিমের মতো দ্রুত কিছু ক্যাপচার করা দরকার (ধরে নিবেন যে সমস্ত চিত্র আপনার ক্যাপচার করতে হবে তা র‍্যামের সাথে মাপসই হবে)।

নিম্নলিখিত স্ক্রিপ্টটি আমাকে পাইরে ওভারক্লকিং সহ 900 মেগাহার্টজ সেট করে 38 ডলার (যেমন পিক প্রতি 0.025s এর উপরে) ক্যাপচার রেট দেয়:

import io
import time
import picamera

with picamera.PiCamera() as camera:
    # Set the camera's resolution to VGA @40fps and give it a couple
    # of seconds to measure exposure etc.
    camera.resolution = (640, 480)
    camera.framerate = 80
    time.sleep(2)
    # Set up 40 in-memory streams
    outputs = [io.BytesIO() for i in range(40)]
    start = time.time()
    camera.capture_sequence(outputs, 'jpeg', use_video_port=True)
    finish = time.time()
    # How fast were we?
    print('Captured 40 images at %.2ffps' % (40 / (finish - start)))

আপনি যদি প্রতিটি ফ্রেমের মধ্যে কিছু করতে চান তবে capture_sequenceআউটপুটগুলির তালিকার পরিবর্তে জেনারেটর ফাংশন সরবরাহ করেও এটি সম্ভব :

import io
import time
import picamera
#from PIL import Image

def outputs():
    stream = io.BytesIO()
    for i in range(40):
        # This returns the stream for the camera to capture to
        yield stream
        # Once the capture is complete, the loop continues here
        # (read up on generator functions in Python to understand
        # the yield statement). Here you could do some processing
        # on the image...
        #stream.seek(0)
        #img = Image.open(stream)
        # Finally, reset the stream for the next capture
        stream.seek(0)
        stream.truncate()

with picamera.PiCamera() as camera:
    camera.resolution = (640, 480)
    camera.framerate = 80
    time.sleep(2)
    start = time.time()
    camera.capture_sequence(outputs(), 'jpeg', use_video_port=True)
    finish = time.time()
    print('Captured 40 images at %.2ffps' % (40 / (finish - start)))

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

আপনি প্রক্রিয়াজাতকরণের জন্য আনডকোড হওয়া ক্যাপচারগুলিও দেখতে চাইতে পারেন (যা এনকোডিংয়ের ওভারহেডটি সরিয়ে জেপিইজিগুলি ডিকোডিং করে)। তবে, মনে রাখবেন যে পাই এর সিপিইউ ছোট (বিশেষত ভিডিওকোর জিপিইউয়ের সাথে তুলনা করা)। আপনি 40fps এ ক্যাপচার করতে সক্ষম হবেন, তবে উপরে উল্লিখিত সমস্ত কৌশলগুলি সহ আপনি 40fps এ এই ফ্রেমের কোনও গুরুতর প্রক্রিয়াকরণ করতে সক্ষম হবেন এমন কোনও উপায় নেই। এই হারে ফ্রেম প্রসেসিংয়ের একমাত্র বাস্তব উপায় হ'ল একটি দ্রুত কম্পিউটারে ফ্রেমগুলি দ্রুত মেশিনে প্রেরণ করা বা জিপিইউতে প্রক্রিয়াজাতকরণ করা।


আপনার দ্রুত জবাবের জন্য ধন্যবাদ! তবে আপনার প্রোগ্রামে আমি পৃথক ছবি প্রসেস করতে সক্ষম হব না যখন। ক্যাপচার_সেক্সেন্স চালায়, তাইনা? এই কাজ করতে একটি উপায় আছে কি? কারণ পরের টোকেন হওয়ার আগে আমার প্রতিটি পৃথক চিত্রের সাথে কাজ করা দরকার।
টিমো ডেন্ক

1
জেনারেটর ফাংশন সহ ফ্রেমের মধ্যে প্রক্রিয়াজাতকরণের একটি পদ্ধতি অন্তর্ভুক্ত করার জন্য উত্তরটি সংশোধন করে।
ডেভ জোনস

.capture_sequence কীবোর্ডআইন্টারপ্রাটগুলি উপেক্ষা করে appears আপনি কি এই সম্পর্কে কাজ করতে জানেন?
সেরিন

@ কেরিন এই জাতীয় বিদ্যুতের ব্যবহার কী হবে?
টেড টেলর অফ লাইফ

Fps এই সমাধানের জন্য দ্রুত তবে স্ট্রিম থেকে ফাইলগুলিতে চিত্রগুলি কীভাবে সংরক্ষণ করবেন?
বাকালোলো

4

এই স্ট্যাকওভারফ্লো উত্তর অনুসারে আপনি যা চান তা সম্পাদন করতে আপনি জাস্ট্রিমার এবং নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

raspivid -n -t 1000000 -vf -b 2000000 -fps 25 -o - | gst-launch-1.0 fdsrc ! video/x-h264,framerate=25/1,stream-format=byte-stream ! decodebin ! videorate ! video/x-raw,framerate=10/1 ! videoconvert ! jpegenc ! multifilesink location=img_%04d.jpg

এই কমান্ডটি প্রতি সেকেন্ডে 25 ফ্রেম সহ একটি ভিডিও স্ট্রিম তৈরি করতে রসদযুক্ত ভিডিও আউটপুট নেবে এবং তারপরে ভিডিওটিকে স্বতন্ত্র জেপিইগ চিত্রগুলিতে রূপান্তর করতে gstreamer ব্যবহার করবে appears

এই নিবন্ধটি কীভাবে বিকল্প সংগ্রহস্থল থেকে gstreamer1.0 ইনস্টল করতে হয় তার নির্দেশাবলী দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.