求无需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,提问作者황현후
相关产品推荐
相关产品推荐

