سؤال

أقوم بعمل برنامج في C# للاتصال بكاميرا ويب والقيام ببعض معالجة الصور معه. لدي تطبيق عمل يستخدم Win32 API (AVICAP32.DLL) للاتصال بكاميرا الويب وإرسال الرسائل إليه التي ترسلها إلى الحافظة. المشكلة هي أنه على الرغم من أن القراءة من الطلاء ، فإن قراءته من البرنامج يؤدي إلى مؤشرات خالية.

هذا هو الرمز الذي أستخدمه لتوصيل كاميرا الويب:

mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 1024, 0);

SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0);

وهذا ما أستخدمه لنسخ الصورة إلى الحافظة:

SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0);

SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0);
tempObj = Clipboard.GetDataObject();
tempImg = (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap);

هناك بعض الأخطاء التي قمت بإزالتها من الكود لجعلها أقصر.

شكرا مقدما :)

هل كانت مفيدة؟

المحلول

لقد بدأت مؤخرًا في القيام ببعض أعمال الهوايات في هذا المجال.

استقرنا على استخدام OpenCV مكتبة مع OpenCVdotnet غلاف. وهو يدعم التقاط الإطارات من كاميرا ويب:

using (var cv = new OpenCVDotNet.CVCapture(0))
{
    var image = cv.CreateCompatibleImage();
    // ...
    cv.Release();
}

وإذا كنت تقوم بمعالجة الصور ، فقد تم لف خوارزميات معالجة صور OpenCV داخل مجموعة OpenCVdotNet.Algs.

إذا قررت الذهاب إلى هذا المسار ، فتأكد من تثبيت OpenCV الإصدار 1.0 (وقمت بتثبيته على "C: Program Files OpenCV" إذا كنت على Vista 64-bit ، أو "MKLINK OPENCV 'C: Program Files (x86) opencv` "من الدليل الصحيح أو لن يتم تثبيت OpenCVdotNet بشكل آخر).

نصائح أخرى

هناك بالفعل طريقتان للحصول على بيانات الكاميرا في تطبيقك و DirectShow و WIA. توصي Microsoft باستخدامك وا, ، وواجهة WIA بسيطة إلى حد ما لالتفاف عقلك حولها. لقد قمت بإنشاء ونشرت مصدرًا مفتوحًا مكتبة سطح المكتب WIA بناءً على العمل الذي قمت به منذ فترة.

الآن مشكلة WIA في بعض الحالات هي أنها بسيطة للغاية. على سبيل المثال ، إذا كنت ترغب في ضبط خصائص الكاميرا (مثل معدل الإطارات ، الدقة ، إلخ) ، فإن WIA يسقط. قامت Microsoft بإهمال Directshow ، لكنها في الحقيقة لم تعطينا أي بديل له كل قدراتها ، وقد وجدت أنها تستمر في العمل بشكل جيد على جميع المنصات الحالية (إنها راسخة للغاية ، لذلك لا أستطيع أن أتخيل الدعم الذي يذهب بعيدًا في أي وقت قريبا).

هناك جيد جدا مكتبة DirectShow في SourceForge. "المشكلة" الوحيدة معها هي أنها معقدة حقًا وتنبع من حقيقة أن Dshow هو مجرد معقدة للغاية ومربكة في المقام الأول. هناك الكثير من الأشياء التي يمكن أن يقوم بها الغلاف والتي ليس من السهل ممارسة الرياضة ، لكنها توفر عينات للعديد من حالات الاستخدام الشائعة مثل عرض الفيديو أو التقاط إطار. إذا كنت ترغب في إضافة تراكبات ، أو إدراج مرشحات أخرى ، فيمكنها القيام بذلك ، ولكن يتم تحذيرها بأنها ليست واضحة على الإطلاق.

نلقي نظرة على هذه المادة:http://www.codeproject.com/kb/miscctrl/webcam_c_sharp.aspx

إنها طريقة أبسط من تثبيت واستخدام OpenCVnetWrapper.

هل جربت الحافظة. getImage ()؟ يمكنك أيضًا تجربة طرق الحافظة المختلفة. contains*() لمعرفة الشكل الذي يتم تخزين البيانات في الحافظة.

OpenCV Capture ، emgu capture وجميع مكتبات الالتقاط الأخرى التي جربتها
كلها لديها نفس المشكلة: لا يمكنك أن ترتفع من 640 × 480 برمجيًا
(دون فتح نافذة مصدر فيديو Windows).

أقترح استخدام هذا (الذي يعمل):
https://github.com/oftheo/videoinput

هذا ما طلب أيضًا في كيف تحصل على صور كاميرا الويب في C#؟ وقد تجد ما يلي مفيدًا (آسف على البريد العشوائي ، لكن هذا يساعد حقًا في الإجابة على السؤال):

لقد أصدرت للتو رمز sourceced الكامل لتطبيق Windows الخاص بي (مكتوب في .NET/C#). قم بتنزيل/عرض الرمز الكامل (مع أمثلة كاميرا الويب) على https://github.com/johanssonrobotics/camtimer

ترميز سعيد!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top