Kivy: OpenCV3 上的白屏,但​​适用于 OpenCV2

创建于 2017-09-25  ·  10评论  ·  资料来源: kivy/kivy

版本

  • 蟒蛇:v2.7.12
  • 操作系统:Linux(Gentoo)
  • 基维:1.10.0
  • Kivy安装方法:pip install kivy==1.10.0

描述

我想使用这里的官方示例代码在 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 中的集成确实看起来有问题。

最有用的评论

解决了。 查看文件.../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)

解决了这个问题。 这当然不是一个完整的解决方案,可能代码中的其他地方也应该改变。
希望这也适用于你

所有10条评论

我可以确认问题

我也有一个带有 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 的相机抽象仅提供纹理二进制数据。

这个要点对于直接访问相机很有用:

https://gist.github.com/ExpandOcean/de261e66949009f44ad2

仅供参考: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

我还必须注释掉除 ki​​vy/core/camera/__init__.py 中的 opencv 之外的所有提供程序,以强制使用 opencv,因为其余提供程序失败并给出各种奇怪的错误。

@CurtlyCritchlow修复在第 152 行: self._update_ev = Clock.schedule_interval(self._update, 1/self.fps)

此页面是否有帮助?
0 / 5 - 0 等级