PDA

View Full Version : حرفه ای: استخراج تصویر از بیش از یک capture device



barnamenevisforme
پنج شنبه 10 فروردین 1391, 13:47 عصر
با سلام خدمت همه دوستان،امیدوارم که تعطیلات خوش گذشته باشه
در مورد capture کردن عکس و یا فیلم از یک capture device را ه های مختلفی وجود داره:
1-استفاده از توابع یک dll به نام avicap32
2-استفاده از توابع direct show و directx
3-استفاده از توابه wia
هر کدوم از این روشها یه عیب دارن.مثلا وقتی از avicap32 استفاده میکنیم به درستی نمیتونیم از بین چند vedio source اون چیزی که مد نظرمونه رو انتخاب کنیم.
توی روش دوم مشکل حل شده ولی عیبش اینه که از filter استفاده میکنه و باید از پنجره های از پیش طراحی شده به صورت دستی VEDIO SOURCE و بقیه مشخصات رو انتخاب کنی.
توی WIA هم فقط به DEVICEهایی دسترسی داره که WIA ENABLED باشن مثل WEBCAM.
حالا سوال من اینه که اگه بخام از بین چند VEDIO SOURCE ،اون چیزی که مد نظرمه رو از طریق کد های خودم پیدا کنم و مورد بهره برداری قرار بدم باید چکار کنم؟
بیشتر تمرکزم رو AVICAP32 هستش چون کار کردن باهاش یه کم راحتتره.
پیشاپیش از همتون ممنونم.

barnamenevisforme
شنبه 19 فروردین 1391, 17:31 عصر
سلام
دوستان من همچنان منتظر پاسخ شما هستم.
ممنون

barnamenevisforme
یک شنبه 03 اردیبهشت 1391, 18:59 عصر
:متفکر:
همچنان بدون پاسخ

Saeed_m_Farid
سه شنبه 30 خرداد 1391, 10:53 صبح
سلام

حالا سوال من اینه که اگه بخام از بین چند VEDIO SOURCE ،اون چیزی که مد نظرمه رو از طریق کد های خودم پیدا کنم و مورد بهره برداری قرار بدم باید چکار کنم؟
بیشتر تمرکزم رو AVICAP32 هستش چون کار کردن باهاش یه کم راحتتره.
من با روش ارتباطی شما کاری ندارم، چون همونطور که میدونید بطور تقریباً مفصل اینجا (http://barnamenevis.org/showthread.php?346579) در موردش صحبت کردیم...
کاری که شما میخواین بکنید یه برنامه multithreaded هست و یا استفاده از کنترل هایی که بصورت پیش فرض این قابلیت رو تو خودشون تعبیه کردن مثل این :Opening and Handling Devices: Open Multiple Devices (http://www.imagingcontrol.com/en_US/library/dotnet/open-multiple-devices/)
روش دوم خوب راحته و همه کار رو خودش کرده ولی یک کنترل پولی هست و دردسرهای احتمالی در راه! پس اگه میخواید اون رو پیگیری کنید، به خودتون بستگی داره و من کاری ندارم! هدف تو این پست روش اول هست:
همونطورکه گفتم، شما نیاز به Thread هایی بعنوان Worker دارین که از ویدئو سورس شما بخونن و stream های حاصل رو در FileStream مربوط به خودشون ذخیره کنند؛ امیدوارم با برنامه نویسی Multi-thread آشنایی داشته باشید، اگه هم ندارید باید برای اینجور پروژه ها سراغش برید و یاد بگیرید، برای کسی که برنامه نویس سیستم هست ضروریه و با توجه به سطح معلوماتش کاری هم نداره.
با فرض اینکه یاد گرفتید:لبخند: شما حتماً با یکی از روش هایی که گفتین (یا حتی WMI) لیست Video Source رو دارید و میدونین در این لحظه عملیات Capture رو روی کدوم سورس میخواید اعمال کنید؛ کافیه برای اون یه Worker درست کنید و اون رو به یک نخ جدید انتساب بدین؛ میدونم خیلی تئوری شد ولی من کد شما رو نمی دونم که چی هست تا کمک بیشتری کنم، فقط می تونم pseudo براتون بذارم تا شما اون رو برای کاربرد خودتون سفارشی کنید (یا کدتون رو اینجا بذارین تا اگه تونستیم Multi-Devices اش کنیم!):
class Worker
{
bool _record;
ISource _source;
IDestination _dest;

public Worker(ISource source, IDestination dest)
{
_source = source;
_dest = dest;
}

public void Record()
{
lock(this)
_record = true;
pos = 0;
while(_record)
{
var buffer = new byte[4096];
len = _source.Read(pos, buffer);
pos += len;
dest.Write(buffer, len);
}
}

public void Stop()
{
lock (this)
_record = false;
}
}

class Program
{
public static Main()
{
var w1 = new Worker(new UsbVideo(), new FileDestination());
Thread.Start(w1.Record);

...

Console.Readline();
w1.Stop();
}
}


=====================
من یاد گرفتم که همیشه یه احتمال دیگه هم باید درنظر بگیرم که صورت مساله رو درست درک نکرده باشم! ممکنه منظور شما اصلاً کار همزمان با چند Device نباشه و کار تخصصی روی یکی از Device ها باشه؛ با اینکه تو اینجالت من درک نمیکنم مشکل تون کجاست، ولی فرض کنیم راهی برای رهایی از "پنجره های از پیش طراحی شده" میگردین و یا "اون چیزی که مد نظرمه رو از طریق کد های خودم پیدا کنم"!؟ رو به این صورت معنی کنیم که میخواین به تمام Feature های سورس تون دسترسی پیدا کنید و قابل تنظیم باشه و ...
در اینحالت من دیدن این مثال (جامع!) رو بهتون پیشنهاد میکنم:
#DirectShow: TV Fine-tuning using IKsPropertySet in C (http://www.codeproject.com/Articles/17419/DirectShow-TV-Fine-tuning-using-IKsPropertySet-in)

ضمناً اینجا (http://www.emgu.com/wiki/index.php/OpenCV) رو دیدین؟

Saeed_m_Farid
سه شنبه 30 خرداد 1391, 11:03 صبح
اااااه، اینجا که تالار VB.net هست! اونجا (http://barnamenevis.org/showthread.php?346579-%D9%86%D8%AD%D9%88%D9%87-%DB%8C-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A8%D8%A7-%D8%AF%D9%88%D8%B1%D8%A8%DB%8C%D9%86%D8%9F&p=1529263&viewfull=1#post1529263) نگفتین و من هم با فرض #C تمام کدها رو گذاشتم، امیدوارم واستون فرقی نکنه...

barnamenevisforme
سه شنبه 30 خرداد 1391, 17:38 عصر
سلام
ممنون از پاسخ کاملتون


امیدوارم با برنامه نویسی Multi-thread آشنایی داشته باشید، اگه هم ندارید باید برای اینجور پروژه ها سراغش برید و یاد بگیرید،
با برنامه نویسی Multi-thread یا همون چند نخی آشنایی دارم.


در اینحالت من دیدن این مثال (جامع!) رو بهتون پیشنهاد میکنم:
#DirectShow: TV Fine-tuning using IKsPropertySet in C (http://www.codeproject.com/Articles/17419/DirectShow-TV-Fine-tuning-using-IKsPropertySet-in)
فکر کنم این مثال نیازم رو برطرف میکنه.(چون با نگاهی کوتاه به برنامه و اضافه شدن item ها به منو معلومه که خصوصیات رو از طریق کد به دست میاره.
البته بعد از زدن دکمه start خطا داد ولی میتونم از کدنویسیش تو همون نمونه استفاده کنم.

اااااه، اینجا که تالار VB.net هست! اونجا (http://barnamenevis.org/showthread.php?346579-%D9%86%D8%AD%D9%88%D9%87-%DB%8C-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A8%D8%A7-%D8%AF%D9%88%D8%B1%D8%A8%DB%8C%D9%86%D8%9F&p=1529263&viewfull=1#post1529263) نگفتین و من هم با فرض #C تمام کدها رو گذاشتم، امیدوارم واستون فرقی نکنه...
قشنگی محیط dotnet در همینه،اگه دقت کرده باشید در همون مثالی هم که اونجا گذاشته بودم(از منبع codeproject capsample_src)از هر دو زبون استفاده کرده بود.
با c#مشکلی ندارم.

من یاد گرفتم که همیشه یه احتمال دیگه هم باید درنظر بگیرم که صورت مساله رو درست درک نکرده باشم! ممکنه منظور شما اصلاً کار همزمان با چند Device نباشه و کار تخصصی روی یکی از Device ها باشه؛
احسن بر شما،دقیقا همین طوره من یه برنامه دارم،یه ورودی از webcam ویه ورودی از capture device (که به دوربین آنالوگ وصله) داره.
موقعی که از avicap32 استفاده میکردم،فقط یکی رو میتونست detect کنه(یعنی اگه webcam رو میشناخت بعد،capture device اضافه میشد دیگه webcam...)
همچنین موقع استفاده از capture device اگه کاربر میرفت از tv اون استفاده میکرد،بعد از ورود به نرم افزار،tv capture میشد.