我想使用这里的官方示例代码在 Kivy 中使用我的相机:
https://github.com/kivy/kivy/blob/1.10.0/examples/camera/main.py
但是,当我从opencv-3.3.0|. If I compile
opencv-2.4.13.3` 使用 cv2.so 时,我只得到一个白屏,它可以工作。
有趣的是,在这两种情况下,相机似乎都已初始化(LED 打开),但使用 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)
解决了这个问题。 这当然不是一个完整的解决方案,可能代码中的其他地方也应该改变。
希望这也适用于你
上述“解决方案”均不适用于使用 python 2.7.14 和 opencv 3 的 Ubuntu 18.04(Beta 版)。
网络摄像头正在与奶酪等桌面应用程序配合使用。
我们,braintrainerplus.nl,真的需要网络摄像头工作,如果有人感兴趣,我们准备在这个问题上悬赏。
我想在显示之前对 opencv 返回的 numpy 数组数据进行预处理。 不幸的是,kivy 的相机抽象仅提供纹理二进制数据。
这个要点对于直接访问相机很有用:
仅供参考:opencv 2.4.13 适用于 Ubuntu 18.04 上的 kivy 1.10。
(不知道为什么我的第一次尝试失败了,但在再次编译后它起作用了)
可以确认@yoelk的“修复”在虚拟环境中使用 Python 3.6.5 和 OpenCV 3.3.0 在 Arch Linux 上工作。
这看起来与https://github.com/kivy/kivy/issues/5146相同的问题
@yoelk我的第 121 行是
if self.fps <= 0:
self.fps = 1 / 30
我得到了白屏。 在尝试降级时,我无法使用 pip 或 conda 下载 opencv2
我可以确认网络摄像头经过内置 bison 和 usb logitech 测试,现在正在稳定的 kivy 1.10.1 上工作,并修复了@yoelk 。
系统:Ubuntu 18.04/Mint 19、openvc 3.2.0 和来自ppa:kivy-team/kivy 的kivy 1.10.1
我还必须注释掉除 kivy/core/camera/__init__.py 中的 opencv 之外的所有提供程序,以强制使用 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)。
然后将此值用于帧更新调度:
将此行更改为:
解决了这个问题。 这当然不是一个完整的解决方案,可能代码中的其他地方也应该改变。
希望这也适用于你