أريد استخدام الكاميرا الخاصة بي في Kivy باستخدام رمز المثال الرسمي من هنا:
https://github.com/kivy/kivy/blob/1.10.0/examples/camera/main.py
ومع ذلك ، لا أحصل إلا على شاشة بيضاء عند استخدام cv2.so من opencv-3.3.0|. If I compile
opencv-2.4.13.3` إنها تعمل.
من المثير للاهتمام أن نلاحظ أنه في كلتا الحالتين ، يبدو أن الكاميرا قد تم تهيئتها (تشغيل الصمام) ، ولكن مع opencv-2 يظهر الفيديو ، بينما تظل الشاشة بيضاء مع opencv-3.
لقد حاولت أيضًا باستخدام مثال أكثر بساطة أدناه:
import kivy
from kivy.app import App
from kivy.uix.camera import Camera
class MainApp(App):
def build(self):
return Camera(play=True, resolution=(640, 480))
if __name__== "__main__":
MainApp().run()
وأحصل على نفس النتيجة ، أي يعمل مع opencv-2.4.13.3
وليس مع opencv-3.3.0
.
لقد قمت بتنزيل كلا الإصدارين من https://github.com/opencv/opencv/releases.
وقد تم تجميع كلاهما باستخدام الأعلام الافتراضية (ببساطة cmake
ثم make -j4
).
أيضًا لكل من مثال OpenCV النقي أدناه يعمل.
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Display the resulting frame
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
لذلك يبدو حقًا وكأنه مشكلة في تكامله في Kivy.
أستطيع أن أؤكد المشكلة
لدي أيضًا شاشة بيضاء مع opencv 3.
لقد قمت بتصحيحه ورأيت أن الإطارات الواردة ليست فارغة ، لكنها لا تزال لا تظهر جيدًا على الشاشة
حلها. ابحث في الملف .../lib/python3.6/site-packages/kivy/core/camera/camera_opencv.py
السطر 121:
if self.fps <= 0:
self.fps = 1 / 30.
عندما تصل إلى هناك في وضع التصحيح ، ترى أن قيمة fps هي في الواقع 30 (وليس 1/30).
تُستخدم هذه القيمة بعد ذلك في جدولة تحديث الإطار:
self._update_ev = Clock.schedule_interval(self._update, self.fps)
تغيير هذا الخط ليكون:
self._update_ev = Clock.schedule_interval(self._update, 1/self.fps)
يحل المشكلة. إنه بالطبع ليس حلاً كاملاً ، وربما يجب تغيير أماكن أخرى في الكود أيضًا.
اتمنى ان يعمل هذا معك ايضا
لا تعمل أي من الحلول المذكورة أعلاه على Ubuntu 18.04 (إصدار بيتا) مع python 2.7.14 و opencv 3.
تعمل كاميرا الويب مع تطبيقات سطح المكتب مثل الجبن.
نحن ، braintrainerplus.nl ، نحتاج حقًا إلى عمل كاميرا الويب ومستعدون لتقديم مكافأة على هذه المشكلة إذا كان أي شخص مهتمًا بها.
كنت أرغب في المعالجة المسبقة لبيانات المصفوفة غير المعقدة التي أرجعها opencv ، قبل عرضها. لسوء الحظ ، لم يقدم تجريد كاميرا kivy سوى بيانات ثنائية للنسيج.
كان هذا الجوهر مفيدًا للوصول إلى الكاميرا مباشرة:
لمعلوماتك: يعمل opencv 2.4.13 مع kivy 1.10 على Ubuntu 18.04.
(لست متأكدًا من سبب فشل محاولتي الأولى ولكن بعد تجميع آخر نجح)
يمكن تأكيد أن "fix" yoelk يعمل على Arch Linux باستخدام Python 3.6.5 و OpenCV 3.3.0 داخل Virtual Env.
تبدو هذه نفس المشكلة مثل https://github.com/kivy/kivy/issues/5146
yoelk خطي 121 هو
if self.fps <= 0:
self.fps = 1 / 30
وأحصل على الشاشة البيضاء. لا يمكنني تنزيل opencv2 سواء باستخدام النقطة أو conda في محاولتي الرجوع إلى إصدار أقدم
أستطيع أن أؤكد أن كاميرا الويب ، التي تم اختبارها باستخدام bison-in و usb logitech ، تعمل الآن على kivy 1.10.1 الثابت مع الإصلاح من yoelk .
النظام: Ubuntu 18.04 / Mint 19 و openvc 3.2.0 و kivy 1.10.1 من ppa: kivy-team / kivy.
يجب أيضًا أن أعلق على جميع مقدمي الخدمة باستثناء opencv في kivy / core / camera / __ init__.py لفرض استخدام opencv لأن البقية تفشل وتعطي جميع أنواع الأخطاء الغريبة.
CurtlyCritchlow الإصلاح في السطر 152: self._update_ev = Clock.schedule_interval (self._update، 1 / self.fps)
التعليق الأكثر فائدة
حلها. ابحث في الملف
.../lib/python3.6/site-packages/kivy/core/camera/camera_opencv.py
السطر 121:
عندما تصل إلى هناك في وضع التصحيح ، ترى أن قيمة fps هي في الواقع 30 (وليس 1/30).
تُستخدم هذه القيمة بعد ذلك في جدولة تحديث الإطار:
تغيير هذا الخط ليكون:
يحل المشكلة. إنه بالطبع ليس حلاً كاملاً ، وربما يجب تغيير أماكن أخرى في الكود أيضًا.
اتمنى ان يعمل هذا معك ايضا