【问题标题】:Python - Kivy how to integrate OpenCV?Python - Kivy 如何集成 OpenCV?
【发布时间】:2021-10-12 09:01:53
【问题描述】:

我对opencv和kivy的组合有问题! 我有一些代码可以将我连接到 python 中的 ip cam 并显示它的实时流。这段代码(没有 kivy)运行良好:

import cv2
import numpy as np
import urllib.request
from urllib.request import urlopen
import matplotlib.pylab as plt
from matplotlib import cm
from sympy.solvers import solve
from sympy import Symbol
from sympy import lambdify
from sympy import *
 
 
def connection(host='http://192.168.4.1:81/stream'):
    try:
        urllib.request.urlopen(host)
        return True
    except:
        return False
 
def startlivecamimage():
    if connection():
        stream = urlopen('http://192.168.4.1:81/stream') 
        bytes = b''
        while True: 
            try:
                bytes += stream.read(1024) 
                a = bytes.find(b'\xff\xd8') 
                b = bytes.find(b'\xff\xd9') 
                if a != -1 and b != -1: 
                    jpg = bytes[a:b+2] 
                    bytes = bytes[b+2:] 
                    getliveimage = cv2.imdecode(np.frombuffer(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
                    livestreamrotated1 = cv2.rotate(getliveimage, cv2.ROTATE_90_CLOCKWISE)
                    
                cv2.imshow('WeldCam LIVE', livestreamrotated1) 
 
            except Exception as e:
                continue
 
            keyPress = cv2.waitKey(1)
 
startlivecamimage()

但是当我想将相同的代码与 kivy 屏幕结合使用并按下按钮时,它不再起作用了:

from logging import info
import cv2
import numpy as np
import urllib.request
from urllib.request import urlopen
import os
import platform
import datetime
import time
import sys
import math
import matplotlib.pylab as plt
import threading
from matplotlib import cm
from numpy.core.fromnumeric import repeat
from numpy.core.numeric import False_
from sympy.solvers import solve
from sympy import Symbol
from sympy import lambdify
from sympy import *
from datetime import datetime
from colorama import init, Fore, Back, Style
import kivy
from kivy.app import App
from kivy.clock import Clock
from kivy.effects.dampedscroll import DampedScrollEffect
from kivy.effects.scroll import ScrollEffect
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.slider import Slider
from kivy.uix.image import Image
from kivy.graphics.texture import Texture
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.settings import SettingsWithSpinner, SettingItem
from kivy.clock import Clock, mainthread
from kivy.core.window import Window
from kivy.uix.scrollview import ScrollView
from kivy.effects.scroll import ScrollEffect
from kivy.lang import Builder
import json
 
INTERVAL = 0.01
 
kivy.require("2.0.0")
 
Builder.load_string("""
#:import Factory kivy.factory.Factory
 
<MyScreens>:
    Screen:
        name: 'mainmenuscreen'
        BoxLayout:
            spacing: 1
            orientation: "vertical"
 
            Button:
                text: 'Start IP Camera'
                on_release: 
                    app.ip_camera_schedule()
 
            Button:
                text: 'Quit'
                on_release: root.current = app.exit_software()
""")
 
class MyScreens(ScreenManager):
    pass
 
 
#Program is called "SchweißnahtlehreApp"
class SchweißnahtlehreApp(App):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
 
 
    def build(self):
        myscreenmanager = MyScreens()
        return myscreenmanager
 
    #function to check connection to IP Camera
    def connection(host='http://192.168.4.1:81/stream'):
        try:
            urllib.request.urlopen(host)
            return True
        except:
            return False
 
    def ip_camera_schedule(self):
        if SchweißnahtlehreApp.connection():
                Clock.schedule_interval(self.startipcamera, 0.5)
 
    def startipcamera(self, *args):
        stream = urlopen('http://192.168.4.1:81/stream') 
        bytes = b''
        try:
            print("trying...")
            bytes += stream.read(1024) 
            a = bytes.find(b'\xff\xd8') 
            b = bytes.find(b'\xff\xd9') 
            if a != -1 and b != -1:
                print("step 1 done")
                jpg = bytes[a:b+2] 
                print("step 2 done")
                bytes = bytes[b+2:] 
                print("step 3 done")
                getliveimage = cv2.imdecode(np.frombuffer(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
                print("step 4 done")
                livestreamrotated1 = cv2.rotate(getliveimage, cv2.ROTATE_90_CLOCKWISE)
                cv2.imshow('frame', livestreamrotated1)
        except Exception as e:
            print("this did not work")
        keyPress = cv2.waitKey(1)
    
    def exit_software(self):
       App.get_running_app().stop()
        
if __name__ == '__main__':
    SchweißnahtlehreApp().run()

(请不要介意所有的导入,我稍后会在我的程序中使用它们并且不想删除它们)

问题出在哪里? 我想在这一点上添加:

  • 我真的不知道这些行的作用:
a = bytes.find(b'\xff\xd8') 
b = bytes.find(b'\xff\xd9') 
if a != -1 and b != -1:

当我将“-1”更改为“0”时,它会一直工作到“第 3 步完成”,然后出现异常。 所以它在“cv2.imdecode..”行崩溃。 没有 kivy 的代码使用 a/b != -1 AND 0。

带有 Kivy 和 a/b != 0 的代码立即崩溃

  • 如果我使用 USB-cam 而不是 IP-cam,Kivy 集成工作得非常好: 这就是为什么我认为这不是一般的“kivy+opencv”问题的原因。如果我使用“cv2.VideoCapture(0)”和我的 USB 摄像头,集成效果很好!但我需要 IP 摄像头流的代码...

提前感谢您的帮助!!

【问题讨论】:

  • 您的流“解析”一团糟。没有理由你应该在流中“找到”任何标记......也许一次,但不是多次。流上的 read() 可能会返回比预期更少的字节,因为这就是所有到达的内容。你绝对必须检查并处理。这是否为您提供更多或更少的数据取决于时间timing 肯定会受到影响,因为您使用 waitKey() AND kivy。阅读 kivy 教程,了解如何使用 kivy 本身显示图像。要么使用 OpenCV 的 imshow+waitkey,要么使用 kivy,但你不应该混合使用。
  • 哦,不要重复打开流。那只是浪费。我希望 Web 服务器向您发送 MJPEG 或一些 multipart/x-mixed-replace。根本不要自己这样做。使用从服务器读取并为您提供一堆图片的 API。
  • 感谢您的回答!最后,我不会使用 imshow 和 waitkey,而是将 OpenCV 集成为 kivy 图像……但我需要先从 IP cam 获取 OpenCV 图像……这就是此时的问题。如果没有要转换的图像,我无法将其转换为 kivy 图像...
  • 我完全错过了你说的:“我真的不知道这些线是做什么的”这就是整个问题......实际上问题是你似乎无法弄清楚它们在做什么 并且您只是随意更改它们,然后想知道为什么这些东西不起作用。我建议从这两个方面着手。

标签: python opencv camera kivy ip


【解决方案1】:

一个CSDNblog使用opencv和kivy展示照片。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2020-10-20
    • 2011-01-24
    • 1970-01-01
    • 2016-10-11
    • 2016-07-15
    • 1970-01-01
    相关资源
    最近更新 更多