You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求无需camera4kivy的Kivy手机摄像头流+OpenCV处理示例及配置

不依赖camera4kivy的Kivy+OpenCV手机摄像头处理实现

1. main.py 核心代码

以下代码实现摄像头捕获、OpenCV黑白转换处理,并将结果实时显示:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.camera import Camera
from kivy.uix.image import Image
from kivy.clock import Clock
from kivy.graphics.texture import Texture
import cv2
import numpy as np
import threading

class CameraProcessingApp(App):
    def build(self):
        self.layout = BoxLayout(orientation='vertical')
        
        # 初始化摄像头,设置分辨率
        self.camera = Camera(resolution=(640, 480), play=False)
        self.layout.add_widget(self.camera)
        
        # 用于展示处理后的视频帧
        self.processed_image = Image()
        self.layout.add_widget(self.processed_image)
        
        # 启动摄像头
        self.camera.play = True
        # 定时拉取帧(约30帧/秒)
        Clock.schedule_interval(self.update_frame, 1/30)
        return self.layout

    def update_frame(self, dt):
        frame_texture = self.camera.texture
        if not frame_texture:
            return
        
        # 将Kivy纹理转换为OpenCV可处理的numpy数组
        width, height = frame_texture.size
        frame_buffer = frame_texture.pixels
        frame_rgba = np.frombuffer(frame_buffer, dtype=np.uint8).reshape(height, width, 4)
        frame_rgb = frame_rgba[:, :, :3]  # 移除Alpha通道
        frame_bgr = cv2.cvtColor(frame_rgb, cv2.COLOR_RGB2BGR)  # 转换为OpenCV的BGR格式
        
        # 开启子线程处理帧,避免阻塞UI主线程
        threading.Thread(target=self.process_frame, args=(frame_bgr,)).start()

    def process_frame(self, frame):
        # 执行黑白转换处理
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 转换回Kivy支持的RGB格式
        gray_rgb = cv2.cvtColor(gray_frame, cv2.COLOR_GRAY2RGB)
        
        # 创建Kivy纹理
        texture = Texture.create(size=(gray_rgb.shape[1], gray_rgb.shape[0]), colorfmt='rgb')
        texture.blit_buffer(gray_rgb.tobytes(), colorfmt='rgb', bufferfmt='ubyte')
        
        # 在主线程更新UI(避免线程安全问题)
        Clock.schedule_once(lambda dt: setattr(self.processed_image, 'texture', texture))

if __name__ == '__main__':
    CameraProcessingApp().run()

2. buildozer.spec 关键配置

确保配置文件包含以下核心项,保证依赖和权限正确:

[app]
title = CameraCVApp
package.name = cameracvapp
package.domain = org.example
source.dir = .
source.include_exts = py,png,jpg,kv,atlas
version = 0.1

# 依赖声明
requirements = python3,kivy,opencv-python==4.5.5.62,numpy

# Android平台配置
android.api = 31
android.ndk = 25b
android.sdk = 24
# 摄像头及存储权限
android.permissions = CAMERA,WRITE_EXTERNAL_STORAGE,READ_EXTERNAL_STORAGE
# 支持的CPU架构
android.arch = armeabi-v7a,arm64-v8a
android.buildtools = 30.0.3

# 界面设置
orientation = landscape
fullscreen = 0

注意事项

  • 首次运行buildozer android debug deploy run会自动下载依赖,需保证网络稳定
  • 若遇到OpenCV编译失败,可尝试指定更低版本的opencv-python
  • 手机端需手动开启应用的摄像头权限
  • 帧处理必须放在子线程,否则会导致UI卡顿

内容的提问来源于stack exchange,提问作者황현후

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:10:26